




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、班 级 学号 姓 名 同组人 实验日期 室温 大气压 成 绩 实验二 UCOS-II任务管理一、实验目的1、掌握UCOS-II中任务管理的函数的应用。2、掌握UCOS-II在STM32平台下对硬件的控制。3、掌握开发UCOS-II应用的程序结构。二、实验步骤1、UCOSII工作原理UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms100ms。本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。UCOSII的任何任务都是通过一个叫任务控制块(
2、TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。 在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。任务的调度其实就是CPU运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程 UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态是
3、:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。 睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。 运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行
4、中断服务程序,这时任务的状态叫做中断服务状态。UCOSII任务的5个状态转换关系如图所示: 与任务相关的几个函数:1)建立任务函数UCOSII提供了我们2个建立任务的函数:OSTaskCreat和OSTaskCreatExt,我们一般用OSTaskCreat函数来创建任务,该函数原型为:OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio) 该函数包括4个参数:task:是指向任务代码的指针;pdata:是任务开始执行时,传递给任务的参数的指针;ptos:是分配给任务的堆栈的栈顶指针;prio是分配给任务的优先级。
5、 每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。OSTaskCreatExt也可以用来创建任务。2)任务删除函数任务删除,就是把任务置于睡眠状态,并不是把任务代码给删除了。UCOSII提供的任务删除函数原型为:INT8U OSTaskDel(INT8U prio) 其中参数prio就是我们要删除的任务的优先级。故该函数是通过任务优先级来实现任务删除的。3)请求任务删除函数 必须确保被删除任务的资源被释放的前提下才能将其删除,所以我们通过向被删除任务发送删除请求,来实现任务释放自身占用资源后再删除。UCOSII提供
6、的请求删除任务函数原型为:INT8U OSTaskDelReq(INT8U prio)同样还是通过优先级来确定被请求删除任务。4)改变任务的优先级函数 UCOSII在建立任务时,会分配给任务一个优先级,但是这个优先级并不是一成不变的,而是可以通过调用UCOSII提供的函数修改。UCOSII提供的任务优先级修改函数原型为:INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio)。5)任务挂起函数任务挂起和任务删除有点类似,但是又有区别,任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录,并没有将任务控制块任务控制块链表里面删除,也不需要释放其资
7、源,而任务删除则必须先释放被删除任务的资源,并将被删除任务的任务控制块也给删了。被挂起的任务,在恢复(解挂)后可以继续运行。UCOSII提供的任务挂起函数原型为:INT8U OSTaskSuspend(INT8U prio) 6)任务恢复函数有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能够重新调度该函数。UCOSII提供的任务恢复函数原型为:INT8U OSTaskResume(INT8U prio)三、实验内容在UCOSII里面创建3个任务:开始任务、LED0任务和LED1任务,开始任务用于创建其他(LED0和LED1)任务,之后挂起;LED0任务用于控制DS0
8、的亮灭,DS0每秒钟亮80ms;LED1任务用于控制DS1的亮灭,DS1亮300ms,灭300ms,依次循环。所要用到的硬件资源如下:1)指示灯DS0 、DS1 的硬件电路图如图 其中PWR是系统电源指示灯,为蓝色。LED0和LED1分别接在PB5和PE5上。为了方便大家判断,我们选择了DS0为红色的LED,DS1为绿色的LED。2)软件参数设置 在os_cfg.h里面定义OS_TICKS_PER_SEC=200,也就是设置UCOSII的时钟节拍为5ms。OS_MAX_TASKS = 10,也就是最多10个任务(包括空闲任务和统计任务在内)。前面提到,我们需要在sys.h里面设置SYSTEM_
9、SUPPORT_UCOS为1,以支持UCOSII,通过这个设置,不仅可以实现利用delay_init来初始化SYSTICK,产生UCOSII的系统时钟节拍,还可以让delay_us和delay_ms函数在UCOSII下能够正常使用,这使得我们之前的代码可以十分方便的移植到UCOSII下。虽然UCOSII也提供了延时函数:OSTimeDly和OSTimeDLyHMSM,但是这两个函数的最少延时单位只能是1个UCOSII时钟节拍,在本次实验中,即5ms,显然不能实现us级的延时,而us级的延时在很多时候非常有用:比如IIC模拟时序,DS18B20等单总线器件操作等。而通过delay_us和dela
10、y_ms,则可以方便的提供us和ms的延时服务,这比UCOSII本身提供的延时函数更好用。在设置SYSTEM_SUPPORT_UCOS为1之后,UCOSII的时钟节拍由SYSTICK的中断服务函数提供,该部分代码如下:systick中断服务函数,使用ucos时用到void SysTick_Handler(void) OSIntEnter();/进入中断OSTimeTick(); /调用ucos的时钟服务程序OSIntExit(); /触发任务切换软中断 以上代码,其中OSIntEnter是进入中断服务函数,用来记录中断嵌套层数(OSIntNesting增加1);OSTimeTick是系统时钟节
11、拍服务函数,在每个时钟节拍了解每个任务的延时状态,使已经到达延时时限的非挂起任务进入就绪状态;OSIntExit是退出中断服务函数,该函数可能触发一次任务切换(当OSIntNesting=0&&调度器未上锁&&就绪表最高优先级任务!=被中断的任务优先级时),否则继续返回原来的任务执行代码(如果OSIntNesting不为0,则减1)。 事实上,任何中断服务函数,都应该加上OSIntEnter和OSIntExit函数,这是因为UCOSII是一个可剥夺型的内核,中断服务子程序运行之后,系统会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不一定接着运行被中
12、断的任务! 最后,打开test.c,输入如下代码: #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "includes.h" /UCOSII任务设/ /START 任务 /设置任务优先级 #define START_TASK_PRIO 10 /开始任务的优先级设置为最低 /设置任务堆栈大小 #define START_STK_SIZE 64 /任务堆栈 OS_STK START_TA
13、SK_STKSTART_STK_SIZE; /任务函数 void start_task(void *pdata); /LED0任务 /设置任务优先级 #define LED0_TASK_PRIO 7 /设置任务堆栈大小 #define LED0_STK_SIZE 64 /任务堆栈 OS_STK LED0_TASK_STKLED0_STK_SIZE; /任务函数 void led0_task(void *pdata); /LED1任务 /设置任务优先级 #define LED1_TASK_PRIO 6 /设置任务堆栈大小 #define LED1_STK_SIZE 64 /任务堆栈 OS_STK
14、 LED1_TASK_STKLED1_STK_SIZE; /任务函数 void led1_task(void *pdata); int main(void) Stm32_Clock_Init(9); /系统时钟设置 delay_init(72); /延时初始化 LED_Init(); LED_Init(); /初始化与LED连接的硬件接口 OSInit(); OSTaskCreate(start_task, (void *)0, (OS_STK *)&START_TASK_STKSTART_STK_SIZE-1, START_TASK_PRIO );/创建起始任务 OSStart();
15、 /开始任务 void start_task(void *pdata) OS_CPU_SR cpu_sr=0; pdata = pdata; OS_ENTER_CRITICAL(); /进入临界区(无法被中断打断) OSTaskCreate(led0_task, (void *)0, (OS_STK*)&LED0_TASK_STKLED0_STK_SIZE-1, LED0_TASK_PRIO); OSTaskCreate(led1_task, (void *)0, (OS_STK*)&LED1_TASK_STKLED1_STK_SIZE-1, LED1_TASK_PRIO);
16、OSTaskSuspend(START_TASK_PRIO); /挂起起始任务. OS_EXIT_CRITICAL(); /退出临界区(可以被中断打断) /LED0任务 void led0_task(void *pdata) while(1) LED0=0; delay_ms(80); LED0=1; delay_ms(920); ; /LED1任务 void led1_task(void *pdata) while(1) LED1=0; delay_ms(300); LED1=1; delay_ms(300); ; 该部分代码我们创建了3个任务:start_task、led0_task和le
17、d1_task,优先级分别是10、7和6,堆栈大小都是64(注意OS_STK为32位数据)。我们在main函数只创建了start_task一个任务,然后在start_task再创建另外两个任务,在创建之后将自身(start_task)挂起。这里,我们单独创建start_task,是为了提供一个单一任务,实现应用程序开始运行之前的准备工作。 在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段叫做临界段。因此,为了使临界段在运行时不受中断所打断,在临界段代码前必须用关中断指令使CPU屏蔽中断请求,而在临界段代码后必须用开中断指令解除屏蔽使得CPU可以响应中断请求。UCOSII提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL两个宏来实现,这两个宏需要在移植UCOSII的时候实现,采用OS_CRITICAL_METHOD为3来实现这两个宏。因为临界段代码不能被中断,将严重影响系统的实时性,所以临界段代码越短越好!在start_task任务中,我们在创建led0_task和led1_task的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全学院考试试题及答案
- 江苏社区考试试题及答案
- 工作招聘考试试题及答案
- 单招汽修专业考试试题及答案
- 湖南省艺考试试题及答案
- 教资语文考试试题及答案
- 湖北省宜城市枣阳一中等六校2022-2023学年高二下学期期中考试政治含答案
- 四川省南充阆中东风中学校2023-2024学年高二上学期第二次段考历史 无答案
- 急性脑梗死溶栓治疗
- 肺癌血管靶向治疗相关
- 四川省乐山市(2024年-2025年小学六年级语文)部编版期末考试((上下)学期)试卷及答案
- 2025届徐州市高考英语二模试卷含解析
- 《延续性护理在永久性肠造口患者中的应用研究》4600字(论文)
- 康复人才培养
- 建设工程消防验收现场评定工作报告(第三方机构模板)
- 正确认识孩子性格特
- 《智能建造技术与装备》 课件 第十章 智能施工与智慧工地
- 物业环境部培训课件
- 如何培训加油站站长
- 仓库管理制度及流程(3篇)
- 钢结构大棚安拆专项施工方案
评论
0/150
提交评论