μC/OS-Ⅱ学习笔记(2)--内核结构

http://tiandongying.blog.163.com/blog/static/16361282120108155533351/微笑

μC/OS-Ⅱ学习笔记(2)--内核结构  

2010-09-16 14:25:16|  分类: 操作系统 |  标签: |字号 订阅

读《uCOSⅡ中文教程.pdf》笔记

1、临界段。注意关中断的时间。微处理器一般都有关中断/开中断指令,用户使用的C 语言编译器必须有某种机制能够在C 中直接实现关中断/开中断地操作。某些C 编译器允许在用户的C 源代码中插入汇编语言的语句。这使得插入微处理器指令来关中断/开中断很容易实现。而有的编译器把从C 语言中关中断/开中断放在语言的扩展部分。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。OS_CPU.H。

2、任务是一个无限循环。任务可以自我删除。void YourTask (void *pdata)。形式参数变量是由用户代码在第一次执行的时候带入的,允许用户应用程序传递任何类型的数据给任务。μC/OS-Ⅱ可以管理多达64 个任务。为了使μC/OS-Ⅱ能管理用户任务,用户必须在建立一个任务的时候,将任务的起始地址与其它参数一起传给下面两个函数中的一个:OSTastCreat 或OSTaskCreatExt()。

3、任务状态

      A:OSTaskCreate()或OSTaskCreateExt()从睡眠状态唤醒;

      B:OSStart()使就绪态中优先级最高的程序开始运行;

      C:OSTimeDly()或OSTimeDlyHMSM()任务进入等待状态,等待一定时间;

      D:OSSemPend(),OSMboxPend(),或OSQPend()任务进入等待状态,等待事件发生;

      E:OSTaskIdle()所有任务都不运行时执行。

4、任务控制块OS_TCBs用来保存任务的状态,全部驻留在RAM 中。在件uCOS_II.H中。应用程序中可以有的最多任务数(OS_MAX_TASKS)是在文件OS_CFG.H 中定义的。这个最多任务数也是μC/OS-Ⅱ分配给用户程序的最多任务控制块OS_TCBs 的数目。将OS_MAX_TASKS 的数目设置为用户应用程序实际需要的任务数可以减小RAM 的需求量。控制块列表数组OSTCBTbl[]。

5、μC/OS-Ⅱ允许每个任务有自己的栈,尤为重要的是,每个任务的栈的容量可以是任意的。

6、就绪表。就绪表中有两个变量OSRedyGrp 和OSRdyTbl[]。当用户的应用程序中任务数目比较少时,减少OS_LOWEST_PR1O 的值可以降低μC/OS-Ⅱ对RAM(数据空间)的需求量。任何找到优先级最高的任务。

7、任务调度。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的。最后调用OS_TASK_SW()完成实际任务切换。OSTCBHighRdy。OSCtxSwCtr。OSCtxSw()。

8、给调度器上锁和开锁。当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,用户不希望高优先级的任务在邮箱、队列和信号量没有得到消息之前就取得了CPU 的控制权,此时,用户可以使用禁止调度器函数。函数OSSchedLock()和OSSchedUnlock()的使用要非常谨慎,因为它们影响μC/OS-Ⅱ对任务的正常管理。

9、空闲任务不停地给一个32 位的名叫OSIdleCtr 的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU 时间。

10、中断处理。为了允许中断嵌套,在多数情况下,用户应在开中断之前先清中断源。OSIntEnter()。OSIntExit()。用户中断服务中做的事要尽可能地少,要把大部分工作留给任务去做。中断服务子程序通知某任务去做事的手段是调用以下函数之一:OSMboxPost(),OSQPost(),OSQPostFront(),OSSemPost()。

11、中断任务切换和任务切换的区别:OSIntExit()看起来非常像OSSched()。但有三点不同。第一点,OSIntExit()使中断嵌套层数减1而调度函数OSSched()的调度条件是:中断嵌套层数计数器和锁定嵌套计数器(OSLockNesting)二者都必须是零。第二个不同点是,OSRdyTbl[]所需的检索值Y 是保存在全程变量OSIntExitY 中的。这是为了避免在任务栈中安排局部变量。这个变量在哪儿和中断任务切换函数OSIntCtxSw()有关。最后一点,如果需要做任务切换,OSIntExit()将调用OSIntCtxSw()。而不是调用OS_TASK_SW(),正像在OSSched()函数中那样。

12、用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。换句话说,在调用OSStart()之后做的第一件事是初始化定时器中断。OSTimtick()中量大的工作是给每个用户任务控制块OS_TCB 中的时间延时项OSTCBDly 减1。

13、初始化。OSInit()。

14、启动。多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务。

15、版本号OSVersion()。

 

你可能感兴趣的:(ucosii)