-3节嵌入式系统(uCOS-II移植)模版课件.ppt

上传人:e****s 文档编号:85468865 上传时间:2023-04-11 格式:PPT 页数:33 大小:889KB
返回 下载 相关 举报
-3节嵌入式系统(uCOS-II移植)模版课件.ppt_第1页
第1页 / 共33页
-3节嵌入式系统(uCOS-II移植)模版课件.ppt_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《-3节嵌入式系统(uCOS-II移植)模版课件.ppt》由会员分享,可在线阅读,更多相关《-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/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485 第第4节节 C/OS-II 的移植的移植8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:3524748

2、57.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/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485内核文件移植的局部用户代码板级代码主程序8/17/2021作者:四川师范大学成都学院 屈召贵 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/2021作者:四川师范大学成都学院 屈召贵 QQ:352474858/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485状态中断8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485控制存放器8/17/

5、2021作者:四川师范大学成都学院 屈召贵 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(int*x,int *y)in

6、t temp;temp=*x;*x=*y;*y=temp;可重入不可重入编译器还得支持,MDK开发环境,可生成可重入代码8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:352474852用C语言可翻开和关闭中断 ARM处理器核包含一个CPSR存放器,该存放器包括一个全局的中断禁止位,控制它便可翻开和关闭中断。PRIMASK3处理器支持中断并且能产生定时中断 C/OS-II通过处理器产生的定时器中断来实现多任务之间的调度。ARM Cortex-M3的处理器都支持中断并能产生定时器中断,专门有一个SysTick定时器来实现。(4)处理器支持能够容纳一定量数据的硬件堆栈通常需要几十KBy

7、te字节 比方AT98C51处理器,内部只有128字节的RAM,要运行,需外扩RAM。CM3的芯片,内部可多达128KByte的容量,因此可直接使用。5处理器有将堆栈指针和其他CPU存放器读出和存储到堆栈或内存的指令 C/OS-II进行任务调度时,会把当前任务的CPU存放器存到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作存放器,继续运行另一个任务。所以,存放器的入栈和出栈是C/OS-II多任务调度的根底。运行TCP、UDP需要的内存会更大,通常要100K左右8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:352474857.1.2 移植步骤移植步骤 所谓移植,就是使一

8、个实时操作系统能够在某个微处理器平台上或微控制器平台上运行。由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/2021作者:四川师范大学成都学院 屈召贵 QQ:352474851、INCLUDES.HINCLUDES.H是一

9、个头文件,它在所有.C文件的第一行被包含。#include includes.h INCLUDES.H使得用户工程中的每个.C文件不用分别去考虑它实际上需要哪些头文件。使用INCLUDES.H的唯一缺点是它可能会包含一些实际不相关的头文件。这意味着每个文件的编译时间可能会增加。但由于它增强了代码的可移植性,所以我们还是决定使用这一方法。用户可以通过编辑INCLUDES.H来增加自己的头文件,但是用户的头文件必须添加在头文件列表的最后。2、根本配置和定义、根本配置和定义OS_CPU.H(1)用#define 设置一个常量的值#ifdef OS_CPU_GLOBALS#define OS_CPU_

10、EXT#else#define OS_CPU_EXT extern#endif8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(2)定义与编译器相关的数据类型 为了保证可移植性,程序中没有直接使用C语言中的short、int和long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。程序中自己定义了一套数据类型,如INT16U表示16位无符号整型。对于ARM这样的32位内核,INT16U是unsigned short型;如果是16位处理器,那么是unsinged int型。typedef unsigned char BOOLEAN;/*Boolean 布

11、尔变量布尔变量*/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 INT32S;/*有符号有符号32位实体位实体 */typedef float

12、 FP32 /*单精度浮点数单精度浮点数 */typedef double FP64;/*双精度浮点数双精度浮点数 */typedef unsigned int OS_STK;/*堆栈是堆栈是32位宽度位宽度*/typedef unsigned int OS_CPU_SR;/*申明状态存放器是申明状态存放器是32位位*/C/OS-II内核的代内核的代码需要与需要与处理器位有关理器位有关8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(3)定义临界段允许和禁止中断宏 与所有实时内核一样,C/OS-II需要先禁止中断,再访问代码的临界区,并且在访问完毕后,重新允计中断。

