



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2013-6-26 周三 Haibara AI Ucos-II在移植过程中的特性,首先要理解所加入的实时操作系统是一个给予定时器节拍的系统。怎么理解这个问题呢,由该定时器产生脉冲来驱动不同的任务调度,且由于该系统是基于可剥夺内核类型,任务之间的切换时间间隔也由该定时器完成。不宜过大,否则会造成CPU利用率不高,不宜过小,否则会造成CPU在执行任务时非常被动,时间特别赶。就想人的心脏一样,动力是固定的,你非要去跑个100公里,心脏不加速你是会窒息而死的。我们正常心脏跳动是60次左右,同样,单片机也需要一个这样的相对宽松的节拍驱动。注:众所周知,脉冲本质上仍由晶振提供(或实时时钟),原理都一样,再次请各位不要较真,就暂时以晶振为例。大家可以考虑一下,晶振的作用是否特别类似于人体的心脏呢?答案是很显然的。心脏跳动给人体提供输送血液和养料的压力,晶振的设计原理也正是源于此。他可以像人体心脏一样提供动力输送各个外设(相当于人体器官)所需要的能量。说这么多,就是要大家理解,人可以实时做出反应,因为人是有生命的,也就是他有反应、判断和处理能力,可以决定什么时间应该做什么。但是单片机是没有生命的,换句话说,他所谓的处理能力源于人们的代码和程序。那么,怎么让单片机像人一样拥有生命呢?答案很简单,给他指令,帮助他决定什么时间该做什么,这也就是所谓的实时操作系统。不只是ucos,其他实时操作系统也是这个道理。下面我以代码为例,讲述一下ucos的工作流程,如有错误,还请各位前辈指点。首先任务是怎么样开始执行的?os_err = OSTaskCreateExt(void (*)(void *) App_TaskStart, */1 (void * ) 0, 2 (OS_STK * )&App_TaskStartStkAPP_TASK_START_STK_SIZE - 1,3 (INT8U ) APP_TASK_START_PRIO,4 (INT16U ) APP_TASK_START_PRIO,5 (OS_STK * )&App_TaskStartStk0,6 (INT32U ) APP_TASK_START_STK_SIZE,7 (void * )0,8 (INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK);9这个东西好像是非常复杂,但是实际上并不需要细究(当然非要细究也是允许的,只不过是C语言而已,看也不是看不懂,对于初学者而言并不推荐而已)。这块并不复杂,我就不再细究,如果还是不懂,就去度娘那问一下。(输入ucosii系统任务库函数解析)有必要说一下的是,上述App_TaskStart是系统创建的第一个实质性任务,为什么这么说呢,可以说系统上电后直接跳转main函数体,但是真正起作用的是这句引导任务也就是App_TaskStart。如果说main是皇帝,App_TaskStart这孩子就是摄政王。App_TaskStart函数体下可以并行的创建任务。static void App_TaskStart (void *p_arg) INT8U os_err;(void)p_arg;/* Init hardware */这句不需要细究,用什么功能都要初始化相应外设,按照时钟-IO-外设级 一级一级初始化GPIO_Configuration(); OS_CPU_SysTickInit(); /实际上就像裸机环境下的时钟配置,目前吧任务都交给了operate system也就是OS,肯定要把大权交给它USART1_Configuration(); /这是我配置的系统中断外设级初始化NVIC_Configuration(); /中断向量表配置#if (OS_TASK_STAT_EN 0) OSStatInit(); /* Determine CPU capacity. */#endifApp_TaskCreate(); 创建子务,不过嵌套之后本质的任务还是OSTASKCreate()来创建就像我做的例子,下面四个LED闪灭任务。其实任务最后的创建都是这种,可以把他们封装起来,做成一个函数,这个学过C语言的应该都懂。 os_err = OSTaskCreate(void (*)(void *)LED1, (void * ) 0, (OS_STK * )&LED1STK128 - 1, (INT8U ) 5); os_err = OSTaskCreate(void (*)(void *)LED2, (void * ) 0, (OS_STK * )&LED2STK128 - 1, (INT8U ) 6); os_err = OSTaskCreate(void (*)(void *)LED3, (void * ) 0, (OS_STK * )&LED3STK128 - 1, (INT8U ) 7 ); os_err = OSTaskCreate(void (*)(void *)LED4, (void * ) 0, (OS_STK * )&LED4STK128 - 1, (INT8U ) 8 );for(;) OSTimeDlyHMSM(0, 1, 0, 0); /* Delay One minute */ 这块不再说了,重点讲一下中断。首先中断不是应该很简单么?IO功能配置-外设初始化-系统向量表配置完就等时间产生进中断了。没错,这个流程是非常正确的,然而,Ucos明显不是很给面子。因为ucos系统下对中断处理函数做了重新映射,因此即使触发中断进入USART1_IRQHandler,系统也不一定能成功运行,因为他们已经重新映射了OSView_RxTxISRHandler(); 因为USART1_IRQHandler毕竟还是可以进的,大家可以参考OSView_RxTxISRHandler()这个函数进行代码编写。关键在于CPU_CRITICAL_ENTER 告诉ucos我要开始进入中断服务程序CPU_SR cpu_sr; CPU_CRITICAL_ENTER(); /* Tell uC/OS-II that we are startin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论