




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARMCortex-M3嵌入式控制技术
——基于STM32F103RCT6
嵌入式实时操作系统μC/OS-II第十一章
μC/OS-II任务管理
本章将介绍μC/OS-II任务管理相关的系统函数及其应用方法,并将深入剖析多任务的工程实例及其工作原理,然后,还将介绍统计任务的作用和系统定时器的创建方法。
本章的学习目标:
了解统计任务的用法;
熟悉μC/OS-II用户任务相关的系统函数;
掌握μC/OS-II用户任务的创建方法;
熟练应用库函数方法创建多任务工程。
1μC/OS-II用户任务2μC/OS-II多任务工程实例3
统计任务实例4系统定时器11.1μC/OS-II用户任务相对于系统任务而言,μC/OS-II应用程序中用户创建的任务,称为用户任务,每个用户任务都在周期性地执行着某项工作,或请求到事件后执行相应的功能。用户任务的特点如下:(1)用户任务对应的函数是一个带有无限循环体的函数,由于具有无限循环体,故该类函数没有返回值。(2)用户任务对应的函数具有一个“void*”类型的指针参数,该类型指针可以指向任何类型的数据,通过该指针在任务创建时向任务传递一些数据,这种传递只能发生一次,即创建任务的时候,一旦任务开始工作,就无法再通过函数参数向任务传递数据了。(3)每个用户任务具有唯一的优先级号,取值范围为0~OS_LOWEST_PRIO-3(OS_LOWEST_PRIO为os_cfg.h中宏定义的常量,最大值为254),一般地,系统的空闲任务优先级号为OS_LOWEST_PRIO,统计任务的优先级号为OS_LOWEST_PRIO-1,定时器任务的优先级号常设定为OS_LOWEST_PRIO-2。此外,需要为优先级继承优先级留出优先级号,所以,用户任务的优先级号一般为5~OS_LOWEST_PRIO-3。在基于STM32F103RCT6的工程中,OS_LOWEST_PRIO被宏定义为63(参考表10-2和程序段10-10的os_cfg.h文件),定时器任务的优先级号为61,因此,用户任务的优先级号的取值范围为5~60。(4)每个用户任务具有独立的堆栈,使用OS_STK类型定义堆栈,堆栈数组的大小一般要在50(即200字节)以上。函数原型功能INT8UOSTaskCreate(void(*task)(void*p_arg),
void*p_arg,OS_STK*ptos,INT8Uprio);创建一个任务。4个参数的含义依次为:用户任务对应的函数名、函数参数、任务堆栈、任务优先级。可以在启动多任务前创建任务,也可在一个已经运行的任务中创建新的任务,但不能在中断服务程序中创建任务。任务函数必须包含无限循环体,且必须调用OSMboxPend、OSFlagPend、OSMutexPend、OSQPend、OSSemPend、OSTimeDly、OSTimeDlyHMSM、OSTaskSuspend和OSTaskDel中的一个,用于实现任务调度。任务优先级不应取为0~4,并且不能取为OS_LOWEST_PRIO-1~OS_LOWEST_PRIOINT8UOSTaskCreateExt(void(*task)(void*p_arg),
void*p_arg,OS_STK*ptos,INT8Uprio,INT16Uid,OS_STK*pbos,
INT32Ustk_size,void*pext,INT16Uopt);与OSTaskCreate作用相同,用于创建一个任务。该函数的前4个参数与OSTaskCreate相同,增加了表示任务ID号、任务堆栈栈底、任务堆栈大小、用户定义的任务外部空间指针和任务创建选项等参数。如果要对任务的堆栈进行检查,必须使用该函数创建任务,且opt应设置为“OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR”,本书中实例全部使用该函数创建用户任务INT8UOSTaskDel(INT8Uprio);通过指定任务优先级或OS_PRIO_SELF删除一个任务或调用该函数的任务自己。被删除的任务进入休眠态,调用OSTaskCreate或OSTaskCreateExt可再次激活它(中断服务程序不能调用该函数)INT8UOSTaskDelReq(INT8Uprio);请求任务删除自己。一般用于删除占有资源的任务,假设该任务的优先级号为10,发出删除任务10请求的任务优先级号为5,则在任务5中调用OSTaskDelReg(10),任务10中会调用OSTaskDelReq(OS_PRIO_SELF),如果返回值为OS_TASK_DEL_REQ,则表明有来自其他任务的删除请求,任务10首先释放其占有的资源,然后调用OSTaskDel(OS_PRIO_SELF)删除自己(中断服务程序不能调用该函数)INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio);更改任务的优先级INT8UOSTaskSuspend(INT8Uprio);无条件挂起一个任务,参数指定为OS_PRIO_SELF时挂起任务自己。与OSTaskResume配对使用INT8UOSTaskResume(INT8Uprio);恢复(或就绪)一个被OSTaskSuspend挂起的任务,而且是唯一可恢复被OSTaskSuspend挂起任务的函数INT8UOSTaskQuery(INT8Uprio,OS_TCB*p_task_data);查询任务信息INT8UOSTaskStkChk(INT8Uprio,OS_STK_DATA*p_stk_data);检查任务堆栈信息,例如,栈未用空间和已用空间。该函数要求使用OSTaskCreateExt创建任务,且opt参数指定为OS_TASK_OPT_STK_CHKINT8UOSTaskNameGet(INT8Uprio,INT8U*pname,INT8U*perr);得到已命名任务的名称,为ASCII字符串,长度最大为OS_TASK_NAME_SIZE(包括结尾NULL空字符),常用于调试(中断服务程序不能调用该函数)。3个参数的含义为:任务优先级号、任务名、出错信息码voidOSTaskNameSet(INT8Uprio,INT8U*pname,INT8U*perr);为任务命名,名称为ASCII字符串,长度最大为OS_TASK_NAME_SIZE(包括结尾NULL空字符),常用于调试(中断服务程序不能调用该函数)。3个参数的含义为:任务优先级号、任务名、出错信息码µC/OS-II系统中有两个创建任务的函数,即OSTaskCreate和OSTaskCreateExt。任务本质上是具有无限循环体的函数。一般地,要创建一个任务,有以下步骤:(1)编写一个带有无限循环体的函数,由于具有无限循环体,故函数没有返回值。该函数具有一个void*类型的指针,该指针可以指向任何类型的数据,通过该指针在任务创建时向任务传递一些数据,这种传递只能发生一次,一旦任务开始工作,就无法通过函数参数向任务传递数据了。该函数的典型样式如程序段11-1所示。2)为要创建的任务指定优先级号,每个任务都有唯一的优先级号,取值范围从0至OS_LOWEST_PRIO-2(OS_LOWEST_PRIO为文件os_cfg.h中的宏定义常量,最大值为254),一般地,用户任务优先级从5至OS_LOWEST_PRIO-3。优先级号常用宏常量来定义,例如#defineTask01Prio5(3)为要创建的任务定义堆栈,必须使用OS_STK类型定义堆栈,例如OS_STKTask01Stk[200];(4)调用OSTaskCreate或OSTaskCreateExt函数创建任务。例如OSTaskCreate(Task01,(void*)0,&Task01Stk[199],Task01Prio);或OSTaskCreateExt(Task01,(void*)0,&Task01Stk[199],Task01Prio,1,&Task01Stk[0],200,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);经过上述四步,一个基于函数Task01的任务创建好了,在不造成混淆的情况下,一般该任务也称为Task01。在μC/OS-II中,用户任务共有五种状态11.2μC/OS-II多任务工程实例代码:代码:代码:代码:代码:代码:代码:将文件task02.c、task03.c、task04.c、task05.c和task06.c添加到工程管理器的“USER”分组下,建设好的工程PRJ28如图所示编译链接并运行工程PRJ28,将在LCD屏上显示如图所示结果,同时,LED灯D11每隔1秒闪烁一次。注:上图中编译结果“BuildOutput”中会有2个警告信息,这2个警告信息是由于μC/OS-II系统中的函数参数没有使用导致的,无需修改。工程PRJ28的文件目录结构如表所示序号子目录文件性质来源1USERmain.c、includes.h、vartypes.h、strfun.c、strfun.h、task01.c、task01.h、task02.c、task02.h、task03.c、task03.h、tasko4.c、task04.、task05.c、task05.h、task06.c、task06.h用户应用程序文件用户编写2BSPbeep.c、beep.h、bsp.c、bsp.h、ds18b20.c、ds18b20.h、exti.c、exti.h、key.c、key.h、lcd.c、lcd.h、led.c、led.h、rt.c、rt.h、textlib.h、tim2.c、tim2.h、uart2.c、uart2.h、zlg7289.c、zlg7289.h板级支持包文件用户编写3STM32F10x_FWLibstm32f10x_conf.h库函数配置文件4STM32F10x_FWLib\incmisc.h、stm32f10x_adc.h、stm32f10x_bkp.h、stm32f10x_can.h、stm32f10x_cec.h、stm32f10x_crc.h、stm32f10x_dac.h、stm32f10x_dbgmcu.h、stm32f10x_dma.h、stm32f10x_exti.h、stm32f10x_flash.h、stm32f10x_fsmc.h、stm32f10x_gpio.h、stm32f10x_i2c.h、stm32f10x_iwdg.h、stm32f10x_pwr.h、stm32f10x_rcc.h、stm32f10x_rtc.h、stm32f10x_sdio.h、stm32f10x_spi.h、stm32f10x_tim.h、stm32f10x_usart.h、stm32f10x_wwdg.h库函数文件5STM32F10x_FWLib\srcmisc.c、stm32f10x_adc.c、stm32f10x_bkp.c、stm32f10x_can.c、stm32f10x_cec.c、stm32f10x_crc.c、stm32f10x_dac.c、stm32f10x_dbgmcu.c、stm32f10x_dma.c、stm32f10x_exti.c、stm32f10x_flash.c、stm32f10x_fsmc.c、stm32f10x_gpio.c、stm32f10x_i2c.c、stm32f10x_iwdg.c、stm32f10x_pwr.c、stm32f10x_rcc.c、stm32f10x_rtc.c、stm32f10x_sdio.c、stm32f10x_spi.c、stm32f10x_tim.c、stm32f10x_usart.c、stm32f10x_wwdg.c库函数头文件6PRJMyPrj.uvprojx、MyPrj.uvoptx、MyPrj.uvguix.Administrator工程文件KeilMDK创建7PRJ\RTE其下有四个子目录RTOS、Device、_Target_1、_STM32F103RCT6运行环境组件头文件KeilMDK创建8PRJ\RTE\Device\STM32F103RCstartup_stm32f10x_hd.s、system_stm32f10x.c、RTE_Device.hCPU相关文件KeilMDK创建9PRJ\RTE\RTOSapp_cfg.h、os_cfg.hμC/OS-II配置文件KeilMDK创建10PRJ\ListingsMyPrj.map等列表文件KeilMDK创建11PRJ\ObjectsMyPrj.axf、MyPrj.hex等目标文件KeilMDK创建工程PRJ28文件结构如图所示工程PRJ28的文件目录结构如表所示任务ID号优先级号任务名堆栈大小(字)执行频率(Hz)15Task01200126Task022001/237Task03200148Task042001/259Task052001/4610Task062001/80xFFFD61定时器任务200100xFFFE62统计任务200100xFFFF63空闲任务200始终就绪任务ID号优先级号任务名堆栈大小(字)执行频率(Hz)工程PRJ28的执行流程如图所示11.3统计任务实例统计任务可用于统计微控制器的CPU使用率以及各个任务(包括它本身)的堆栈使用情况,下面的工程PRJ29介绍了统计任务的使用方法。代码:代码:工程PRJ29运行时在LCD屏上的显示结果如图所示:11.4系统定时器函数原型功能OS_TMR*OSTmrCreate(INT32Udly,INT32Uperiod,INT8Uopt,OS_TMR_CALLBACKcallback,void*callback_arg,INT8U*pname,INT8U*perr);创建一个定时器。定时器可以周期性连续运行,或仅运行一次,当定时计数减到0后,将执行回调函数(callback),callback函数可以向任务发送信号量,也可以执行其他功能,要求这个函数应尽可能地短小。必须调用OSTmrStart启动定时器。对于仅运行一次的定时器,调用OSTmrStart可再次启动它,调用OSTmrDel可删除它(可在回调函数中删除它)BOOLEANOSTrmStart(OS_TMR*ptmr,INT8U*perr);启动定时器减计数voidOSTmrStop(OS_TMR*ptmr,INT8Uopt,void*callback_arg,INT8U*perr);停止定时器减计数,停止定时器时可以调用回调函数或向回调函数传递新的参数。如果调用该函数时定时器已经停止了,则回调函数不会被调用INT32UOSTmrRemainGet(OS_TMR*ptmr,INT8U*perr);得到定时器的当前计数值(以时钟节拍为单位)INT8UOSTmrStateGet(OS_T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 影像科病理管理制度
- 心外科流程管理制度
- 快检室设备管理制度
- 总公司货运管理制度
- 总经理预约管理制度
- 慈善会培训管理制度
- 战略部部门管理制度
- 排放瓦斯油管理制度
- 接种证查验管理制度
- 收支结余率管理制度
- 战略性绩效管理体系设计实践课件
- 电脑的认识 完整版课件
- GB∕T 37201-2018 镍钴锰酸锂电化学性能测试 首次放电比容量及首次充放电效率测试方法
- DB62∕T 2997-2019 公路工程工地建设标准
- 2021年河南中考复习专项:中考材料作文(解析版)
- 运动控制系统课程设计-双闭环直流调速系统
- 提高学生课堂参与度研究的课题
- 中央司法警官学院招生政治考察表
- 原产地规则培训讲座课件
- GB_T 22627-2022水处理剂 聚氯化铝_(高清-最新版)
- 药品不良反应报告表范例
评论
0/150
提交评论