μC/OS-Ⅱ是怎样处理临界段代码的;
什么是使命,怎样把用户的使命交给μC/OS-Ⅱ;
使命是怎样调度的;
使用程序CPU的利用率是多少,μC/OS-Ⅱ是怎样知道的;
怎样写中止服务子程序;
什么是时钟节拍,μC/OS-Ⅱ是怎样处理时钟节拍的;
μC/OS-Ⅱ是怎样初始化的,以及
怎样发动多使命;
本章还描绘以下函数,这些服务于使用程序:
OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),
OSInit(),
OSSTart(),
OSIntEnter() 和 OSIntExit(),
OSSchedLock() 和 OSSchedUnlock(), 以及
OSVersiON().
3.0 临界段(CriticalSections)
和其它内核相同,μC/OS-Ⅱ为了处理临界段代码需求关中止,处理完毕后再开中止。这使得μC/OS-Ⅱ能够防止一同有其它使命或中止服务进入临界段代码。关中止的时间是实时内核开发商应供给的最重要的目标之一,由于这个目标影响用户体系对实时事情的呼应性。μC/OS-Ⅱ努力使关中止时间降至最短,但就运用μC/OS-Ⅱ而言,关中止的时间很大程度上取决于微处理器的架构以及编译器所生成的代码质量。
微处理器一般都有关中止/开中止指令,用户运用的C言语编译器有必要有某种机制能够在C中直接完结关中止/开中止地操作。某些C编译器答应在用户的C源代码中刺进汇编言语的句子。这使得刺进微处理器指令来关中止/开中止很简略完结。而有的编译器把从C言语中关中止/开中止放在言语的扩展部分。μC/OS-Ⅱ界说两个宏(macros)来关中止和开中止,以便避开不同C编译器厂商挑选不同的方法来处理关中止和开中止。μC/OS-Ⅱ中的这两个宏调用分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。由于这两个宏的界说取决于所用的微处理器,故在文件OS_CPU.H中能够找到相应宏界说。每种微处理器都有自己的OS_CPU.H文件。
3.1 使命
一个使命通常是一个无限的循环[L3.1(2)],如程序清单3.1所示。一个使命看起来像其它C的函数相同,有函数回来类型,有形式参数变量,可是使命是绝不会回来的。故回来参数有必要界说成void[L3.1(1)]。
程序清单L3.1使命是一个无限循环
voidYourTask(void*pdata)(1)
{
for(;;){(2)
/* 用户代码 */
调用uC/OS-II的某种体系服务:
OSMboxPend();
OSQPend();
OSSemPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly();
OSTimeDlyHMSM();
/* 用户代码 */
}
}
不同的是,当使命完结今后,使命能够自我删去,如清单L3.2所示。留意使命代码并非真的删去了,μC/OS-Ⅱ仅仅简略地不再理睬这个使命了,这个使命的代码也不会再运转,假如使命调用了OSTaskDel(),这个使命绝不会回来什么。
程序清单 L3.2. 使命完结后自我删去
voidYourTask(void*pdata)
{
/* 用户代码 */
OSTaskDel(OS_PRIO_SELF);
}
形式参数变量[L3.1(1)]是由用户代码在第一次履行的时分带入的。请留意,该变量的类型是一个指向void的指针。这是为了答使用户使用程序传递任何类型的数据给使命。这个指针比如一辆全能的车子,假如需求的话,能够运载一个变量的地址,或一个结构,乃至是一个函数的地址。也能够树立许多相同的使命,一切使命都运用同一个函数(或许说是同一个使命代码程序),见第一章的例1。例如,用户能够将四个串行口安排成每个串行口都是一个独自的使命,而每个使命的代码实际上是相同的。并不需求将代码仿制四次,用户能够树立一个使命,向这个使命传入一个指向某数据结构的指针变量,这个数据结构界说串行口的参数(波特率、I/O口地址、中止向量号等)。
μC/OS-Ⅱ能够办理多达64个使命,但现在版别的μC/OS-Ⅱ有两个使命现已被体系占用了。作者保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个使命以被将来运用。OS_LOWEST_PRI0是作为界说的常数在OS_CFG.H文件顶用界说常数句子#defineconstant界说的。因而用户能够有多达56个使用使命。有必要给每个使命赋以不同的优先级,优先级能够从0到OS_LOWEST_PR10-2。优先级号越低,使命的优先级越高。μC/OS-Ⅱ总是运转进入安排妥当态的优先级最高的使命。现在版别的μC/OS-Ⅱ中,使命的优先级号便是使命编号(ID)。优先级号(或使命的ID号)也被一些内核服务函数调用,如改动优先级函数OSTaskChangePrio(),以及使命删去函数OSTaskDel()。
为了使μC/OS-Ⅱ能办理用户使命,用户有必要在树立一个使命的时分,将使命的开端地址与其它参数一同传给下面两个函数中的一个:OSTastCreat或OSTaskCreatExt()。
OSTaskCreateExt()是OSTaskCreate()的扩展,扩展了一些附加的功用。,这两个函数的解说见第四章,使命办理。
3.2 使命状况
图3.1是μC/OS-Ⅱ操控下的使命状况转换图。在任一给定的时间,使命的状况一定是在这五种状况之一。
睡觉态(DORMANT)指使命驻留在程序空间之中,还没有交给μC/OS-Ⅱ办理,(见程序清单L3.1或L3.2)。把使命交给μC/OS-Ⅱ是经过调用下述两个函数之一:
OSTaskCreate()或OSTaskCreateExt()。当使命一旦树立,这个使命就进入安排妥当态预备运转。使命的树立能够是在多使命运转开端之前,也能够是动态地被一个运转着的使命树立。假如一个使命是被另一个使命树立的,而这个使命的优先级高于树立它的那个使命,则这个刚刚树立的使命将当即得到CPU的操控权。一个使命能够经过调用OSTaskDel()回来到睡觉态,或经过调用该函数让另一个使命进入睡觉态。
调用OSStart()能够发动多使命。OSStart()函数运转进入安排妥当态的优先级最高的使命。安排妥当的使命只有当一切优先级高于这个使命的使命转为等候状况,或许是被删去了,才干进入运转态。