Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1706101
  • 博文数量: 98
  • 博客积分: 667
  • 博客等级: 上士
  • 技术积分: 1631
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-27 15:59
个人简介

一沙一世界 一树一菩提

文章分类

全部博文(98)

文章存档

2021年(8)

2020年(16)

2019年(8)

2017年(1)

2016年(11)

2015年(17)

2014年(9)

2013年(4)

2012年(19)

2011年(1)

2009年(4)

分类: LINUX

2016-01-06 15:32:26

直入主题吧。
1    task_create,任务创建
#include int task_create(char *name, int priority, int stack_size, main_t entry, char * const argv[]);

这个函数新建一个任务,是由当前run状态的任务执行的。
参数很明确,除了entry其它不说了。
    这个函数新建一个制定优先级的任务,并且激活使其可以被系统调度。返回系统分配的ID。
entry参数有必要说下,这是新建任务的主体,就是为它才新建的任务。这个新任务的执行入口点就是这个entry。另外还得说下,参数列表是以字符串形式copy过来的,所以可以放心使用,不必担心生命周期的问题。
    新建的任务,和父亲任务没有调度方面的继承关系,它的优先级是指定的,调度方式是FIFO方式。当然在创建以后,可以更改。
但是,文件描述符是继承自父亲任务,这点和linux下很像,所以记得新建任务这活最好提前进行,别开了一堆资源才新建,那样管理不便。最小的三个描述符可以重定向以及其它操作。

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()两个函数也具有相同功效。但是他们二者的副作用太大,也可以说这两个函数的权利太大了,不关你是什么优先级,到了这两个函数这,都得等。这样影响系统的响应时间。但是信号灯不会,信号灯是一个计数器,它可以允许几个任务执行,也可以认为稍微人性化一点。你的优先级高,或者正好赶上我这还有灯没有用完,那你就可以运行而不必等着。
下面是几个涉及到的函数名字,具体就不说啦:
sched_lock
sched_unlock
sem_wait
sem_post
sem_trywait

6 nuttx的信号机制,在对于signal的处理上,我们把nuttx的任务看成是linux下的process,然后每个任务如同process那样可以有多个线程,当然也可以有一个。这样在对信号的处理上就和linux环境下的处理差不多了。

最后,再说说muttx的task和pthread:
   nuttx支持task和pthread,二者主要的区别就是task具有更多的独立性,更像一点linux下的进程。task会创建线程,这些被创建的属于task的线程共享所属的task的资源。这个task和它的子线程一起组成的这么一个东西,称之为task group,前面说task有点类似linux下的进程,其实这个task group更像。在这个task group中,主task可以认为是主线程,它创建的线程是这个主线程的子线程,他们一起共享一些资源,如环境变量,文件描述符,FILE流,socket,消息队列等。但是也仅仅是像,并不是。进程有独立的地址空间,但是nuttx只支持线程和task在同一个地址空间。




阅读(4711) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~