欢迎来到天天文库
浏览记录
ID:19980645
大小:21.50 KB
页数:4页
时间:2018-10-08
《ucos-ii基础原理讲解,任务创建及中断问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2013-6-26周三HaibaraAIUcos-II在移植过程中的特性,首先要理解所加入的实时操作系统是一个给予定时器节拍的系统。怎么理解这个问题呢,由该定时器产生脉冲来驱动不同的任务调度,且由于该系统是基于可剥夺内核类型,任务之间的切换时间间隔也由该定时器完成。不宜过大,否则会造成CPU利用率不高,不宜过小,否则会造成CPU在执行任务时非常被动,时间特别赶。就想人的心脏一样,动力是固定的,你非要去跑个100公里,心脏不加速你是会窒息而死的。我们正常心脏跳动是60次左右,同样,单片机也需要一个这样的相对宽松的节拍驱动。注:众所周知,脉冲本质上仍由晶振
2、提供(或实时时钟),原理都一样,再次请各位不要较真,就暂时以晶振为例。大家可以考虑一下,晶振的作用是否特别类似于人体的心脏呢?答案是很显然的。心脏跳动给人体提供输送血液和养料的压力,晶振的设计原理也正是源于此。他可以像人体心脏一样提供动力输送各个外设(相当于人体器官)所需要的能量。说这么多,就是要大家理解,人可以实时做出反应,因为人是有生命的,也就是他有反应、判断和处理能力,可以决定什么时间应该做什么。但是单片机是没有生命的,换句话说,他所谓的处理能力源于人们的代码和程序。那么,怎么让单片机像人一样拥有生命呢?答案很简单,给他指令,帮助他决定什么时间该
3、做什么,这也就是所谓的实时操作系统。不只是ucos,其他实时操作系统也是这个道理。下面我以代码为例,讲述一下ucos的工作流程,如有错误,还请各位前辈指点。首先任务是怎么样开始执行的?os_err=OSTaskCreateExt((void(*)(void*))App_TaskStart,*/1(void*)0,2(OS_STK*)&App_TaskStartStk[APP_TASK_START_STK_SIZE-1],3(INT8U)APP_TASK_START_PRIO,4(INT16U)APP_TASK_START_PRIO,5(OS_STK*)
4、&App_TaskStartStk[0],6(INT32U)APP_TASK_START_STK_SIZE,7(void*)0,8(INT16U)(OS_TASK_OPT_STK_CLR
5、OS_TASK_OPT_STK_CHK));9这个东西好像是非常复杂,但是实际上并不需要细究(当然非要细究也是允许的,只不过是C语言而已,看也不是看不懂,对于初学者而言并不推荐而已)。这块并不复杂,我就不再细究,如果还是不懂,就去度娘那问一下。(输入ucosii系统任务库函数解析)有必要说一下的是,上述App_TaskStartconstructionqualitya
6、cceptanceandassessmentRegulation(ProfessionalEdition)(DL/T5210.2-2009~DL/T5210.8-2009);1.9thequalitycheckoutandevaluationofelectricequipmentinstallationengineeringcode(DL/T5161.1-2002~5161.17-2002);1.10thenormsofconstructionsupervision,theelectricpowerconstructionsupervisionregu
7、lations是系统创建的第一个实质性任务,为什么这么说呢,可以说系统上电后直接跳转main函数体,但是真正起作用的是这句引导任务也就是App_TaskStart。如果说main是皇帝,App_TaskStart这孩子就是摄政王。App_TaskStart函数体下可以并行的创建任务。staticvoidApp_TaskStart(void*p_arg){INT8Uos_err;(void)p_arg;/***************Inithardware***************/这句不需要细究,用什么功能都要初始化相应外设,按照时钟------
8、-IO------外设级一级一级初始化GPIO_Configuration();OS_CPU_SysTickInit();//实际上就像裸机环境下的时钟配置,目前吧任务都交给了operatesystem也就是OS,肯定要把大权交给它USART1_Configuration();//这是我配置的系统中断外设级初始化NVIC_Configuration();//中断向量表配置#if(OS_TASK_STAT_EN>0)OSStatInit();/*DetermineCPUcapacity.*/#endifApp_TaskCreate();创建子务,不过嵌套
9、之后本质的任务还是OSTASKCreate()来创建就像我做的例子,下面四个LED闪灭任务。其
此文档下载收益归作者所有