13、这就是C/OS-II能够保护临界段代码免受多任务或中断效劳例程ISR的破坏。中断禁止时间是商业实时内核公司提供的重要指标之一,因为它将影响到用户的系统对实时事件的响应能力。虽然C/OS-II尽量使中断禁止时间到达最短,但是C/OS-II的中断禁止时间还主要依赖于处理器结构和编译器产生的代码的质量。通常每个处理器都会提供一定的指令来禁止/允许中断,因此用户的C编译器必须由一定的机制来直接从C中执行这些操作。OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()C/OS-II定义了两个宏来禁止和允许中断:#define OS_CRITICAL_METHOD 3#define O

14、S_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/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485OS_CPU_SR_Save MRS R0,PRIMASK CPSID I BX LROS_CPU_SR_Restore MSR PRIMASK,R0 BX LR关

15、中断开中断(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。#define OS_STK_GROWTH 1 8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(5)定义OS_TASK_SW()宏,任务级上下文切换 任务级上下文切换即任务切换调用宏定义OS_TA

16、SK_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 EQU 0 xE000ED04 NVIC_PENDSVSET EQU 0 x10000000 当执行

17、完这段代后,自运的产生PendSV中断,也即14号异常,自动跳到14号异常效劳程序执行。在本移植中那么会直接去执行:OSPendSV局部内容8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485中断控制及状态存放器ICSR 0 xE000_ED04 设置1将挂起中断8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485#ifndef _OS_CPU_H#define _OS_CPU_H#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif/*Date ty

18、pes(Compiler specific)数据类型和编译器相关数据类型和编译器相关 */typedef unsigned char BOOLEAN;/*Boolean 布尔变量布尔变量 */typedef unsigned char INT8U;/*Unsigned 8 bit quantity */typedef signed char INT8S;/*Signed 8 bit quantity */typedef unsigned short INT16U;/*Unsigned 16 bit quantity */typedef signed short INT16S;/*Signed

19、16 bit quantity */typedef unsigned int INT32U;/*Unsigned 32 bit quantity */typedef signed int INT32S;/*Signed 32 bit quantity */typedef float FP32;/*Single precision floating point*/typedef double FP64;/*Double precision floating point*/typedef unsigned int OS_STK;/*wide 堆栈是堆栈是32位宽度位宽度 */typedef uns

20、igned int OS_CPU_SR;/*Define size of CPU statusregister */*Method of critical section management 临界区管理方法临界区管理方法*/#define OS_CRITICAL_METHOD 4/*Other definitions 其他定义其他定义*/#define OS_STK_GROWTH 1#define OS_TASK_SW()OSCtxSw()/*Prototypes(see OS_CPU_A.ASM)原型声明见原型声明见OS_CPU_A.ASM*/#if OS_CRITICAL_METHOD=

21、4void OS_ENTER_CRITICAL(void);void OS_EXIT_CRITICAL(void);#endifvoid OSCtxSw(void);void OSIntCtxSw(void);void OSStartHighRdy(void);void OSPendSV(void);OS_CPU_EXT INT32U OsEnterSum;#endif/*END FILE*/8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(1)OSStartHighRdy():运行优先级最高的就绪任务OSStartHighRdy()OSCtxSw()OSIntCt

22、xSw()OSTickISR()OSStartHighRdy()函数是在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制中获得该任务的堆栈指针SP,并通过SP依次将CPU现场恢复。这时系统就将控制权交给用户创立的任务进程,直到该任务被阻塞或都被其他更高优先级的任务抢占CPU。该函数仅仅在多任务启动时被执行一次,用来启动最高优先级的任务执行。移植该函数的原因是,它涉及将处理器存放器保存到堆栈的操作。8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485OSStartHighRdy LDR R4,=NVIC_SYSPRI2 ;set the PendSV e

23、xception ;priority 设置PendSV优先级 LDR R5,=NVIC_PENDSV_PRI STR R5,R4 MOV R4,#0 ;set the PSP to 0 for initial ;context switch call 使PSP等于0 MSR PSP,R4 LDR R4,=OSRunning ;OSRunning=TRUE MOV R5,#1 STRB R5,R4 LDR R4,=NVIC_INT_CTRL ;trigger the PendSV exception ;触发软件中断 LDR R5,=NVIC_PENDSVSET STR R5,R4 CPSIE I

24、 ;enable interrupts at processor ;level 使能所有优先级的中断OSStartHang B OSStartHang8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(2)OSCtxSw():任务优先级切换函数 该函数由OS_TASK_SW()宏调用,OS_TASK_SW()由OSSched()函数调用,OSSched()函数负责任务之间的调度。OSCtxSw()函数的工作是,先将当前任务的CPU现场保存到该任务的堆栈中,然后获得最高优先级任务的堆栈指针,并从该堆栈中恢复此任务的CPU现场,使之继续执行,该函数就完了一次任切换。OSC

25、txSw PUSH R4,R5 LDR R4,=NVIC_INT_CTRL;触发软件中断触发软件中断 LDR R5,=NVIC_PENDSVSET STR R5,R4 POP R4,R5 BX LR产生PendSV异常 PendSV并没有马上执行,因为OS_TASK_SW()实际是OSCtxSw()被调用前中断是关闭的。PednSV只能在中断使能后才能执行。OS_TASK_SW()总是被OS_Sched()调用见OS_CORE.C文件8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:352474858/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485触发Pen

26、dSV异常当PendSV使能,执行此后将进入中断效劳程序8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(3)OSInitCtxSw():中断级的任务切换函数 该函数由OSIntExit()调用。由于中断可能会使更高优先级的任务进入就绪态,因此,为了让更高优先级的任务能立即运行,在中断效劳子程序的最后,OSInitExit()函数会调用OSInitCtxSw()做任务切换。这样做的目的主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。OSInitCtxSw()与OSCtxSw()都是用于任务切换函数,其区别在于,在OSIntCtxSw()中无需再保存CP

27、U存放器,因为在调用OSIntCtxSw()之前已发生了中断,OSIntCtxSw()已将默认的CPU存放器保存到被中断的任务堆栈中。OSIntCtxSw PUSH R4,R5 LDR R4,=NVIC_INT_CTRL;触发软件中断 LDR R5,=NVIC_PENDSVSET STR R5,R4 POP R4,R5 BX LR NOPOSCtxSw()OSIntCtxSw()这两个函最终都会触发PendSV异常8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485OSPendSV()函数 OSPendSV()是PendSV(可挂起中断效劳)的中断处理函数,它负责C/O

28、S-II的全部上下文切换。这是ARM Cortex-M3提倡的上下文切换方法。使用这程方法的好处理当发生任何的异常时,Cortex-m3自动保存CPU的一半通用存放器到预先指定的堆栈中,并且在退出异常前按顺序恢复存放器。OSPendSV()只需保存剩下的R4-R11存放器并且调整好堆栈指针。这种方法速度快,充分表达了ARM Cortex-M3的优势,而且无论是任务还是异常均可触发此函数切换上下文。注意使用前应在Startup.S中申明。8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:352474858/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485ARM

29、Cortex-M3任务切换示意图8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485(4)OSTickISR():时钟节拍中断效劳函数 时钟节拍是特定的周期性中断,是由硬件定时器产生的。时钟节拍式中断使得内核可将任务延时假设干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍频率越高,系统的额外开销越大。中断间的时间间隔取决于不同的应用。OSTickISR()首先将CPU存放器的值保存在被中断任务的堆栈中,之后调用OSIntEnter()。随后,OSTickISR()调用OSTimeTick,检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任

30、务。OSTickISR()最后调用OSIntExit()。如果在中断中或其他嵌套的中断有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,那么OSIntExit()将进行任务调度。8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485*Function name:tickInit*Descriptions:初始化uC/OS-II的时钟源系统定时器static void tickInit(void)SysTickPeriodSet(INT32U)(SysCtlClockGet()/OS_TICKS_PER_SEC)-1);SysTickEnable();SysTick

31、IntEnable();*Function name:tickISRHandler*Descriptions:系统定时器超时中断void tickISRHandler(void)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT_CRITICAL();OSTimeTick();/*Call uC/OS-IIs OSTimeTick()*/OSIntExit();uC/OS-II里面的东东208/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485

32、 OS_CPU_C.C文件中包含6个和CPU相关的函数,这6个函数为:这些函数中,唯一必须移植的是任务堆栈初始化函数OSTaskStkInit()。这个函数在任务创立时被调用,负责初始化任务的堆栈结构并返回新堆栈的指针stk。堆栈初始化工作结束后,返回新的堆栈栈顶指针。OSTaskStkInit()OSTaskDelHook()OSTaskSwHook()OSTaskStartHook()OSTimeHook()8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:35247485初始化堆栈8/17/2021作者:四川师范大学成都学院 屈召贵 QQ:352474858/17/2021作者:四川师范大学成都学院 屈召贵 QQ:352474858/17/2021

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com