首页 uCOS-II移植

uCOS-II移植

举报
开通vip

uCOS-II移植null µC/OS-II 的移植 µC/OS-II 的移植7.1 概述7.1 概述User目录 Main.C Main.H Includes.H OS_Cfg.HµC/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.HµC/OS-II Ports目录Co...

uCOS-II移植
null µC/OS-II 的移植 µC/OS-II 的移植7.1 概述7.1 概述User目录 Main.C Main.H Includes.H OS_Cfg.HµC/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.HµC/OS-II Ports目录Cortex M3 OS_CPU_C.C OS_CPU_A.ASM OS_CPU.HBSP(板级支持包) Startup.S Target.C Target.H ARM Cortex-M3 目标板与处理器无关操作系统内核代码与处理器有关需要移植代码开发板相关代码null内核文件移植的部分用户代码板级代码主程序nullARM Cortex-M3的寄存器模型 LM3S系列单片机采用ARM Cortex-M3内核;在移植之前,先简述可见寄存器模型。 ARM Cortex-M3总共有20个寄存器,每个都是32位宽度。nullnull状态中断null控制寄存器7.1.1 移植条件7.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) { int temp; temp=*x; *x=*y; *y=temp; }可重入不可重入编译器还得支持,MDK开 发环境,可生成可重入代码null(2)用C语言可打开和关闭中断 ARM处理器核包含一个CPSR寄存器,该寄存器包括一个全局的中断禁止位,控制它便可打开和关闭中断。PRIMASK(3)处理器支持中断并且能产生定时中断 µC/OS-II通过处理器产生的定时器中断来实现多任务之间的调度。ARM Cortex-M3的处理器都支持中断并能产生定时器中断,专门有一个SysTick定时器来实现。(4)处理器支持能够容纳一定量数据的硬件堆栈(通常需要几十KByte字节) 比如AT98C51处理器,内部只有128字节的RAM,要运行,需外扩RAM。CM3的芯片,内部可多达128KByte的容量,因此可直接使用。(5)处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈(或内存)的指令 µC/OS-II进行任务调度时,会把当前任务的CPU寄存器存到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是µC/OS-II多任务调度的基础。运行TCP、UDP需要的内存会更大,通常要100K左右7.1.2 移植步骤7.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语言编写六个简单的函数编写四个汇编语言函数移植实际中,写一个就行null1、INCLUDES.HINCLUDES.H是一个头文件,它在所有.C文件的第一行被包含。 #include "includes.h" INCLUDES.H使得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些头文件。使用INCLUDES.H的唯一缺点是它可能会包含一些实际不相关的头文件。这意味着每个文件的编译时间可能会增加。但由于它增强了代码的可移植性,所以我们还是决定使用这一方法。用户可以通过编辑INCLUDES.H来增加自己的头文件,但是用户的头文件必须添加在头文件列表的最后。2、基本配置和定义OS_CPU.H(1)用#define 设置一个常量的值#ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endifnull(2)定义与编译器相关的数据类型 为了保证可移植性,程序中没有直接使用C语言中的short、int和long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。程序中自己定义了一套数据类型,如INT16U表示16位无符号整型。对于ARM这样的32位内核,INT16U是unsigned short型;如果是16位处理器,则是unsinged int型。typedef 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 INT32S; /* 有符号32位实体 */ typedef float FP32 /* 单精度浮点数 */ typedef double FP64; /* 双精度浮点数 */ typedef unsigned int OS_STK; /* 堆栈是32位宽度 */ typedef unsigned int OS_CPU_SR; /* 申明状态寄存器是32位 */µC/OS-II内核的代码需要与处理器位有关null(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定义了两个宏来禁止和允许中断:#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。nullOS_CPU_SR_Save MRS R0,PRIMASK CPSID I BX LROS_CPU_SR_Restore MSR PRIMASK, R0 BX LR关中断开中断(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 null(5)定义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 EQU 0xE000ED04 NVIC_PENDSVSET EQU 0x10000000 当执行完这段代后,自运的产生PendSV中断,也即14号异常,自动跳到14号异常服务程序执行。 在本移植中则会直接去执行:OSPendSV部分内容null中断控制及状态寄存器ICSR 0xE000_ED04 设置1将挂起中断null#ifndef __OS_CPU_H #define __OS_CPU_H #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif /****** Date types(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 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 unsigned 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 == 4 void OS_ENTER_CRITICAL (void); void OS_EXIT_CRITICAL (void); #endif void OSCtxSw (void); void OSIntCtxSw (void); void OSStartHighRdy (void); void OSPendSV (void); OS_CPU_EXT INT32U OsEnterSum; #endif /** END FILE*********************/null3、移植汇编语言编写的4个与处理器相关的函数OS_CPU_A.ASM(1)OSStartHighRdy():运行优先级最高的就绪任务OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR() OSStartHighRdy()函数是在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制中获得该任务的堆栈指针SP,并通过SP依次将CPU现场恢复。这时系统就将控制权交给用户创建的任务进程,直到该任务被阻塞或都被其他更高优先级的任务抢占CPU。该函数仅仅在多任务启动时被执行一次,用来启动最高优先级的任务执行。移植该函数的原因是,它涉及将处理器寄存器保存到堆栈的操作。nullnull(2)OSCtxSw():任务优先级切换函数 该函数由OS_TASK_SW()宏调用,OS_TASK_SW()由OSSched()函数调用,OSSched()函数负责任务之间的调度。OSCtxSw()函数的工作是,先将当前任务的CPU现场保存到该任务的堆栈中,然后获得最高优先级任务的堆栈指针,并从该堆栈中恢复此任务的CPU现场,使之继续执行,该函数就完了一次任切换。OSCtxSw 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文件)nullnull触发PendSV异常当PendSV使能,执行此后将进入中断服务程序null(3)OSInitCtxSw():中断级的任务切换函数 该函数由OSIntExit()调用。由于中断可能会使更高优先级的任务进入就绪态,因此,为了让更高优先级的任务能立即运行,在中断服务子程序的最后,OSInitExit()函数会调用OSInitCtxSw()做任务切换。这样做的目的主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。 OSInitCtxSw()与OSCtxSw()都是用于任务切换函数,其区别在于,在OSIntCtxSw()中无需再保存CPU寄存器,因为在调用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异常nullOSPendSV()函数 OSPendSV()是PendSV(可挂起中断服务)的中断处理函数,它负责µC/OS-II的全部上下文切换。这是ARM Cortex-M3提倡的上下文切换方法。使用这程方法的好处理当发生任何的异常时,Cortex-m3自动保存CPU的一半通用寄存器到预先指定的堆栈中,并且在退出异常前按顺序恢复寄存器。OSPendSV()只需保存剩下的R4-R11寄存器并且调整好堆栈指针。这种方法速度快,充分体现了ARM Cortex-M3的优势,而且无论是任务还是异常均可触发此函数切换上下文。注意使用前应在Startup.S中申明。nullnullARM Cortex-M3任务切换示意图null(4)OSTickISR():时钟节拍中断服务函数 时钟节拍是特定的周期性中断,是由硬件定时器产生的。时钟节拍式中断使得内核可将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍频率越高,系统的额外开销越大。中断间的时间间隔取决于不同的应用。 OSTickISR()首先将CPU寄存器的值保存在被中断任务的堆栈中,之后调用OSIntEnter()。随后,OSTickISR()调用OSTimeTick,检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任务。OSTickISR()最后调用OSIntExit()。如果在中断中(或其他嵌套的中断)有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,那么OSIntExit()将进行任务调度。null** Function name: tickInit ** Descriptions: 初始化uC/OS-II的时钟源(系统定时器) static void tickInit (void) { SysTickPeriodSet((INT32U)(SysCtlClockGet() / OS_TICKS_PER_SEC) -1 ); SysTickEnable(); SysTickIntEnable(); } ** 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-II's OSTimeTick()*/ OSIntExit(); }uC/OS-II里面的东东20null4、移植C语言编写的6个与操作系统相关的函数OS_CPU_C.C OS_CPU_C.C文件中包含6个和CPU相关的函数,这6个函数为: 这些函数中,唯一必须移植的是任务堆栈初始化函数OSTaskStkInit()。这个函数在任务创建时被调用,负责初始化任务的堆栈结构并返回新堆栈的指针stk。堆栈初始化工作结束后,返回新的堆栈栈顶指针。OSTaskStkInit() OSTaskDelHook() OSTaskSwHook() OSTaskStartHook() OSTimeHook()null初始化堆栈nullnull
本文档为【uCOS-II移植】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_520820
暂无简介~
格式:ppt
大小:899KB
软件:PowerPoint
页数:0
分类:工学
上传时间:2013-05-15
浏览量:44