- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章1进程描述和状态控制
嵌入式系统操作系统 吴国伟 wgwdut@dlut.edu.cn 大连理工大学软件学院 第三章 任务管理 3.1.1 任务基本概念 从代码上看,uC/OS-II任务就是一个函数 uC/OS-II任务有两种:用户任务和系统任务 从任务的存储结构上看,uC/OS-II由三部分组成: 任务程序代码(函数):任务的执行部分 任务堆栈:用来保存任务的工作环境 任务控制块:记录任务的各个属性 3.1.2 任务的状态 uC/OS-II中任务有5中状态 睡眠状态:任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统管理时的情况叫做睡眠状态。即任务在没有被分配任务控制块或者被剥夺了任务控制块时的状态叫做睡眠状态。 就绪状态:如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件这时任务的状态叫做就绪状态 运行状态:处于就绪态的任务如果经调度器判断获得了CPU的使用权,进入运行状态。 等待状态:正在运行的任务需要等待一段时间或需要等待一个事件发生在运行时,该任务就把CPU的使用权让给其他任务,进入等待状态 中断服务状态:一个正在运行的任务一旦响应中断请求就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。 状态间的切换 3.1.3 用户任务代码一般结构 无限循环结构 void mytask(void *pdata) { for (;;) { 可以被中断的用户代码; OS_ENTER_CRITICAL();//进入临界段(关中断) 不可以被中断的用户代码; OS_EXIT_CRITICAL(); //退出临界段(开中断) 可以被中断的用户代码; } } OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是uC/OS-II定义的两个宏。分别封装了关中断代码和开中断代码 用户应用程序一般结构 void Mytask1(void *pdata) //定义用户任务1 { for(;;) {...... }} void Mytask2(void *pdata) //定义用户任务2 { for(;;) { ...... }} void main() { .... OSInit(); //初始化uc/os ... OSTaskCreate(Mytask1,......); //创建用户任务1 OSTaskCreate(Mytask2,....);//创建用户任务2 .... OSStart(); //启动uc/os } 3.1.4 系统任务 uC/OS-II预定义了两个系统任务:空闲任务和统计任务 空闲任务是每个应用程序必须使用的 统计任务是应用程序可以根据实际需求来选择使用的 1.空闲任务 任务在系统中可以有5种状态,即系统极有可能会在某个时间内无用户任务可运行而处于所谓空闲状态。 为了使CPU在没有用户任务可执行时有事可做,uC/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务。 代码如下: void OSTask(void*pdata) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata; //防止某些编译器报错 for(;;) { OS_ENTER_CRITICAL(); //关闭中断 OSdleCtr++; //计数 OS_EXIT_CRITICAL(); //开中断 } } 2.统计任务 该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便其他应用程序了解CPU的利用率。 是否使用统计任务,用户可以根据应用程序的实际需求来进行选择。 3.1.4 任务堆栈 为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都有自己的堆栈 所有uC/OS-II任务的控制块中都含有一个指向该任务堆栈的指针 任务堆栈的创建 为了定义任务堆栈的方便,在文件OS_CPU.H中专门定义了一个数据类型OS_STK: typedef unsigned int OS_STK; //该类型长度为16位 在定义任务堆栈的栈区时,只要定义一个OS_STK类型的数组即可。如: #define TASK_STK_SIZE 512 //定义堆栈长度(1024) OS_STK TaskStk[TASK_STK_SIZE] //定义数组作为任务堆栈 当调用OSTaskCreate()来创建一个任务时,把数组的指针传递给函数OSTaskCreate()中的
您可能关注的文档
- 第三单元金属复习.ppt
- 第三届“教学中的互联网搜索”优秀教案评比图片.ppt
- 第三次课无线网络.ppt
- 第三章 2原子吸收光谱法.ppt
- 第三章+重力勘探岩矿石密度重力仪.ppt
- 第三章1酸碱滴定法.ppt
- 第三章2009稳定判据1.ppt
- 第三章32计算机网络概述最后.ppt
- 第三章bayesian.ppt
- 第三章bayesianFinal.ppt
- 2025年陕西服装工程学院单招职业适应性考试题库必考题.docx
- 2025年日照航海工程职业学院单招职业倾向性考试题库最新.docx
- 2025年闽西职业技术学院单招职业适应性考试题库必考题.docx
- 2025年唐山海运职业学院单招综合素质考试题库推荐.docx
- 2025年天津城市职业学院单招职业适应性考试题库及参考答案.docx
- 2024年洒水车租赁协议细则范本版B版.docx
- 二零二五年度保密协议范本:禁止泄露地震预警信息协议.docx
- 2025年锡林郭勒职业学院单招综合素质考试题库完整.docx
- 2025年郑州工业应用技术学院单招综合素质考试题库及答案1套.docx
- 2025年西南财经大学天府学院单招职业倾向性测试题库带答案.docx
文档评论(0)