您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 一步步教你uCOS-II在STM32的移植
作者:四川师范大学成都学院屈召贵QQ:352474858/17/20101µC/OS-II的移植作者:四川师范大学成都学院屈召贵QQ:352474858/17/201027.1概述User目录Main.CMain.HIncludes.HOS_Cfg.HµC/OS-IISource目录OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.COS_TMR.CuCOS_II.HµC/OS-IIPorts目录CortexM3OS_CPU_C.COS_CPU_A.ASMOS_CPU.HBSP(板级支持包)Startup.STarget.CTarget.HARMCortex-M3目标板与处理器无关操作系统内核代码与处理器有关需要移植代码开发板相关代码作者:四川师范大学成都学院屈召贵QQ:352474858/17/20103内核文件移植的部分用户代码板级代码主程序作者:四川师范大学成都学院屈召贵QQ:352474858/17/20104ARMCortex-M3的寄存器模型LM3S系列单片机采用ARMCortex-M3内核;在移植之前,先简述可见寄存器模型。ARMCortex-M3总共有20个寄存器,每个都是32位宽度。R0-R12通用寄存器,可存储数据也可存放指针R13用于存放堆栈指针。实际上有两个堆栈指针SP_process(进程堆栈)和SP_main(主堆栈),但任何时候只有一个是可见的。在本移植中,SP_process用于任务代码(即线程模式),SP_main用于异常代码(即处理模式)。R14连接寄存器LR。在执行分支链接指令(BL)或带交换的分支链接指令(BLX)时,存储来自PC的返回地址;也用作异常的返回。R15程序计数寄存器PC。用于指示当前正被执行的指令。根据不同的指令,每执行一条,PC增加2或增加4。作者:四川师范大学成都学院屈召贵QQ:352474858/17/20105作者:四川师范大学成都学院屈召贵QQ:352474858/17/20106状态中断作者:四川师范大学成都学院屈召贵QQ:352474858/17/20107控制寄存器作者:四川师范大学成都学院屈召贵QQ:352474858/17/201087.1.1移植条件移植µC/OS-II到处理器上必须满足以下条件(1)处理器的C编译器能产生可重入代码µC/OS是多任务内核,函数可能会被多个任务调用,代码的重入性是保证完成多任务的基础。可重入代码指的是可被多个体任务同时调用,而不会破坏数据的一段代码,或者说代码具有在执行过程中打断后再次被调用的能力。举例说明:Swap1函数代码:Inttemp;voidswap1(int*x,int*y){temp=*x;*x=*y;*y=temp;}举例说明:Swap2函数代码:voidswap2(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}可重入不可重入编译器还得支持,MDK开发环境,可生成可重入代码作者:四川师范大学成都学院屈召贵QQ:352474858/17/20109(2)用C语言可打开和关闭中断ARM处理器核包含一个CPSR寄存器,该寄存器包括一个全局的中断禁止位,控制它便可打开和关闭中断。PRIMASK(3)处理器支持中断并且能产生定时中断µC/OS-II通过处理器产生的定时器中断来实现多任务之间的调度。ARMCortex-M3的处理器都支持中断并能产生定时器中断,专门有一个SysTick定时器来实现。(4)处理器支持能够容纳一定量数据的硬件堆栈(通常需要几十KByte字节)比如AT98C51处理器,内部只有128字节的RAM,要运行,需外扩RAM。CM3的芯片,内部可多达128KByte的容量,因此可直接使用。(5)处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈(或内存)的指令µC/OS-II进行任务调度时,会把当前任务的CPU寄存器存到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是µC/OS-II多任务调度的基础。运行TCP、UDP需要的内存会更大,通常要100K左右作者:四川师范大学成都学院屈召贵QQ:352474858/17/2010107.1.2移植步骤所谓移植,就是使一个实时操作系统能够在某个微处理器平台上或微控制器平台上运行。由µC/OS-II的文件系统可知,在移植过程中,用户需要关注的就是与处理器相关的代码。这部分包括一个头文件OS_CPU.H、一个汇编文件OS_CPU_A.ASM和一个C代码文件OS_CPU_C.C。OS_CPU.HOS_CPU_C.COS_CPU_A.ASM#define设置一个常量的值声明10个数据类型用#define声明三个宏用C语言编写六个简单的函数编写四个汇编语言函数移植实际中,写一个就行作者:四川师范大学成都学院屈召贵QQ:352474858/17/2010111、INCLUDES.HINCLUDES.H是一个头文件,它在所有.C文件的第一行被包含。#includeincludes.hINCLUDES.H使得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些头文件。使用INCLUDES.H的唯一缺点是它可能会包含一些实际不相关的头文件。这意味着每个文件的编译时间可能会增加。但由于它增强了代码的可移植性,所以我们还是决定使用这一方法。用户可以通过编辑INCLUDES.H来增加自己的头文件,但是用户的头文件必须添加在头文件列表的最后。2、基本配置和定义OS_CPU.H(1)用#define设置一个常量的值#ifdefOS_CPU_GLOBALS#defineOS_CPU_EXT#else#defineOS_CPU_EXTextern#endif作者:四川师范大学成都学院屈召贵QQ:352474858/17/201012(2)定义与编译器相关的数据类型为了保证可移植性,程序中没有直接使用C语言中的short、int和long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。程序中自己定义了一套数据类型,如INT16U表示16位无符号整型。对于ARM这样的32位内核,INT16U是unsignedshort型;如果是16位处理器,则是unsingedint型。typedefunsignedcharBOOLEAN;/*Boolean布尔变量*/typedefunsignedcharINT8U;/*无符号8位实体*/typedefsignedcharINT8S;/*有符号8位实体*/typedefunsignedshortINT16U;/*无符号16位实体*/typedefsignedshortINT16S;/*有符号16位实体*/typedefunsignedintINT32U;/*无符号32位实体*/typedefsignedintINT32S;/*有符号32位实体*/typedeffloatFP32/*单精度浮点数*/typedefdoubleFP64;/*双精度浮点数*/typedefunsignedintOS_STK;/*堆栈是32位宽度*/typedefunsignedintOS_CPU_SR;/*申明状态寄存器是32位*/µC/OS-II内核的代码需要与处理器位有关作者:四川师范大学成都学院屈召贵QQ:352474858/17/201013(3)定义临界段(允许和禁止中断宏)与所有实时内核一样,µC/OS-II需要先禁止中断,再访问代码的临界区,并且在访问完毕后,重新允计中断。这就是µC/OS-II能够保护临界段代码免受多任务或中断服务例程ISR的破坏。中断禁止时间是商业实时内核公司提供的重要指标之一,因为它将影响到用户的系统对实时事件的响应能力。虽然µC/OS-II尽量使中断禁止时间达到最短,但是µC/OS-II的中断禁止时间还主要依赖于处理器结构和编译器产生的代码的质量。通常每个处理器都会提供一定的指令来禁止/允许中断,因此用户的C编译器必须由一定的机制来直接从C中执行这些操作。OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()µC/OS-II定义了两个宏来禁止和允许中断:#defineOS_CRITICAL_METHOD3#defineOS_ENTER_CRITICAL(){cpu_sr=OS_CPU_SR_Save();}#defineOS_EXIT_CRITICAL(){OS_CPU_SR_Restore(cpu_sr);}OS_CPU_A.ASM中具体实现µC/OS-II定义了三种方法关闭和打开中断(OS_CRITICAL_METHED=1,2,3),通常情况下,我们都是选用的方法3。作者:四川师范大学成都学院屈召贵QQ:352474858/17/201014OS_CPU_SR_SaveMRSR0,PRIMASKCPSIDIBXLROS_CPU_SR_RestoreMSRPRIMASK,R0BXLR关中断开中断(4)定义栈的增长方向µC/OS-II使用结构常量OS_STK_GROWTH来指定堆栈的增长方式:置OS_STK_GROWTH为0,表示堆栈从下往上增长;置OS_STK_GROWTH为1,表示堆栈从上往下增长。Cortex-M3支持从上往下增长的方式。因此,我们在移植时,需将OS_STK_GROWTH=1,如果是51系列单片机,则OS_STK_GROWTH=0。#defineOS_STK_GROWTH1作者:四川师范大学成都学院屈召贵QQ:352474858/17/201015(5)定义OS_TASK_SW()宏,任务级上下文切换任务级上下文切换(即任务切换)调用宏定义OS_TASK_SW()。因为上下文切换跟处理器有密切关系,OS_TASK_SW()实质上是调用汇编函数OSCtxSW(),它在OS_CPU_A.ASM文件中定义。#defineOS_TASK_SW()OSCtxSw()OSCtxSwPUSH{R4,R5}LDRR4,=NVIC_INT_CTRL;触发软件中断LDRR5,=NVIC_PENDSVSETSTRR5,[R4]POP{R4,R5}BXLR原型如下:打开MDK查看原始代码NVIC_INT_CTRLEQU0xE000ED04NVIC_PENDSVSETEQU0x10000000当执行完这段代后,自运的产生PendSV中断,也即14号异常,自动跳到14号异常服务程序执行。在本移植中则会直接去执行:OSPendSV部分内容作者:四川师范大学成都学院屈召贵QQ:352474858/17/201016中断控制及状态寄存器ICSR0xE000_ED04设置1将挂起中断作者:四川师范大学成都学院屈召贵QQ:352474858/17/201017#ifndef__OS_CPU_H#define__OS_CPU_H#ifdefOS_CPU_GLOBALS#defineOS_CPU_EXT#else#defineOS_CPU_EXTextern#endif/******Datetypes(Compilerspecific)数据类型(和编译器相关)*/typedefunsignedcharBOOLEAN;/*Boolean布尔变量*/typedefunsignedcharINT8U;/*Unsigned8bitquantity*/typedefsignedcharINT8S;/*Signed8bitquantity*/typedefunsignedshortINT16U;/*Unsigned16bitquantity*/typedefsignedshortINT16S;/*Signed16bitquantity*/typedefunsignedintINT32U;/*Unsigned32bitquantity*/typedefsignedintINT32S;/*Signed32bitq
本文标题:一步步教你uCOS-II在STM32的移植
链接地址:https://www.777doc.com/doc-1417303 .html