第6章-3节嵌入式系统(uCOS-II移植).ppt
《第6章-3节嵌入式系统(uCOS-II移植).ppt》由会员分享,可在线阅读,更多相关《第6章-3节嵌入式系统(uCOS-II移植).ppt(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、作者:四川师范大学成都学院 屈召贵 QQ:35247485本章学习的主要内容:本章学习的主要内容:1、ROTS应用举例2、ROTS概述3、uC/OS-II的工作原理4、uC/OS-II移植移植本章的重点及难点:本章的重点及难点:1、各模块的基本原理2、各模块的综合应用学习方法:学习方法:1、读懂教科书及参考资料代码2、掌握实验手册的相关内容3、加强并投入时间实验4、做好学习笔记5、uC/OS-II应用实例8/17/20101*作者:四川师范大学成都学院 屈召贵 QQ:35247485 第第4节节 C/OS-II 的移植的移植8/17/20102*作者:四川师范大学成都学院 屈召贵 QQ:352
2、474857.1 概述概述User目录目录Main.CMain.HIncludes.HOS_Cfg.HC/OS-II Source目录目录OS_CORE.C OS_FLAG.C OS_MBOX.C OS_MEM.C OS_MUTEX.C OS_Q.C OS_SEM.C OS_TASK.C OS_TIME.C OS_TMR.C uCOS_II.HC/OS-II Ports目录目录Cortex M3 OS_CPU_C.C OS_CPU_A.ASM OS_CPU.HBSP(板级支持包)Startup.STarget.CTarget.H ARM Cortex-M3 目标板目标板与处理器无关操作系统内核
3、代码与处理器有关需要移植代码开发板相关代码8/17/20103*作者:四川师范大学成都学院 屈召贵 QQ:35247485内核文件移植的部分用户代码板级代码主程序8/17/20104*作者:四川师范大学成都学院 屈召贵 QQ:35247485ARM Cortex-M3的寄存器模型 LM3S系列单片机采用ARM Cortex-M3内核;在移植之前,先简述可见寄存器模型。ARM Cortex-M3总共有20个寄存器,每个都是32位宽度。R0-R12 通用寄存器,可存储数据也可存放指针R13 用于存放堆栈指针。实际上有两个堆栈指针SP_process(进程堆栈)和 SP_main(主堆栈),但任何时
4、候只有一个是可见的。在本移植中,SP_process用于任务代码(即线程模式),SP_main用于异常代码 (即处理模式)。R14 连接寄存器LR。在执行分支链接指令(BL)或带交换的分支链接指 令(BLX)时,存储来自PC的返回地址;也用作异常的返回。R15 程序计数寄存器PC。用于指示当前正被执行的指令。根据不同的指 令,每执行一条,PC增加2或增加4。8/17/20105*作者:四川师范大学成都学院 屈召贵 QQ:352474858/17/20106*作者:四川师范大学成都学院 屈召贵 QQ:35247485状态中断8/17/20107*作者:四川师范大学成都学院 屈召贵 QQ:3524
5、7485控制寄存器8/17/20108*作者:四川师范大学成都学院 屈召贵 QQ:352474857.1.1 移植条件移植条件移植C/OS-II到处理器上必须满足以下条件(1)处理器的C编译器能产生可重入代码 C/OS是多任务内核,函数可能会被多个任务调用,代码的重入性是保证完成多任务的基础。可重入代码指的是可被多个体任务同时调用,而不会破坏数据的一段代码,或者说代码具有在执行过程中打断后再次被调用的能力。举例说明:Swap1函数代码:Int temp;void swap1(int*x,int *y)temp=*x;*x=*y;*y=temp;举例说明:Swap2函数代码:void swap2
6、(int*x,int *y)int temp;temp=*x;*x=*y;*y=temp;可重入不可重入编译器还得支持,MDK开发环境,可生成可重入代码8/17/20109*作者:四川师范大学成都学院 屈召贵 QQ:35247485(2)用C语言可打开和关闭中断 ARM处理器核包含一个CPSR寄存器,该寄存器包括一个全局的中断禁止位,控制它便可打开和关闭中断。PRIMASK(3)处理器支持中断并且能产生定时中断 C/OS-II通过处理器产生的定时器中断来实现多任务之间的调度。ARM Cortex-M3的处理器都支持中断并能产生定时器中断,专门有一个SysTick定时器来实现。(4)处理器支持能
7、够容纳一定量数据的硬件堆栈(通常需要几十KByte字节)比如AT98C51处理器,内部只有128字节的RAM,要运行,需外扩RAM。CM3的芯片,内部可多达128KByte的容量,因此可直接使用。(5)处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈(或内存)的指令 C/OS-II进行任务调度时,会把当前任务的CPU寄存器存到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是C/OS-II多任务调度的基础。运行TCP、UDP需要的内存会更大,通常要100K左右8/17/201010*作者:四川师范大学成都学院 屈召贵 QQ:35
8、2474857.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语言编写六个简单的函数编写四个汇编语言函数移植实际中,实际中,写一个写一个就行就行8/17/201011*作者:四川师范大学成都学院 屈召贵 QQ
9、:352474851、INCLUDES.HINCLUDES.H是一个头文件,它在所有.C文件的第一行被包含。#include includes.h INCLUDES.H使得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些头文件。使用INCLUDES.H的唯一缺点是它可能会包含一些实际不相关的头文件。这意味着每个文件的编译时间可能会增加。但由于它增强了代码的可移植性,所以我们还是决定使用这一方法。用户可以通过编辑INCLUDES.H来增加自己的头文件,但是用户的头文件必须添加在头文件列表的最后。2、基本配置和定义、基本配置和定义OS_CPU.H(1)用#define 设置一个常量的值#if
10、def OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif8/17/201012*作者:四川师范大学成都学院 屈召贵 QQ:35247485(2)定义与编译器相关的数据类型 为了保证可移植性,程序中没有直接使用C语言中的short、int和long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。程序中自己定义了一套数据类型,如INT16U表示16位无符号整型。对于ARM这样的32位内核,INT16U是unsigned short型;如果是16位处理器,则是unsinged int型。typede
11、f unsigned char BOOLEAN;/*Boolean 布尔变量布尔变量*/typedef unsigned char INT8U;/*无符号无符号8位实体位实体 */typedef signed char INT8S;/*有符号有符号8位实体位实体 */typedef unsigned short INT16U;/*无符号无符号16位实体位实体 */typedef signed short INT16S;/*有符号有符号16位实体位实体 */typedef unsigned int INT32U;/*无符号无符号32位实体位实体 */typedef signed int INT3
12、2S;/*有符号有符号32位实体位实体 */typedef float FP32 /*单精度浮点数单精度浮点数 */typedef double FP64;/*双精度浮点数双精度浮点数 */typedef unsigned int OS_STK;/*堆栈是堆栈是32位宽度位宽度*/typedef unsigned int OS_CPU_SR;/*申明状态寄存器是申明状态寄存器是32位位*/C/OS-II内核的代内核的代码需要与需要与处理器位有关理器位有关8/17/201013*作者:四川师范大学成都学院 屈召贵 QQ:35247485(3)定义临界段(允许和禁止中断宏)与所有实时内核一样,C/
13、OS-II需要先禁止中断,再访问代码的临界区,并且在访问完毕后,重新允计中断。这就是C/OS-II能够保护临界段代码免受多任务或中断服务例程ISR的破坏。中断禁止时间是商业实时内核公司提供的重要指标之一,因为它将影响到用户的系统对实时事件的响应能力。虽然C/OS-II尽量使中断禁止时间达到最短,但是C/OS-II的中断禁止时间还主要依赖于处理器结构和编译器产生的代码的质量。通常每个处理器都会提供一定的指令来禁止/允许中断,因此用户的C编译器必须由一定的机制来直接从C中执行这些操作。OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()C/OS-II定义了两个宏来禁止和允许中
14、断:#define OS_CRITICAL_METHOD 3#define OS_ENTER_CRITICAL()cpu_sr=OS_CPU_SR_Save();#define OS_EXIT_CRITICAL()OS_CPU_SR_Restore(cpu_sr);OS_CPU_A.ASM中具体实现中具体实现C/OS-II定义了三种方法关闭和打开中断(OS_CRITICAL_METHED=1,2,3),通常情况下,我们都是选用的方法3。8/17/201014*作者:四川师范大学成都学院 屈召贵 QQ:35247485OS_CPU_SR_Save MRS R0,PRIMASK CPSID I B
15、X LROS_CPU_SR_Restore MSR PRIMASK,R0 BX LR关中断开中断(4)定义栈的增长方向C/OS-II使用结构常量OS_STK_GROWTH来指定堆栈的增长方式:l置OS_STK_GROWTH为0,表示堆栈从下往上增长;l置OS_STK_GROWTH为1,表示堆栈从上往下增长。Cortex-M3支持从上往下增长的方式。因此,我们在移植时,需将OS_STK_GROWTH=1,如果是51系列单片机,则OS_STK_GROWTH=0。#define OS_STK_GROWTH 1 8/17/201015*作者:四川师范大学成都学院 屈召贵 QQ:35247485(5)定
16、义OS_TASK_SW()宏,任务级上下文切换 任务级上下文切换(即任务切换)调用宏定义OS_TASK_SW()。因为上下文切换跟处理器有密切关系,OS_TASK_SW()实质上是调用汇编函数OSCtxSW(),它在OS_CPU_A.ASM文件中定义。#define OS_TASK_SW()OSCtxSw()OSCtxSw PUSH R4,R5 LDR R4,=NVIC_INT_CTRL;触发软件中断触发软件中断 LDR R5,=NVIC_PENDSVSET STR R5,R4 POP R4,R5 BX LR原型如下原型如下:打开打开MDK查查看原始代码看原始代码NVIC_INT_CTRL E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 uCOS II 移植
限制150内