第二章 内核结构.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 内核结构

嵌入式系统 Embedded System 教师:白华 邮箱:baihua2000@ 电话办公室:4A-409 主要内容 μC/OS-II中的任务 任务代码、任务的状态、任务控制块、任务堆栈、任务优先级 任务的操作 任务的建立、任务的就绪、任务调度和切换、任务的删除 等 通过一个例程了解μC/OS-II的内核结构 2.1.1 任务的概念 任务是实现某种功能的代码段,通常是一个无限循环。 μC/OS-II的任务有两种:用户任务和系统任务。 用户任务:由应用程序设计者编写 系统任务:由系统提供 μC/OS-II定义了两个系统任务:空闲任务、统计任务 uC/OS-II 可以管理64个任务 必须给任务赋予不同的优先级。uC/OS-II 总是运行进入就绪的优先级最高的任务。 从存储结构看, μC/OS-II的任务由三个部分组成: 任务程序代码 任务堆栈(用来保存任务的工作环境) 任务控制块(记录了任务的各个属性)。 2.1.2 任务代码 2.1.3 任务控制块(OS_TCB) 任务控制块是一个数据结构。 当任务的CPU使用权被剥夺时,mC/OS-II用来保存该任务的状态。 当任务重新获得CPU的使用权时,任务块能够确保任务从当时被中断的那一点丝毫不差的继续执行。 当任务建立时,一个任务控制块OS_TCB就被赋值。 OS_TCB全部驻留在RAM中。 mC/OS-II在mC/OS-II.H中还定义了一个数据类型为OS_TCB*的数组OSTCBPrioTbl[ ],保存的控制块指针按任务优先级排序。 2.1.4 任务堆栈 任务堆栈的创建(每个任务都有自己的堆栈,用来保存任务的工作环境) OS_CPU.H中定义了一个数据类型OS_STK: typedef unsigned int OS_STK 在定义任务堆栈的栈区时,只要定义一个OS_STK类型的数组即可: #define TASK_STK_SIZE 512 OS_STK TaskStk[TASK_STK_SIZE]; 任务堆栈的初始化:OSTaskStkInit( ) 通常用户不会直接接触到这个函数,该函数由任务创建函数OSTaskCreate()来调用。 堆栈的增长方向随系统所使用的处理器不同而不同。 OS_CFG.H文件中定义了一个常数OS_STK_GROWTH 2.1.5 任务的优先级 mC/OS-II中,每个任务的优先级以0,1,2,……63来表示,数字越小,优先级越高。 用户可以设置需要任务的实际数目,OS_CFG.H中定义了一个常数OS_LOWEST_PRIO 系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。如果应用程序使用了统计任务,系统还会将OS_LOWEST_PRIO-1自动赋给统计任务。 任务优先级的确定,需要在任务创建函数OSTaskCreate()中指定。 每一个任务都有唯一的优先级别,优先级是任务在系统中的标识。 2.1.6 任务的状态 2.2.1 任务的创建 2.2.2 任务的就绪 可以用下面的代码把优先级别为prio的任务置为就绪状态: OSRdyGrp | = OSMapTbl[prio3]; OSRdyTbl[prio3] | = OSMapTbl[prio0x07]; 使用如下代码可以使一个优先级别为prio的任务脱离就绪状态: if((OSRdyTbl[prio3] = ~OSMapTbl[prio0x07]) == 0) OSRdyGrp = ~OSMapTbl[prio3]; 使用如下代码可以从任务就绪表中获取优先级别最高的就绪任务:? y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位 x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位 prio = (y3)+x; //优先级别? 或? y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y 3) + OSUnMapTbl[OSRdyTbl[y]]); 2.2.3 任务的调度和切换 2.2.4 任务的其他管理函数 堆栈检验:OSTaskStkChk() 确定任务实际需要的堆栈空间大小 删除任务:OSTaskDel() 任务休眠,任务代码并未删除,只是不再被调用 请求删除任务:OSTaskDelReq() 改变任务的优先级:OSTaskChange

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档