一沙一世界 一树一菩提
分类: LINUX
2016-01-06 15:32:26
2 task_init和task_activate
初始化和激活使其可以被系统调度。两者加起来的作用与task_create相同,没有activate的任务是不会被系统调度的。官方推荐使用task_create。
3 getpid,这个函数说下,这个函数返回调用这个函数的任务的任务ID,主要是注意下不是进程ID,尽管看起来很像。因为task_create新建任务描述返回值就不是进程ID,说的是系统分配的ID。这个函数不能在中断里使用,那样返回的任务ID无效。这个函数我认为和linux下的同名函数效果一样,返回值名字不同而已。
4 sched_setparam
#include
int sched_setparam(pid_t pid, const struct sched_param *param);
这个函数本来感觉不说了,仔细看了下,还是说下。感觉看到函数名字和函数的描述不太一致。官方说这个函数用于设置任务优先级,但是我怎么看都不止是优先级吧。没有试过,沿用官方描述。个人感觉最主要的可能是下面的描述:
NOTE: Setting a task's priority to the same value has the similar effect to sched_yield(): The task will be moved to after all other tasks with the same priority.
下卖弄我的描述可能错误,看到的人注意!!!
就是说,设置一个任务的优先级和原来相同,和调用sched_yield()相同,这样使用会把这个pid制定的任务放置到相同优先级任务的最后面,也就是说,你周期调用这个函数可能会把这个任务一直周期的往后排。
5 在说关于互斥的函数以前,先复习下nuttx的计数信号灯,和linux下兼容。使用方法相同,但是由于我们是运行ROS实时系统。所以这个轻量级的同步机制是最经常使用的方法。nuttx官网是这样说的: Semaphores are the basis for synchronization and mutual exclusion in NuttX。
下面是一段剪切自网上的关于信号灯的说明:
信号灯其实就是一个计数器,也是一个整数。每一次调用wait操作将会使semaphore值减一,而如果semaphore值已经为0,则wait操作将会阻塞。每一次调用post操作将会使semaphore值加一。将这些操作用到上面的问题中。工作线程每一次调用wait操作,如果此时链表中没有节点,则工作线程将会阻塞,直到链表中有节点。生产者线程在每次往链表中添加节点后调用post操作,信号灯值会加一。这样阻塞的工作线程就会停止阻塞,继续往下执行。
信号灯的类型为sem_t。在声明后必须调用sem_init()。需要传递两个参数,第一个参数就是你之前声明的sem_t变量,第二个必须为0。当你不再需要信号灯时,你必须调用sem_destroy()来释放资源。
等待信号灯的操作为sem_wait()。投递一个信号的操作为sem_wait()。和互斥量一样,等待信号灯也有一个非阻塞的操作,sem_trywait()。该操作在没有信号灯的时候返回EAGAIN。
对于同步和互斥,信号量是获得对资源的独占访问的首选机制。其实使用sched_lock() and sched_unlock()两个函数也具有相同功效。但是他们二者的副作用太大,也可以说这两个函数的权利太大了,不关你是什么优先级,到了这两个函数这,都得等。这样影响系统的响应时间。但是信号灯不会,信号灯是一个计数器,它可以允许几个任务执行,也可以认为稍微人性化一点。你的优先级高,或者正好赶上我这还有灯没有用完,那你就可以运行而不必等着。