第3章 内核结构.doc_第1页
第3章 内核结构.doc_第2页
第3章 内核结构.doc_第3页
第3章 内核结构.doc_第4页
第3章 内核结构.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I 第第 3 章章内核结构内核结构 1 3 0临界段临界段 Critical Sections 1 3 1任务任务 1 3 2任务状态任务状态 3 3 3任务控制块 任务控制块 Task Control Blocks OS TCBs 4 3 4就绪表 就绪表 Ready List 7 3 5任务调度 任务调度 Task Scheduling 10 3 6给调度器上锁和开锁给调度器上锁和开锁 Locking and UnLocking the Scheduler 11 3 7空闲任务空闲任务 Idle Task 12 3 8统计任务统计任务 13 3 9 C OS 中的中断处理中的中断处理 16 3 10时钟节拍时钟节拍 20 3 11 C OS 初始化初始化 23 3 12 C OS 的启动的启动 24 3 13获取当前获取当前 C OS 的版本号的版本号 27 3 1 第 3 章内核结构内核结构 本章给出本章给出 C OS C OS 的主要结构概貌 读者将学习以下一些内容 的主要结构概貌 读者将学习以下一些内容 C OS C OS 是怎样处理临界段代码的是怎样处理临界段代码的 什么是任务 怎样把用户的任务交给什么是任务 怎样把用户的任务交给 C OS C OS 任务是怎样调度的任务是怎样调度的 C OS C OS 是怎样知道应用程序是怎样知道应用程序 CPUCPU 的利用率的的利用率的 怎样写中断服务子程序怎样写中断服务子程序 什么是时钟节拍 什么是时钟节拍 C OS C OS 是怎样处理时钟节拍的是怎样处理时钟节拍的 C OS C OS 是怎样初始化的 是怎样初始化的 怎样启动多任务怎样启动多任务 本章还描述以下函数本章还描述以下函数 这些服务于应用程序 这些服务于应用程序 OS ENTER CRITICAL 和和 OS EXIT CRITICAL OSInit OSStart OSIntEnter 和和 OSIntExit OSSchedLock 和和 OSSchedUnlock 以及以及 OSVersion 3 0临界段临界段 Critical Critical Sections Sections C OS C OS 定义两个宏定义两个宏 macros macros 来关中断和开中断 来关中断和开中断 分别是 分别是 OS ENTER CRITICAL OS ENTER CRITICAL 和和 OS EXIT CRITICAL OS EXIT CRITICAL 在文件 在文件 OS CPU HOS CPU H 中 每种微处理器都有自己的中 每种微处理器都有自己的 OS CPU HOS CPU H 文件 文件 3 1任务任务 一个任务通常是一个无限的循环一个任务通常是一个无限的循环 L3 1 2 L3 1 2 如程序清单 如程序清单 3 13 1 所示 所示 程序清单程序清单 L3 1L3 1 任务是一个无限循环任务是一个无限循环 void YourTask void pdata 1 for 2 用户代码用户代码 调用调用uC OS II的某种系统服务的某种系统服务 OSMboxPend OSQPend OSSemPend OSTaskDel OS PRIO SELF OSTaskSuspend OS PRIO SELF OSTimeDly 3 2 OSTimeDlyHMSM 用户代码用户代码 当任务完成以后 任务可以自我删除 如清单当任务完成以后 任务可以自我删除 如清单 L3 2L3 2 所示 注意任务代码并非真的删除所示 注意任务代码并非真的删除 了 了 C OS C OS 只是简单地不再理会这个任务了 这个任务的代码也不会再运行 只是简单地不再理会这个任务了 这个任务的代码也不会再运行 程序清单程序清单 L 3 2 任务完成后自我删除任务完成后自我删除 void YourTask void pdata 用户代码用户代码 OSTaskDel OS PRIO SELF 3 2任务状态任务状态 睡眠态 睡眠态 DORMANTDORMANT 指任务驻留在程序空间之中 还没有交给 指任务驻留在程序空间之中 还没有交给 C OS C OS 管理 管理 就绪态 就绪态 当任务一旦建立 这个任务就进入就绪态准备运行 当任务一旦建立 这个任务就进入就绪态准备运行 运行态 运行态 调用调用 OSStart OSStart 可以启动多任务 可以启动多任务 等待状态等待状态 中断状态中断状态 图图 3 13 1 任务的状态任务的状态 3 3 3 3任务控制块 任务控制块 TaskTask ControlControl Blocks Blocks OSOS TCBs TCBs 一旦任务建立了 任务控制块一旦任务建立了 任务控制块 OSOS TCBs TCBs 将被赋值 程序清单将被赋值 程序清单 3 33 3 任务建立的时候 任务建立的时候 OSOS TCBs TCBs 就被初始化 就被初始化 程序清单程序清单 L 3 3 C OS II任务控制块任务控制块 typedef struct os tcb OS STK OSTCBStkPtr if OS TASK CREATE EXT EN void OSTCBExtPtr OS STK OSTCBStkBottom INT32U OSTCBStkSize INT16U OSTCBOpt INT16U OSTCBId endif struct os tcb OSTCBNext struct os tcb OSTCBPrev if OS Q EN endif if OS Q EN endif INT16U OSTCBDly INT8U OSTCBStat INT8U OSTCBPrio INT8U OSTCBX INT8U OSTCBY INT8U OSTCBBitX INT8U OSTCBBitY if OS TASK DEL EN BOOLEAN OSTCBDelReq endif OS TCB OSTCBX OSTCBX OSTCBY OSTCBY OSTCBBitX OSTCBBitX 和和 OSTCBBitY OSTCBBitY 用于加速任务进入就绪态的过程或进入等用于加速任务进入就绪态的过程或进入等 3 4 待事件发生状态的过程 避免在运行中去计算这些值 待事件发生状态的过程 避免在运行中去计算这些值 这些值是在任务建立时算好的 或 这些值是在任务建立时算好的 或 者是在改变任务优先级时算出的 这些值的算法见程序清单者是在改变任务优先级时算出的 这些值的算法见程序清单 L3 4L3 4 程序清单程序清单 L 3 4任务控制块任务控制块OS TCBOS TCB中几个成员的算法中几个成员的算法 OSTCBY priority 3 OSTCBBitY OSMapTbl priority 3 OSTCBX priority OSTCBBitX OSMapTbl priority 应用程序中可以有的最多任务数 应用程序中可以有的最多任务数 OS MAX TASKSOS MAX TASKS 是在文件 是在文件 OS CFG HOS CFG H 中定义的中定义的 这个 这个 最多任务数也是最多任务数也是 C OS C OS 分配给用户程序的最多任务控制块分配给用户程序的最多任务控制块 OS TCBsOS TCBs 的数目 在的数目 在 C OS C OS 初始化的时候 如图初始化的时候 如图 3 23 2 所示 所有任务控制块所示 所有任务控制块 OS TCBsOS TCBs 被链接成单向空任务链表 当被链接成单向空任务链表 当 任务一旦建立 空任务控制块指针任务一旦建立 空任务控制块指针 OSTCBFreeListOSTCBFreeList 指向的任务控制块便赋给了该任务 然指向的任务控制块便赋给了该任务 然 后后 OSTCBFreeListOSTCBFreeList 的值调整为指向下链表中下一个空的任务控制块 一旦任务被删除 任的值调整为指向下链表中下一个空的任务控制块 一旦任务被删除 任 务控制块就还给空任务链表 务控制块就还给空任务链表 图图 3 23 2 空任务列表空任务列表 3 4 就绪表 就绪表 ReadyReady ListList 每个任务的就绪态标志都放入就绪表中的 就绪表中有两个变量每个任务的就绪态标志都放入就绪表中的 就绪表中有两个变量 OSRdyGrpOSRdyGrp 和和 OSRdyTbl OSRdyTbl OSRdyGrpOSRdyGrp 和和 OSRdyTbl OSRdyTbl 之间的关系见图之间的关系见图 3 33 3 是按以下规则给出的 是按以下规则给出的 当当 OSRdyTbl 0 OSRdyTbl 0 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 0 0 位置位置 1 1 当当 OSRdyTbl 1 OSRdyTbl 1 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 1 1 位置位置 1 1 当当 OSRdyTbl 2 OSRdyTbl 2 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 2 2 位置位置 1 1 当当 OSRdyTbl 3 OSRdyTbl 3 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 3 3 位置位置 1 1 当当 OSRdyTbl 4 OSRdyTbl 4 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 4 4 位置位置 1 1 当当 OSRdyTbl 5 OSRdyTbl 5 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 5 5 位置位置 1 1 当当 OSRdyTbl 6 OSRdyTbl 6 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 6 6 位置位置 1 1 当当 OSRdyTbl 7 OSRdyTbl 7 中的任何一位是中的任何一位是 1 1 时 时 OSRdyGrpOSRdyGrp 的第的第 7 7 位置位置 1 1 3 5 图图 3 3 C OS 3 3 C OS 就绪表就绪表 程序清单程序清单 3 53 5 中的代码用于将任务放入就绪表 中的代码用于将任务放入就绪表 PrioPrio 是任务的优先级 是任务的优先级 程序清单程序清单 L3 5L3 5 使任务进入就绪态使任务进入就绪态 OSRdyGrp OSMapTbl prio 3 OSRdyTbl prio 3 OSMapTbl prio 表表 T3 1T3 1 OSMapTbl OSMapTbl 的值的值 IndexBit Mask Binary 0 00000001 1 00000010 2 00000100 3 00001000 4 00010000 5 00100000 6 01000000 7 10000000 3 6 如果一个任务被删除了 则用程序清单如果一个任务被删除了 则用程序清单 3 63 6 中的代码做求反处理 中的代码做求反处理 程序清单程序清单 L3 6L3 6 从就绪表中删除一个任务从就绪表中删除一个任务 if OSRdyTbl prio 3 为了找到那个进入就绪态的优先级最高的任务 并不需要从为了找到那个进入就绪态的优先级最高的任务 并不需要从 OSRdyTbl 0 OSRdyTbl 0 开始扫描整开始扫描整 个就绪任务表 只需要查另外一张表 即优先级判定表个就绪任务表 只需要查另外一张表 即优先级判定表 OSUnMapTbl 256 OSUnMapTbl 256 INT8UINT8U constconst OSUnMapTbl OSUnMapTbl 0 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x00 to 0 x0F 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x10 to 0 x1F 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x20 to 0 x2F 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x30 to 0 x3F 6 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x40 to 0 x4F 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x50 to 0 x5F 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x60 to 0 x6F 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x70 to 0 x7F 7 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x80 to 0 x8F 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 x90 to 0 x9F 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 xA0 to 0 xAF 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 xB0 to 0 xBF 6 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 xC0 to 0 xCF 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 xD0 to 0 xDF 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 xE0 to 0 xEF 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 0 xF0 to 0 xFF 程序清单程序清单 L3 7 找出进入就绪态的优先级最高的任务找出进入就绪态的优先级最高的任务 y OSUnMapTbl OSRdyGrp x OSUnMapTbl OSRdyTbl y prio y 3 x 例如 例如 如果如果 OSRdyGrpOSRdyGrp 的值为二进制的值为二进制 0110100001101000 查 查 OSUnMapTbl OSRdyGrp OSUnMapTbl OSRdyGrp 得到的值是得到的值是 3 3 如果如果 OSRdyTbl 3 OSRdyTbl 3 的值是二进制的值是二进制 11100100 11100100 则则 OSUnMapTbl OSRdyTbl 3 OSUnMapTbl OSRdyTbl 3 的值是的值是 2 2 优先级优先级 PrioPrio 就等于就等于 2626 3 8 23 8 2 3 7 3 5任务调度 任务调度 TaskTask SchedulingScheduling C OS C OS 总是运行进入就绪态任务中优先级最高的那一个 确定哪个任务优先级最高 总是运行进入就绪态任务中优先级最高的那一个 确定哪个任务优先级最高 下面该哪个任务运行了的工作是由调度器 下面该哪个任务运行了的工作是由调度器 SchedulerScheduler 完成的 任务级的调度是由函数 完成的 任务级的调度是由函数 OSSched OSSched 完成的 中断级的调度是由另一个函数完成的 中断级的调度是由另一个函数 OSIntExt OSIntExt 完成的 这个函数将在以后完成的 这个函数将在以后 描述 描述 OSSched OSSched 的代码如程序清单的代码如程序清单 L3 8L3 8 所示 所示 程序清单程序清单 L3 8L3 8 任务调度器 任务调度器 thethe TaskTask SchedulerScheduler void OSSched void INT8U y OS ENTER CRITICAL if OSLockNesting OSIntNesting 0 1 y OSUnMapTbl OSRdyGrp 2 OSPrioHighRdy INT8U y 0 OSLockNesting if OSLockNesting OSIntNesting 0 1 OS EXIT CRITICAL OSSched 2 else OS EXIT CRITICAL else OS EXIT CRITICAL 3 7空闲任务空闲任务 Idle Idle Task Task C OS C OS 总是建立一个空闲任务 在没有其它任务进入就绪态时投入运行总是建立一个空闲任务 在没有其它任务进入就绪态时投入运行 空闲任务 空闲任务 设为最低优先级 即设为最低优先级 即 OS LOWEST PRI0OS LOWEST PRI0 程序清单程序清单 L3 11L3 11 C OS C OS 的空闲任务的空闲任务 void OSTaskIdle void pdata pdata pdata for OS ENTER CRITICAL OSIdleCtr OS EXIT CRITICAL 3 8统计任务统计任务 提供运行时间统计的任务叫做提供运行时间统计的任务叫做 OSTaskStat OSTaskStat 如果用户将系统定义常数 如果用户将系统定义常数 OS TASK STAT ENOS TASK STAT EN 见文件 见文件 OS CFG HOS CFG H 设为 设为 1 1 这个任务就会建立 一旦得到了允许 这个任务就会建立 一旦得到了允许 OSTaskStat OSTaskStat 每秒钟运行一次 见文件每秒钟运行一次 见文件 OS CORE COS CORE C 计算当前的 计算当前的 CPUCPU 利用率 并放在有符利用率 并放在有符 号号 8 8 位整数位整数 OSCPUsageOSCPUsage 中 中 3 9 程序清单程序清单 L3 12L3 12 初始化统计任务初始化统计任务 void main void OSInit 初始化初始化uC OS II 1 安装安装uC OS II的任务切换向量的任务切换向量 创建用户起始任务创建用户起始任务 为了方便讨论 这里以为了方便讨论 这里以TaskStart 作为起始任务作为起始任务 2 OSStart 开始多任务调度开始多任务调度 3 void TaskStart void pdata 安装并启动安装并启动uC OS II的时钟节拍的时钟节拍 4 OSStatInit 初始化统计任务初始化统计任务 5 创建用户应用程序任务创建用户应用程序任务 for 这里是这里是TaskStart 的代码的代码 图图 F3 4F3 4 统计任务的初始化统计任务的初始化 3 10 程序清单程序清单 L3 13L3 13 统计任务的初始化统计任务的初始化 void OSStatInit void OSTimeDly 2 OS ENTER CRITICAL OSIdleCtr 0L OS EXIT CRITICAL OSTimeDly OS TICKS PER SEC OS ENTER CRITICAL OSIdleCtrMax OSIdleCtr OSStatRdy TRUE OS EXIT CRITICAL 程序清单程序清单 L3 14L3 14 统计任务统计任务 void OSTaskStat void pdata INT32U run INT8S usage pdata pdata while OSStatRdy FALSE 1 OSTimeDly 2 OS TICKS PER SEC for OS ENTER CRITICAL OSIdleCtrRun OSIdleCtr run OSIdleCtr OSIdleCtr 0L OS EXIT CRITICAL if OSIdleCtrMax 0L usage INT8S 100L 100L run OSIdleCtrMax 2 if usage 100 OSCPUUsage 100 else if usage 0 OSCPUUsage 0 else OSCPUUsage usage else OSCPUUsage 0 OSTaskStatHook 3 OSTimeDly OS TICKS PER SEC 3 11 3 9 C OS C OS 中的中断处理中的中断处理 C OS C OS 中 中断服务子程序要用汇编语言来写 中 中断服务子程序要用汇编语言来写 程序清单程序清单 L3 15L3 15 C OS II C OS II中的中断服务子程序中的中断服务子程序 用户中断服务子程序用户中断服务子程序 保存全部保存全部CPU寄存器寄存器 1 调用调用OSIntEnter或或OSIntNesting直接加直接加1 2 执行用户代码做中断服务执行用户代码做中断服务 3 调用调用OSIntExit 4 恢复所有恢复所有CPU寄存器 寄存器 5 执行中断返回指令 执行中断返回指令 6 图图 3 5 中断服务中断服务 进入中断函数进入中断函数 OSIntEnter 的代码如程序清单的代码如程序清单 L3 16 所示 所示 3 12 程序清单程序清单 L3 16 通知通知 C OS C OS 中断服务子程序开始了 中断服务子程序开始了 void OSIntEnter void OS ENTER CRITICAL OSIntNesting OS EXIT CRITICAL 程序清单程序清单 L3 17 通知通知 C OS C OS 脱离了中断服务 脱离了中断服务 void OSIntExit void OS ENTER CRITICAL 1 if OSIntNesting OSLockNesting 0 2 OSIntExitY OSUnMapTbl OSRdyGrp 3 OSPrioHighRdy INT8U OSIntExitY OSTCBPrio OS IDLE PRIO 3 OS ENTER CRITICAL if ptcb OSTCBDly 0 if ptcb OSTCBDly 0 if ptcb OSTCBStat 5 OSRdyTbl ptcb OSTCBY ptcb OSTCBBitX else ptcb OSTCBDly 1 ptcb ptcb OSTCBNext OS EXIT CRITICAL OS ENTER CRITICAL 6 OSTime 7 OS EXIT CRITICAL 如果用户不喜欢将中断服务程序写这么长 可以从任务级调用如果用户不喜欢将中断服务程序写这么长 可以从任务级调用 OSTimeTick OSTimeTick 如程序 如程序 清单清单 L3 22L3 22 所示 所示 程序清单程序清单 L3 22L3 22 时钟节拍任务时钟节拍任务 TickTask TickTask 作时钟节拍服务作时钟节拍服务 void TickTask void pdata pdata pdata for OSMboxPend 等待从时钟节拍中断服务程序发来的信号等待从时钟节拍中断服务程序发来的信号 OSTimeTick 用户需要先建立一个邮箱 初始化成用户需要先建立一个邮箱 初始化成 NULLNULL 用于发信号给上述任务告知时钟节拍中断 用于发信号给上述任务告知时钟节拍中断 已经发生了 程序清单已经发生了 程序清单 L3 23L3 23 3 15 程序清单程序清单L3 23L3 23时钟节拍中断服务函数时钟节拍中断服务函数OSTickISR OSTickISR 做节拍服务 做节拍服务 void OSTickISR void 保存处理器寄存器的值 保存处理器寄存器的值 调用调用OSIntEnter 或是将或是将OSIntNesting加加1 发送一个发送一个 空空 消息消息 例如 例如 void 1 到时钟节拍的邮箱到时钟节拍的邮箱 调用调用OSIntExit 恢复处理器寄存器的值恢复处理器寄存器的值 执行中断返回指令执行中断返回指令 3 11 C OS C OS 初始化初始化 OSIint OSIint 初始化初始化 C OS C OS 所有的变量和数据结构 见所有的变量和数据结构 见 OS CORE COS CORE C OSInit OSInit 建立空闲任务建立空闲任务 idleidle tasktask 这个任务总是处于就绪态的 空闲任务这个任务总是处于就绪态的 空闲任务 OSTaskIdleOSTaskIdle 的优先级总是设成最低 即 的优先级总是设成最低 即 OS LOWEST PRIOOS LOWEST PRIO 如果统计任务允许如果统计任务允许 OS TASK STAT ENOS TASK STAT EN 和任务建立扩展允许都设为和任务建立扩展允许都设为 1 1 则 则 OSInit OSInit 还得还得 建立统计任务建立统计任务 OSTaskStat OSTaskStat 并且让其进入就绪态 并且让其进入就绪态 OSTaskStatOSTaskStat 的优先级总是设为的优先级总是设为 OS LOWEST PRIO 1OS LOWEST PRIO 1 C OS C OS 还初始化了还初始化了 4 4 个空数据结构缓冲区 个空数据结构缓冲

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论