rtems:对任务的基本操作
9.3: 操作
%A
%A 任务管理器可以对任务进行下面的操作:
%A
%A • 创造任务
%A
%A • 获取任务身份证ID
%A
%A • 启动和重新开始任务
%A
%A • 暂停和继续执行任务
%A
%A • 将正在执行的任务延迟
%A
%A • 变更任务的优先级
%A
%A • 变更任务执行模式
%A
%A • 获取笔记本位置
%A
%A • 删除器任务
%A 9.3.1: 创造任务
%A
%A rtems_task_create 指令为任务分配任务控制块(TCB),为任务分配用户指定的名字,并且分派给它一个栈和浮点上下文存储区,为任务设定一个用户指定的初始优先级,设定一个用户指定的初始执行模式, 而且分配给它一个任务ID。 新创造的任务最初处于睡眠状态的状态。RTEMS总是调入优先级最高的任务进入处理机。
%A 9.3.2: 获得任务ID
%A
%A 创建任务时, RTEMS 产生一个全局唯一的任务ID,并且将该ID和该任务形成映射关系,任务的ID分配后是不能更改的。任务ID可以使用下面两种方法中的任意一种获得。 首先,任务的ID是rtems_task_create指令创建的,ID会存放在用户指定的区域中,可以在该区域中读取。此外,任务ID可以在创建后使用 rtems_task_ident 指令获取。任务的ID是任务的唯一标识,其他的任务管理指令通过操作ID来对任务进行操作。
%A 9.3.3: 任务的启动和重启
%A
%A 前面提到过,任务创建后进入睡眠状态,任务管理器使用rtems_task_start指令将处于睡眠状态的任务启动。这个任务管理机制使任务以他们的优先级为资本,竞争有限的处理器和其他硬件资源。其他的操作比如更改优先级,需要在任务开始前进行的,那么任务启动后这些 操作就变得无效了。
%A
%A 用户通过rtems_task_start指令告诉RTEMS任务的起始地址和参数。 参数是用来向任务传达一些起始信息。 在该指令中, RTEMS会根据任务的初始执行模态和启动地址初始化栈。
%A
%A rtems_task_restart 指令将一个任务重新开始执行,该任务的初始地址和它的最初优先级以及执行模态都和上次启动的时候相同,程序员可以向该任务传递不同的参数。新的参数可以区别这次启动的任务以前启动的任务。虽然重新启动的任务参数会和以前相同,但是新创建的任务的栈和任务控制块都会发生变化以表明这个任务是重新开始的。虽然任务上次请求的资源已经无效了,但是分派给任务的资源不自动被RTEMS回收。需要说明的是,如果没有调用过rtems_task_start,否则一个任务不能够被重新开始。( 也就是睡眠状态的任务不能够被重新开始)。所有的重新开始任务将处于准备状态,进入准备队列等待调度。
%A 9.3.4: 挂起和继续执行任务
%A
%A rtems_task_suspend 指令可以让调用者或者其他任务挂起。任务将保持挂起,直到调用rtems_task_resume让任务继续执行。这表明,当任务等候获得一个资源或因为时间片到,任务可能被中止或者阻塞。
%A
%A rtems_task_resume 指令用于解除任务的挂起状态。 如果任务没有被阻塞, 重新开始指令将会把任务的状态变为准备好的状态,它和其他任务竞争处理器资源。如果任务被阻塞连同中止,这指令清除挂起而且留下被阻塞的状态任务。
%A
%A 中止已经被中止的任务或重新开始一个不被中止的任务被考虑一个差错。 rtems_task_is_suspended 可能是用来决定如果一个任务现在被中止。
%A 9.3.5: 延迟正在运行的任务
%A
%A rtems_task_wake_after函数创建一个休眠定时器,从而允许任务延时。任务将被阻塞直到时间延迟到达,然后解除阻塞。如果任务调用rtems_task_wake_after 函数时,使用参数RTEMS_YIELD_PROCESSOR,那么任务将进入就绪队列,将处理器让给同等或者优先级更高的任务执行。
%A
%A rtems_task_wake_when 函数创建一个休眠定时器,让任务休眠,直到指定的时间才唤醒。
%A 9.3.6: 变更任务优先级
%A
%A rtems_task_set_priority 函数可以用来获取或者变更任务的优先级。 如果函数参数是RTEMS_CURRENT_PRIORITY,那么将获取任务当前的优先级。如果任务的优先级发生改变,那么任务将根据新的优先级参予调度。
%A
%A rtems_task_restart 函数将会将任务的优先级恢复到原始状态。
%A 9.3.7: 变更任务模式
%A
%A rtems_task_mode 函数可用来获取或者变更任务的执行模式。任务的执行模式包括是否允许抢占、时间片设定、ASR、中断等级等。rtems_task_restart 函数将使任务的模式回到初始状态。
%A 9.3.8: 记事本定位
%A
%A RTEMS 为每个任务提供了十六个笔记本。 每个记事本可以存放一个由四个位元组构成的笔记。 RTEMS 提供二个指令,rtems_task_set_note 和rtems_task_get_note, 这些指令准许用户存取笔记本中的数据并且改变笔记本位置,用户rtems_task_set_note指令在笔记本中存放制定的笔记。 rtems_task_get_note指令允许用户获取十六个笔记本中任意一个的信息。
%A 9.3.9: 任务删除
%A
%A RTEMS 提供 rtems_task_delete 指令让一个任务删除它自己或其他的任务。同时这个指令也将删除所有和该任务相关的引用,释放任务控制块,把它占用的栈资源移释放,并且把它从资源的等待队列中移除,此外,如果是浮点任务还会释放浮点运算任务上下文。任务的名字和标识也不再有效,对名字以及ID的引用也随之失效。事实上,RTEMS 可能为稍后产生其他任务复用任务ID。
%A 系统通常不会删除和与任务对应的未到期的延迟计时器 (也就是被 rtems_task_wake_after 和 rtems_task_wake_when用的计时器),同样其他为任务动态分配的资源也不会被自动释放(例如动态分配的内存等)。因此,删除一个任务之前,动态分派给它的全部资源应该是由用户释放。由于动态资源不能有效地释放,rtems_task_delete指令最好是由任务本身来执行。一个任务如果需要删除其他的任务可以通过消息传递、事件或信号等方式实现,或者通过让带特殊参数的重启指令实现删除。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。