嵌入式系统及应用:嵌入式uCOS-II移植

上传人:努力****83 文档编号:192757904 上传时间:2023-03-07 格式:PPT 页数:14 大小:482KB
收藏 版权申诉 举报 下载
嵌入式系统及应用:嵌入式uCOS-II移植_第1页
第1页 / 共14页
嵌入式系统及应用:嵌入式uCOS-II移植_第2页
第2页 / 共14页
嵌入式系统及应用:嵌入式uCOS-II移植_第3页
第3页 / 共14页
资源描述:

《嵌入式系统及应用:嵌入式uCOS-II移植》由会员分享,可在线阅读,更多相关《嵌入式系统及应用:嵌入式uCOS-II移植(14页珍藏版)》请在装配图网上搜索。

1、1uC/OS-II概述q uC/OS-II在特定处理器上的移植工作绝大部分集中在多任务切换的实现上,因为这部分代码主要是用来保存和恢复处理器现场,许多操作如读写寄存器操作不能用C语言,只能使用特定的处理器的汇编语言来完成。q 将uC/OS-II移植到ARM处理器上,需要完成的工作非常简单,大部分的修改工作集中在三个和体系结构相关的文件中,代码量大约是500行。这三个文件是OS_CPU_C.c、OS_CPU_C.H以及OS_CPU_A.S。2 C/OSC/OS-II-II的文件结构的文件结构3OS_CPU.H的移植q 数据类型定义typedef unsigned char BOOLEAN;typ

2、edef unsigned char INT8U;/*Unsigned 8 bit quantity */typedef signed char INT8S;/*Signed 8 bit quantity */typedef unsigned int INT16U;/*Unsigned 16 bit quantity */typedef signed int INT16S;/*Signed 16 bit quantity */typedef unsigned long INT32U;/*Unsigned 32 bit quantity */typedef signed long INT32S;

3、/*Signed 32 bit quantity */typedef float FP32;/*Single precision floating point */typedef double FP64;/*Double precision floating point */*Define data types for backward compatibility.*/#define BYTE INT8S /*.to uC/OS V1.xx.Not actually needed for.*/#define UBYTE INT8U /*.uC/OS-II.*/#define WORD INT1

4、6S#define UWORD INT16U#define LONG INT32S#define ULONG INT32Uq 堆栈单位定义typedef unsigned int OS_STK;/*Each stack entry is 16-bit wide */4OS_CPU.H的移植q ARM处理器相关宏定义#defineOS_ENTER_CRITICAL()ARMDisableInt()#defineOS_EXIT_CRITICAL()ARMEnableInt()q 堆栈增长方向堆栈由高地址向低地址增长,这个也是和编译器有关的,当进行函数调用时,入口参数和返回地址一般都会保存在当前任务

5、的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向。#define OS_STK_GROWTH 15OS_CPU.c的移植q 任务堆栈初始化 该函数由OSTaskCreate()或OSTaskCreateExt()调用,用来初始化任务的堆栈并返回新的堆栈指针stk。初始状态的堆栈模拟发生一次中断后的堆栈结构。在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、lr、r12、r11、r10、r1、r0、CPSR、SPSR,下图说明了OSTaskStkInit()初始化后的也是新创建任务的堆栈内容。堆栈初始化工作结束后,OSTaskStkInit()返回新的堆栈栈顶指针,O

6、STaskCreate()或 OSTaskCreateExt()将指针保存在任务的OS_TCB中。6OS_CPU.c的移植q 系统HOOK函数:在这个文件里面还需要实现几个操作系统规定的hook函数,这些函数为用户定义函数,它将在相应的操作系统调用后执行由用户定义的这些hook函数,执行特定的用户操作,如果没有特殊需求,则只需要简单地将它们都实现为空函数就可以。这些函数包括:OSSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()7OS_CPU.c的移植q 中断级任务切换函数 该函数由OSI

7、ntExit()和OSExIntExit()调用。它是在时钟中断服务例程中发现有高优先级任务等待的时钟信号到来,则需要在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行。这样做的目的主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。该函数通过设置一个全局变量need_to_swap_context标志以表示在中断服务程序中进行任务切换,并在OSTickISR()中判断该变量以进行正确的动作。其函数如下:void OSIntCtxSw(void)need_to_swap_context=1;8OS_CPU.S的移植 时钟节拍中断服务函数q 时钟节拍是特定的周期性中断。

