1 临界段
uC/OS-II在处理临界段代码时,是需要关闭中断的,处理完毕之后再开中断,这使得uC/OS-II能够避免同时有其他任务或中断服务进入临界代码段。
uC/OS-II定义了两个宏(macros)来关中断和开中断,以便避开不同C编译器厂商使用不同的方法来处理关中断和开中断。uC/OS-II的这两个宏调用分别是:
OS_ENTER_CRITICAL();
OS_EXIT_CRITICAL();
两个宏顾名思义,即进入临界段,退出临界段。这两个宏的定义是取决于所用的微处理器,所以在OS_CPU.H中可以找到定义。
2 任务
首先,任务必须是一个无限循环的函数,所以它永远也不会退出的,所以它的返回值必须为空。如下为一个任务的函数结构
void YourTask (void *pdata) (1)
{
for (;;)
{ (2)
/* user code */
OSMboxPend();
OSQPend();
OSSemPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly();
OSTimeDlyHMSM();
/* user code */
}
}
OS开头的这些函数,都是uC/OS-II可以调用的服务。当然可以调用的服务远不止这些,在以后会慢慢来的。
为什么应用要是个死循环呢,因为我们在操作系统上跑程序,肯定不是希望程序跑一遍就结束了,所以要不断的重复跑任务,这个和前后台系统中的后台是一样的,都是死循环。那么如果我不希望这个任务工作,该如何处理?只需要把任务删除就好了,uC/OS-II系统也提供了删除函数:
OSTaskDel(OS_PRIO_SELF);
其中OS_PRIO_SELF就是你需要删除的任务的优先级。需要注意一点,任务被删除不代表它不存在了,只是不会被再执行而已了,它实际上是进入了任务五种状态之一的休眠态。休眠的任务可以通过调用以下函数被再次唤醒进入就绪态: