嵌入式系统-—基于32位微处理器与实时操作系统.ppt_第1页
嵌入式系统-—基于32位微处理器与实时操作系统.ppt_第2页
嵌入式系统-—基于32位微处理器与实时操作系统.ppt_第3页
嵌入式系统-—基于32位微处理器与实时操作系统.ppt_第4页
嵌入式系统-—基于32位微处理器与实时操作系统.ppt_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统 RTEOS C/OS-II 的移植 2006年6月9日 主要内容 n移植规划 nC/OS-II的移植 n嵌入式系统的初始化 移植规划-概述 所谓“移植”,就是使一个实时内核能在其它 的微处理器或微控制器上运行。 尽管大部分C/OS-II的代码是用C语言编写的 ,但是在编写与处理器硬件相关的代码时还是不得 不使用汇编语言。 移植的主要工作就是编写这些与处理器硬件相 关的代码。 操作系统的移植大体可以分为两个层次: n跨体系结构的移植 n针对特定处理器的移植 移植规划 在移植前针对所使用的微处理 器进行规划,主要有以下几个方面的 考虑: n 编译器的选择 n 任务模式的选择 n 支持的指令集 移植规划(续) 编译器的选择 n针对ARM处理器核的C语言编译器有很多,如SDT、 ADS、IAR、TASKING和GCC等 n目前在国内最流行的是ADS、SDT和GCC nSDT和ADS均为ARM公司自己开发,ADS为SDT的升级 版,以后ARM公司不再支持SDT,故不选择SDT。GCC 虽然支持广泛,很多开发套件使用它作为编译器,但是与 ADS比较其编译效率较低,这对充分发挥芯片性能不利 n考虑使用ADS编译程序和调试 ARM的工作模式 nARM处理器有7种操作模式: n用户模式(usr) n - 正常的程序执行模式 n快速中断模式(fiq) - 支持高速数据传输或通道处理 n中断模式(irq) - 用于通用中断处理 n管理员模式(svc) - 操作系统的保护模式. n中止模式(abt) - 支持虚拟内存和/或内存保护等异常 n系统模式(sys) - 支持操作系统的特殊用户模式(运行操作系统任 务) n未定义模式(und) - 支持硬件协处理器的软件仿真 n除了用户模式外,其他模式均可视为特权模式 移植规划(续) n任务模式的取舍 ARM7处理器核具有上述七种模式,其中除用户 模式外其它均为特权模式。其中管理、中止、未定义 、中断和快中断模式与相应异常相联系,任务使用这 些模式不太适合。 系统模式除了是特权模式外,其它与用户模式一样 ,因而可选为任务使用的模式只有用户模式和系统模 式。 为了尽量减少任务代码错误对整个程序的影响,缺 省的任务模式定为用户模式,可选为系统模式,同时 提供接口使任务可以在这两种模式间切换。 移植规划(续) n支持的指令集 带T变量的ARM7处理器核具有两个指令集: n标准32位ARM指令集 n16位Thumb指令集 两种指令集有不同的应用范围。 n为了最大限度地支持芯片的特性,任务应当可以使 用任意一个指令集并可以自由切换,而且不同的任务 应当可以使用不同的指令集 移植C/OS-II n概述 要移植一个操作系统到一个特定的CPU体系结 构并不是一件很容易的事情,它对移植者有以下 要求: 1 对目标体系结构要有很深了解; 2 对OS原理要有较深入的了解; 3 对所使用的编译器要有较深入的了解; 4 对需要移植的操作系统要有相当的了解; 5 对具体使用的芯片也要一定的了解 要移植一个操作系统到一个特定的CPU体系结构 上并不是一件很容易的事情,它对移植者有以下要求 : 1 对目标体系结构要有很深了解; 2 对OS原理要有较深入的了解; 3 对所使用的编译器要有较深入的了解; 4 对需要移植的操作系统要有相当的了解; 5 对具体使用的芯片也要一定的了解。 概述 要移植一个操作系统到一个特定的CPU体系结构 上并不是一件很容易的事情,它对移植者有以下要求 : 1 对目标体系结构要有很深了解; 2 对OS原理要有较深入的了解; 3 对所使用的编译器要有较深入的了解; 4 对需要移植的操作系统要有相当的了解; 5 对具体使用的芯片也要一定的了解。 参考ARM公司的ARM体系结构文档 参考嵌入式实时操作系统C/OS-II 一书 参考ADS软件自带的编译器和连接器手册 参考嵌入式实时操作系统C/OS-II 一书 参考具体芯片的数据手册和使用手册 因为第4点的影响是全局性的,它决定移植代码的框架和功能。 所以重点介绍第4点。 主要内容 n移植规划 nC/OS-II的移植 n嵌入式系统的初始化 C/OS-II的文件结构 C/OS-II移植 应用程序 (用户代码) C/OS-II (与处理器无关代码) OS_CORE.c OS_FLAG.c . C/OS-II配置 (与应用相关) OS_CFG.H INCLUDES.H C/OS-II移植 (与处理器相关代码) CPU 定时器 硬件 软件 C/OS-II硬件软件体系 结构 用于产生 系统时钟 移植时需要 编写的代码 移植C/OS-II满足的条件 n处理器的C编译器能产生可重入代码 n在程序中可以打开或者关闭中断 n处理器支持中断,并且能产生定时中断(通常在10 100Hz之间) n处理器支持能够容纳一定量数据的硬件堆栈(通常 是几千字节) n处理器有将堆栈指针和其他CPU寄存器的内容存储和 读出到堆栈(或者内存)的指令 什么是可重入代码 n可重入的代码指的是一段可以被多个 任务同时调用,而不必担心会破坏数据的 代码(比如:一个函数) n即:可重入型函数在任何时候都可以 被中断执行,过一段时间以后又可以继续 运行,而不会因为在函数中断的时候被其 他的任务重新调用,而影响函数中的数据 可重入代码举例 程序1:可重入型函数 void swap(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; 非可重入代码举例 程序2:非可重入型函数 int temp; void swap(int *x, int *y) temp=*x; *x=*y; *y=temp; 不可重入函数被中断破坏 如何使函数具有可重入性 使Swap()函数具有可重入性的条件: n把Temp定义为局部变量 n调用Swap()函数之前关中断, 调用 后再开中断 n用信号量禁止该函数在使用过 程中 被再次调用 概述 根据C/OS-II的要求,移植C/OS-II到一个新的体 系结构上需要提供2个或3个文件: OS_CPU.H(C语言头文件) OS_CPU_C.C(C程序源文件) OS_CPU_A.ASM(汇编程序源文件) 其中OS_CPU_A.ASM在某些情况下不需要,但极 其罕见。不需要OS_CPU_A.ASM的必须满足以下苛 刻条件: 1.可以直接使用C语言开关中断; 2.可以直接使用C语言编写中断服务程序; 3.可以直接使用C语言操作堆栈指针; 4.可以直接使用C语言保存CPU的所有寄存器。 移植需要编写的文 件 概述 移植内容类型所属文件描述 BOOLEAN、INT8U、INT8S、 数据类型OS_CPU.H与编译器无关的数据类型 OS_STK数据类型OS_CPU.H堆栈的数据类型 OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL() 宏OS_CPU.H开关中断的代码 OS_STK_GROWTH常量OS_CPU.H定义堆栈的增长方向 OS_TASK_SW函数OS_CPU.H任务切换时执 行的代码 OSTaskStkInit()函数OS_CPU_C.C任务堆栈初始化函数 OSInitHookBegin()、 OSInitHookEnd()、 函数OS_CPU_C.C C/OS-II在执行某些操作时 调用的用户函数,一般为空 OSStartHighRdy()函数*OS_CPU_A.ASM 进入多任务环境时运行优先 级最高的任务, OSIntCtxSw()函数*OS_CPU_A.ASM中断退出时的任务切换函数 OSTickISR()中断服务程序*OS_CPU_A.ASM时钟节 拍中断服务程序 实际上,还有一个文件很重要,它就是IRQ.INC,它定义了一个汇编宏, 它是C/OS-II for ARM7通用的中断服务程序的汇编与C函数接口代码。时钟 节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自 己编写,不过可以通过IRQ.INC简化用户代码的编写。 移植代码包括的主要 内容 关于头文件includes.h和config.h n C/OS-II要求所有.C文件的都要包含头文件includes.h,这样使 得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些头 文件。 n 使用INCLUDES.H的缺点是它可能会包含一些实际不相关的头 文件,这意味着每个文件的编译时间可能会增加,但却增强了代 码的可移植性。 在移植中另外增加了一个头文件config.h,要求所有用户程序 必须包含config.h,在config.h中包含includes.h和特定的头文件和 配置项。而C/OS-II的系统文件依然只是包含includes.h,即 C/OS-II的系统文件完全不必改动。所有的配置改变包括头文件 的增减均在config.h中进行,而includes.h定下来后不必改动( C/OS-II的系统文件需要包含的东西是固定的)。这样,C/OS- II的系统文件需要编译的次数大大减少,编译时间随之减少。 congfig.h UC/OS内核文件 Includes.h 用户程序 设置与处理器和编译器相关的代码 nOS_CPU.H中定义了与编译器相关的 数据类型。比如:INT8U、INT8S等。 n与 ARM处理器相关的代码,使用 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 宏开启关闭中断 n设置堆栈的增长方向 :堆栈由高地 址向低地址增长 编写OS_CPU.H C/OS-II使用结构常量OS_STK_GROWTH中指定堆栈的 生长方式: 置OS_STK_GROWTH为0表示堆栈从下往上长。 置OS_STK_GROWTH为1表示堆栈从上(高地址)往下 (低地址)长。 虽然ARM处理器核对于两种方式均支持,但ADS的C语言 编译器仅支持一种方式,即从上往下长,并且必须是满递减堆 栈,所以OS_STK_GROWTH的值为1。 #define OS_STK_GROWTH 1 堆栈生长方式 编写OS_CPU.H C/OS-II不使用C语言中的short、int、long等数据类型的定义 ,因为它们与处理器类型有关,隐含着不可移植性。代之以移植 性强的整数数据类型,这样,既直观又可移植,不过这就成了必 须移植的代码。根据ADS编译器的特性,这些代码如下程序清单 所示(与编译有关)。 typedefunsigned char BOOLEAN; typedefunsigned char INT8U; typedefsigned char INT8S; typedefunsigned short INT16U; typedefsigned short INT16S; typedefunsigned int INT32U; typedefsigned int INT32S; typedeffloat FP32; typedefdouble FP64; typedefINT32U OS_STK; 不依赖于编译的数据 类型 设置includes.h typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned int INT16U; typedef signed int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64; typedef unsigned long OS_STK; typedef unsigned long OS_CPU_SR; extern int INTS_OFF(void); extern void INTS_ON(void); #define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); #define OS_STK_GROWTH 1 /*从高向低*/ 程序状态寄存器(CPSR) n 条件位: nN = 1-结果为负,0-结果为正 或0 nZ = 1-结果为0,0-结果不为0 nC =1-进位,0-借位 nV =1-结果溢出,0结果没溢 出 nQ 位: n仅ARM 5TE/J架构支持 n指示增强型DSP指令是否溢出 nJ 位 n仅ARM 5TE/J架构支持 nJ = 1: 处理器处于Jazelle 状态 n中断禁止位: nI = 1: 禁止 IRQ. nF = 1: 禁止 FIQ. nT Bit n仅ARM xT架构支持 nT = 0: 处理器处于 ARM 状态 nT = 1: 处理器处于 Thumb 状态 nMode位(处理器模式位): n0b10000User n0b10001FIQ n0b10010IRQ n0b10011Supervisor n0b10111Abort n0b11011Undefined n0b11111System 2731 N Z C V Q 2867 I F T mode 1623 815 54024 fsxc U n d e f i n e dJ 编写OS_CPU.H C/OS-II运行时,处理器可能处于的模式如下图所示: 使用软中断SWI作底层 接口 Thumb指令集ARM指令集 用户模式 系统模式 用户任务使用 的处理器模式 ARM7内核具有的指令集 ARM指令 用户模式 ARM指令 系统模式 Thumb指令 系统模式 Thumb指令 用户模式 编写OS_CPU.H 为了使底层接口函数与处理器状态无关,同时在任务调用 相应的函数不需要知道函数位置,在移植中使用软中断指令 SWI作为底层接口,使用不同的功能号区分不同的函数。软中 断功能号分配如下表所示,未列出的为保留功能。 使用软中断SWI作底层 接口 功能号接口函数简介 0x00void OS_TASK_SW(void)任务级任务切换函数 0x01_OSStartHighRdy(void)运行优先级最高的任务,由OSStartHighRdy产 生 0x02void OS_ENTER_CRITICAL(void)关中断 0x03Void OS_EXIT_CRITICAL(void)开中断 0x80Void ChangeToSYSMode(void)任务切换到系统模式 0x81Void ChangeToUSRMode(void)任务切换到用户模式 0x82Void TaskIsARM(INT8U prio)任务代码是ARM代码 0x83Void TaskIsTHUMB(INT8U prio)任务代码是THUMB代码 编写OS_CPU.H 用软中断作为操作系统的底层接口就需要在C语言中使用 SWI(SoftWare Interrupt)指令。在ADS中,有一个关键字 _swi,用它声明一个不存在的函数,则调用这个函数就在调 用这个函数的地方插入一条SWI指令,并且可以指定功能号。 同时,这个函数也可以有参数和返回值,其传递规则与一般函 数相同。 使用软中断SWI作底层 接口 /* 任务级任务切换函数 */ _swi(0x00) void OS_TASK_SW(void); /* 运行优先级最高的任务 */ _swi(0x01) void _OSStartHighRdy(void); /* 关中断 */ _swi(0x02) void OS_ENTER_CRITICAL(void); /* 开中断 */ _swi(0x03) void OS_EXIT_CRITICAL(void); /* 任务切换到系统模式 */ _swi(0x80) void ChangeToSYSMode(void); /* 任务切换到用户模式 */ _swi(0x81) void ChangeToUSRMode(void); /* 任务代码是ARM代码 */ _swi(0x82) void TaskIsARM(INT8U prio); /* 任务代码是THUMB代码 */ _swi(0x83) void TaskIsTHUMB(INT8U prio); 程序中调用软 中断时使用的 函数名 软件中断号 该调用不返 回参数 编写OS_CPU_C.C nC/OS-II的移植要求用户编写10个C函数: nOSTaskStkInit(): OSTaskCreat()和 OSTaskCreatExt()通过调用 本函数,初始化任务的 栈结构 nOSTaskCreateHook():每当添加任务时由 OS_TCBInit( )函数调用 nOSTaskDelHook(): 任务被删除后由OSTaskDel ()调用 nOSTaskSwHook(): 任务切换时两种情况均会 调用该函数 nOSTaskIdleHook():OSTaskIdle()函数可调用 该函数实现CPU低功耗模式 nOSTimeTickHook():本函数在每个时钟节拍都会 被OSTimeTick()调用 nOSInitHookBegin():进入OSInit()函数后本函 数会立即被调用 nOSInitHookEnd(): OSInit()函数返回之前被 调用 nOSTCBInitHook():OS_TCBInit( )在调用 OSTaskCreateHook()之前将先 调用本函数 n唯一必要的函数是OStaskStkInit(),其他9个函数必须声明,但不一 定要包含任何代码 编写OS_CPU_C.C 该函数用于初始化任务堆栈,使任务的堆栈看起来就像刚 发生中断一样。即任务被执行时,就像从中断返回一样。 在编写此函数之前,必须先确定任务的堆栈结构。而任务 的堆栈结构是与CPU的体系结构、编译器有密切的关联。本移 植的堆栈结构如下图所示。 OSTaskStkInit( ) 任务入栈的 其它数据 LR R12 R11 R10 R9 R8 . 栈底 任务环境开始 SP PC R2 R1 R0 OSEnterSum 空闲空间 编写OS_CPU_C.COSTaskStkInit( ) OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) OS_STK *stk; opt = opt; stk = ptos; *stk = (OS_STK) task; *-stk = (OS_STK) task; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = (unsigned int) pdata; *-stk = (USER_USING_MODE|0x00); *-stk = 0; return (stk); 入栈的数据 任务入栈的 其它数据 LR R12 R11 R10 R9 R8 . 栈底 任务环境开始 SP PC R2 R1 R0 OSEnterSum 空闲空间 编写OS_CPU_C.COSTaskStkInit( ) OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) OS_STK *stk; opt = opt; stk = ptos; *stk = (OS_STK) task; *-stk = (OS_STK) task; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = (unsigned int) pdata; *-stk = (USER_USING_MODE|0x00); *-stk = 0; return (stk); 该数据比较特别,它用于保存该任务关中断的次数 ,它在调用OS_ENTER_CRITICAL( )时加1,在调用 OS_EXIT_CRITICAL( )时减1。 这样每个任务都可以独立控制本任务的中断允许状 态,而不会影响其它任务的中断允许状态。因此关中断 和开中断就可以嵌套。 编写OS_CPU_C.C 软件中断异常服务程序 操作系统与硬件相关的底层函数使用软件中断作为接口,如下 表所示。 n 移植代码中一个重要的工作就是为这些软件中断编写服务程序 功能号接口函数简介 0x00void OS_TASK_SW(void)任务级任务切换函数 0x01_OSStartHighRdy(void)运行优先级最高的任务,由OSStartHighRdy产 生 0x02void OS_ENTER_CRITICAL(void)关中断 0x03Void OS_EXIT_CRITICAL(void)开中断 0x80Void ChangeToSYSMode(void)任务切换到系统模式 0x81Void ChangeToUSRMode(void)任务切换到用户模式 0x82Void TaskIsARM(INT8U prio)任务代码是ARM代码 0x83Void TaskIsTHUMB(INT8U prio)任务代码是THUMB代码 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 功能号接口函数简介 0x00void OS_TASK_SW(void)任务级任务切换函数 0x01_OSStartHighRdy(void)运行优先级最高的任务,由OSStartHighRdy产 生 0x02void OS_ENTER_CRITICAL(void)关中断 0x03Void OS_EXIT_CRITICAL(void)开中断 0x80Void ChangeToSYSMode(void)任务切换到系统模式 0x81Void ChangeToUSRMode(void)任务切换到用户模式 0x82Void TaskIsARM(INT8U prio)任务代码是ARM代码 0x83Void TaskIsTHUMB(INT8U prio)任务代码是THUMB代码 void SWI_Exception(int SWI_Num, int *Regs) OS_TCB *ptcb; switch(SWI_Num) case 0x02: / 关中断 . case 0x03: / 开中断 . case 0x80: / 任务切换到系统模式 . case 0x81: / 任务切换到用户模式 . case 0x82: / 任务代码是ARM代码 . case 0x83: / 任务代码是Thumb代码 . default: 这两个软件中断使 用汇编代码完成 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 C/OS-II的启动多任务环境的 函数叫做OSStart(),用户在调用 OSStart()之前,必须已经建立了一个 或更多任务。OSStart()最终调用函数 OSStartHighRdy()运行多任务启动前 优先级最高的任务。 void OSStartHighRdy(void) _OSStartHighRdy(); 该函数在Os_cpu_a.s文件中实现 。 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 关中断和开中断是为了保护临界 段代码。这些代码与处理器有关,是 需要移植的代码。在ARM处理器核 中关中断和开中断时通过改变程序状 态寄存器CPSR中的相应控制位实现 。由于使用了软件中断,程序状态寄 存器CPSR保存到程序状态保存寄存 器SPSR中,软件中断退出时会将 SPSR恢复到CPSR中,所以程序只要 改变程序状态保存寄存器SPSR中的 相应的控制位就可以了。 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 void SWI_Exception(int SWI_Num, int *Regs) . case 0x02: / 关中断 _asm MRS R0,SPSR ORR R0,R0,#NoInt MSR SPSR_c,R0 OsEnterSum+; break; case 0x03: / 开中断 if (-OsEnterSum = 0) _asm MRS R0,SPSR BIC R0,R0,#NoInt MSR SPSR_c,R0 break; . 每关闭一次中断,中 断关闭计数器加1 每调用一次开中断函 数,该计数器减1,为 0时允许打开中断 关闭中断 打开中断 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 它们可以在任何情况下使用。它 们改变程序状态保留寄存器SPSR的相 应位段,而程序状态保留寄存器会在 软件中断退出时复制到程序状态寄存 器CPSR,任务的处理器模式就改变 了。 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 void SWI_Exception(int SWI_Num, int *Regs) . case 0x80: / 任务切换到系统模式 _asm MRS R0,SPSR BIC R0,R0,#0x1f ORR R0,R0,#SYS32Mode MSR SPSR_c,R0 break; case 0x81: / 任务切换到用户模式 _asm MRS R0,SPSR BIC R0,R0,#0x1f ORR R0,R0,#USR32Mode MSR SPSR_c,R0 break; . 使用内嵌汇编将处理器模式切换到 用户模式 使用内嵌汇编将处理器模式切换到 系统模式 编写OS_CPU_C.C软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 任务可以使用ARM的两种指令集的 任意一种运行,但是任务建立时默认的 只是一种指令集。如果任务使用的第一 条指令与默认的指令集不同,则程序运 行错误。所以增加两个函数TaskIsARM() 和TaskIsTHUMB()用于改变任务建立时 默认的指令集。 它们都有唯一的参数:需要改变的 任务的优先级,值得注意的是,这两个 函数必须在相应的任务建立后但还没有 运行时调用。 编写OS_CPU_C.C 软件中断异常服务程序 功能号简介 0x00任务级任务切换函数 0x01运行优先级最高的任务,由 OSStartHighRdy产生 0x02关中断 0x03开中断 0x80任务切换到系统模式 0x81任务切换到用户模式 0x82任务代码是ARM代码 0x83任务代码是THUMB代码 . case 0x82: / 任务代码是ARM代码 if (Regs0 OSTCBStkPtr1 安全起见,屏蔽模 式位以外的其它位 ORR R1, R0, #IRQMODE ; 把设置模式位设置 成需要的模式(IRQ) MSR CPSR_cxsf, R1 ; 转到IRQ 模式 LDR SP, =UndefStack ; 设置SP_irq ORR R1,R0,#FIQMODE MSR CPSR_cxsf, R1 ; FIQMode LDR SP, =FIQStack ORR R1, R0, #SVCMODE MSR CPSR_cxsf, R1 ; SVCMode LDR SP, =SVCStack 六、初始化应用程序执行环境 l映像一开始总是存储在ROM/Flash 里面的,其RO 部分既可 以在ROM/Flash里面执行,也可以转移到速度更快的RAM 中 去;而RW 和ZI 这两部分必须是需要转移到可写的RAM 里 去的。所谓应用程序执行环境的初始化,就是完成必要的 从ROM 到RAM 的数据传输和内容清零。 六、初始化

温馨提示

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

评论

0/150

提交评论