8、这个中断可以看作是系统心脏的脉动。q 时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,及当任务等待事件发生时,提供等待超时的依据。q 时钟节拍率越快,系统的额外开销就越大。中断之间的时间间隔取决于不同的应用,本系统使用S3C44B0的timer 0作为时钟节拍源,产生间隔10mS的时钟节拍。q OSTickISR()就是时钟节拍中断服务函数,也就是S3C44B0的timer 0的中断处理函数。9OS_CPU.S的移植 OSTickISRq OSTickISR()首先在被中断任务堆栈中保存CPU寄存器的值,然后调用OSIntEnter()。随后调用OSTimeTick(),检查所有处于

9、延时等待状态的任务,判断是否有延时结束就绪的任务。最后调用OSIntExit(),如果在中断中(或其他嵌套的中断)有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层。OSIntExit()将进行任务调度。q 如果进行了任务调度,OSIntExit()将不再返回调用者,而是用新任务的堆栈中的寄存器数值恢复CPU现场,然后实现任务切换。如果当前中断不是中断嵌套的最后一层,或中断中没有改变任务的就绪状态,OSIntExit()将返回调用者OSTickISR(),最后OSTickISR()返回被中断的任务。10OS_CPU.S的移植 OSTickISRq OSTickISR()先关闭中断,然后清

10、除timer 0中断标记。接着将调用IrqStart(),uC/OS-II要求在中断服务程序开头将记录中断嵌套层数的全局变量OSIntNesting加1。q 随后OSTickISR()调用OSTimeTick(),检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任务。q 然后调用IrqFinish()函数,IrqFinish()将调用OSIntExit()函数,如果在中断中(或其他嵌套的中断)有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,OSIntExit()将进行任务调度,并在OSIntCtxSw()函数中设置need_to_swap_context标记为1。q 接下来O

11、STickISR()判断need_to_swap_context标记是否为1,如果为1则进行任务调度,将不再返回被中断的任务,而是用新任务的堆栈中的寄存器数值恢复CPU现场,然后实现任务切换。如果当前中断不是中断嵌套的最后一层,或中断中没有改变任务的就绪状态,OSTickISR()将返回被中断的任务。11OS_CPU.S的移植 退出临界区和进入临界区函数q 进入临界区:关闭中断.GLOBALARMDisableIntARMDisableInt:STMDBsp!,r0MRSr0,CPSRORRr0,r0,#NoIntMSRCPSR_cxsf,r0LDMIAsp!,r0MOVpc,lrq 退出临界

12、区的时候恢复原来的中断状态.GLOBALARMEnableIntARMEnableInt:STMDBsp!,r0MRSr0,CPSRBICr0,r0,#NoIntMSRCPSR_cxsf,r0LDMIAsp!,r0MOVpc,lr12OS_CPU.S的移植 任务级上下文切换函数q OS_TASK_SW(),当任务因为被阻塞而主动请求cpu调度时被执行,由于此时的任务切换都是在非异常模式下进行的,因此区别于中断级别的任务切换。它的工作是先将当前任务的cpu现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的cpu现场,使之继续执行。这样就完成了一次任务切换。13OS_

13、CPU.S的移植 OSStartHighRdq OSStartHighRd()函数是在OSStart()多任务启动之后,从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将cpu现场恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占cpu。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行。.GLOBALOSStartHighRdyOSStartHighRdy:LDRr4,addr_OSTCBCur Get current task TCB addressLDRr5,addr_OSTCBHighRdy

14、 Get highest priority task TCB addressLDRr5,r5 get stack pointerLDRsp,r5 switch to the new stackSTRr5,r4 set new current task TCB addressLDMFDsp!,r4MSRSPSR_cxsf,r4LDMFDsp!,r4 get new state from top of the stackMSRCPSR_cxsf,r4 CPSR should be SVC32ModeLDMFDsp!,r0-r12,lr,pc start the new task14多任务应用程序的编写q C语言入口函数Main 调用函数ARMTargetInit初始化ARM处理器 调用OSInit进行操作系统初始化 调用OSTaskCreate函数两个任务:TaskLED和TaskSEG 调用ARMTargetStart函数启动时钟节拍中断 调用OSStart启动系统任务调度q 任务处理函数

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!