版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。 -- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com 在一些特殊的应用场合中,应用程序需要在某些情况下复位某些任务。例如:一些通信接口的守护任务,在该通信接口被重置时,该任务也需要回到起点重新开始运行。再比如,在干扰环境下运行的MCU系统中,某些任务可能会受干扰而紊乱,这时也需要对其进行复位而恢复其应有的功能。在玛雅系统中,内核提供了单独复位某个任务的机制。
由紧急任务0调用系统函数OSResetTask()可以对系统中除了紧急任务0之外的其它任务进行复位。函数OSResetTask()的入口参数的取值为任务控制块地址。对于紧急任务,可以调用系统函数OSGetEmTask()来获取其任务控制块的地址。复位任务的示例代码如下:
|
...
...
void main(void)
{
...
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
while(1)
{
...
OSResetTask(&Task1); //复位任务Task1
...
OSResetTask(OSGetEmTask(OS_EM_TASK2)); //复位紧急任务2
...
}
} (1) |
|
函数OSResetTask()只能由紧急任务0来调用,在其它的任务中调用该函数无效。在玛雅系统中,紧急任务0是一个特殊的任务,它不能被单独复位。
当一个任务被复位后,由该任务所属的内存块全部由内核收回,而由该任务锁定的互斥量全部被内核解锁。
任务在完成其使命之后,可以终止自身以释放被其所占用的资源。在玛雅系统中,任务的终止是通过调用系统函数OSExitTask()来完成的。紧急任务0之外的其它任务调用该函数都将结束任务自身,而紧急任务0调用该函数无效。
|
...
...
void Task(void)
{
...
...
while(1)
{
...
...
if(...) OSExitTask(NULL); //结束任务
}
} (2) |
|
函数OSExitTask()有1个入口参数,该参数的取值为某个信号量的地址。当任务被结束后,系统内核会向该信号量投放信号,以便将该任务结束的事件通知给其它的任务。如果不需向其它的任务发送通知信号,可对该参数赋予NULL值。
|
...
OS_SEM TaskSem = {0, 0};
...
void main(void)
{
...
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
while(1)
{
...
...
if(OSWaitSem(&TaskSem, 0) == OS_STATUS_OK)
{
... //获知任务结束,并加以善后处理
}
...
}
}
void Task(void)
{
...
while(1)
{
...
if(...)OSExitTask(&TaskSem) //结束任务,并发信号给其它的任务
...
}
} (3) |
|
|