单片机与嵌入式系统:第7章移植μCOS-II到ARM7-1_第1页
单片机与嵌入式系统:第7章移植μCOS-II到ARM7-1_第2页
单片机与嵌入式系统:第7章移植μCOS-II到ARM7-1_第3页
单片机与嵌入式系统:第7章移植μCOS-II到ARM7-1_第4页
单片机与嵌入式系统:第7章移植μCOS-II到ARM7-1_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

1、第第7章章 移植移植C/OS-II 到到ARM7 西安交通大学西安交通大学单片机与嵌入式系统单片机与嵌入式系统 2021-4-302 第第7章章 移植移植C/OS-II 到到ARM7 1. C/OS-II简介简介 2.移植规划移植规划 3.移植移植 C/OS-II 4.移植代码应用到移植代码应用到LPC2000 2021-4-303 7.1 C/OS-II简介简介 概述概述 C/OS-II意为意为“微控制器操作系统版本微控制器操作系统版本2”, C/OS-II 是源码公开的著名实时内核,可用于各类是源码公开的著名实时内核,可用于各类8/16/32位单位单 片机或片机或DSP。从。从 C/OS算

2、起,该内核已有算起,该内核已有10多年应用多年应用 史,在诸多领域得到广泛应用。史,在诸多领域得到广泛应用。 C/OS-II是一个是一个完整的、可移植、可固化、可剪裁的完整的、可移植、可固化、可剪裁的 占先式实时多任务内核占先式实时多任务内核。 C/OS-II使用使用ANSI C语言语言 编写,包含一小部分汇编代码,使之可以供不同架构编写,包含一小部分汇编代码,使之可以供不同架构 的微处理器使用。至今,从的微处理器使用。至今,从8位到位到64位,位, C/OS-II已已 在超过在超过40种不同架构的微处理器上运行。种不同架构的微处理器上运行。 2021-4-304 7.1 C/OS-II简介简

3、介 C/OS-II特点特点 提供源代码提供源代码:购买:购买嵌入式实时操作系统嵌入式实时操作系统 C/OS-II 一书即可获得一书即可获得 C/OS-II V2.52版本的所有源代码。版本的所有源代码。 可移植性可移植性: C/OS-II的源代码绝大部分是使用移植性的源代码绝大部分是使用移植性 很强的很强的ANSI C写的,将与微处理器硬件相关的汇编语写的,将与微处理器硬件相关的汇编语 言使用量压缩到最低的限度,以使言使用量压缩到最低的限度,以使 C/OS-II便于移植便于移植 到其它微处理器上。到其它微处理器上。 可固化可固化:只要具备合适的软硬件工具,就可以将:只要具备合适的软硬件工具,就

4、可以将 C/O S-II嵌入到产品中成为产品的一部分。嵌入到产品中成为产品的一部分。 2021-4-305 7.1 C/OS-II简介简介 C/OS-II特点特点 可剪裁可剪裁(scalable): C/OS-II使用条件编译实现可剪裁,使用条件编译实现可剪裁, 用户程序可以只编译自己需要的(用户程序可以只编译自己需要的( C/OS-II)功能,)功能, 而不编译不要需要的功能,以减少而不编译不要需要的功能,以减少 C/OS-II对代码空对代码空 间和数据空间的占用。间和数据空间的占用。 可剥夺可剥夺(preemptive): C/OS-II是完全可剥夺型的实是完全可剥夺型的实 时内核,时内核

5、, C/OS-II总是运行就绪条件下优先级最高的总是运行就绪条件下优先级最高的 任务。任务。 多任务多任务: C/OS-II可以管理可以管理64个任务,然而,建议用个任务,然而,建议用 户保留户保留8个给个给 C/OS-II。这样,留给用户的应用程序最。这样,留给用户的应用程序最 多有多有56个任务。个任务。 2021-4-306 7.1 C/OS-II简介简介 C/OS-II特点特点 可确定性可确定性:绝大多数:绝大多数 C/OS-II的函数调用和服务的执的函数调用和服务的执 行时间具有确定性,即用户总是能知道行时间具有确定性,即用户总是能知道 C/OS-II的函的函 数调用与服务执行了多长

6、时间。数调用与服务执行了多长时间。 任务栈任务栈: C/OS-II的每个任务都有自己单独的栈,使的每个任务都有自己单独的栈,使 用用 C/OS-II的栈空间校验函数,可确定每个任务到底的栈空间校验函数,可确定每个任务到底 需要多少栈空间。需要多少栈空间。 系统服务系统服务: C/OS-II提供很多系统服务,例如信号量、提供很多系统服务,例如信号量、 互斥信号量、时间标志、消息邮箱、消息队列、块大互斥信号量、时间标志、消息邮箱、消息队列、块大 小固定的内存的申请与释放及时间管理函数等。小固定的内存的申请与释放及时间管理函数等。 2021-4-307 7.1 C/OS-II简介简介 C/OS-II

7、特点特点 中断管理中断管理:中断可以使正在执行的任务暂时挂起,如:中断可以使正在执行的任务暂时挂起,如 果优先级更高的任务被中断唤醒,则高优先级的任务果优先级更高的任务被中断唤醒,则高优先级的任务 在中断嵌套全部退出后立即执行,中断嵌套层数可达在中断嵌套全部退出后立即执行,中断嵌套层数可达2 55层。层。 稳定性与可靠性稳定性与可靠性: C/OS自自1992年以来已经有数百个年以来已经有数百个 商业应用。商业应用。2000年年7月,月, C/OS-II在一个航空项目中在一个航空项目中 得到了美国联邦航空管理局对商用飞机的、符合得到了美国联邦航空管理局对商用飞机的、符合RTC A DO178B标

8、准的认证。这表明,该操作系统的质量标准的认证。这表明,该操作系统的质量 得到了认证,可以在任何应用中使用。得到了认证,可以在任何应用中使用。 2021-4-308 作作 者者 及及 其其 著著 作作 Jean J.Labrosse 2021-4-309 第第7章章 移植移植C/OS-II 到到ARM7 1. C/OS-II简介简介 2.移植规划移植规划 3.移植移植 C/OS-II 4.移植代码应用到移植代码应用到LPC2000 2021-4-3010 7.2 移植规划移植规划 概述概述 所谓所谓“移植移植”,就是使一个实时内核能在其它,就是使一个实时内核能在其它 的微处理器或微控制器上运行。

9、的微处理器或微控制器上运行。 尽管大部分尽管大部分 C/OS-II的代码是用的代码是用C语言编写的,语言编写的, 但是在编写与处理器硬件相关的代码时还是不但是在编写与处理器硬件相关的代码时还是不 得不使用汇编语言。移植的主要工作就是得不使用汇编语言。移植的主要工作就是 。 2021-4-3011 7.2 移植规划移植规划 概述概述 在移植前针对所使用的微处理器进行规划,主在移植前针对所使用的微处理器进行规划,主 要有以下几个方面的考虑:要有以下几个方面的考虑: 1)编译器的选择、)编译器的选择、 2)任务模式的选择)任务模式的选择 3)支持的指令集。)支持的指令集。 2021-4-3012 C

10、/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定时器定时器 硬件硬件 软件软件 用于产生用于产生 系统时钟系统时钟 移植时需要移植时需要 编写的代码编写的代码 2021-4-3013 7.2 移植规划移植规划 1)编译器的选择)编译器的选择 目前,针对目前,针对A

11、RM处理器核的处理器核的C语言编译器有很多,如语言编译器有很多,如 SDT、IAR、TASKING和和GCC。 ,ADS为为SDT的升的升 级版,以后级版,以后ARM公司不再支持公司不再支持SDT,所以不会选择,所以不会选择S DT。 GCC虽然支持广泛,很多开发套件使用它作为编译器,虽然支持广泛,很多开发套件使用它作为编译器, 但是与但是与ADS比较其编译效率较低,这对充分发挥芯片比较其编译效率较低,这对充分发挥芯片 性能很不利,所以最终使用性能很不利,所以最终使用编译程序和调试。编译程序和调试。 2021-4-3014 7.2 移植规划移植规划 2)任务模式的取舍)任务模式的取舍 ARM7

12、处理器核具有处理器核具有 七种模式,其中除用户模式外其它七种模式,其中除用户模式外其它 均为特权模式。其中管理、中止、未定义、中断和快均为特权模式。其中管理、中止、未定义、中断和快 中断模式与相应异常相联系,任务使用这些模式不太中断模式与相应异常相联系,任务使用这些模式不太 适合。而系统模式除了是特权模式外,其它与用户模适合。而系统模式除了是特权模式外,其它与用户模 式一样,式一样, 因而任务使用模式只有因而任务使用模式只有。 为了尽量减少任务代码错误对整个程序的影响,缺省为了尽量减少任务代码错误对整个程序的影响,缺省 的任务模式定为的任务模式定为,可选为系统模式,同时提,可选为系统模式,同时

13、提 供接口使任务可以在这两种模式间切换。供接口使任务可以在这两种模式间切换。 2021-4-3015 7.2 移植规划移植规划 3)支持的指令集)支持的指令集 带带T变量的变量的ARM7处理器核具有两个指令集处理器核具有两个指令集 标准标准32位位ARM指令集指令集 16位位Thumb指令集指令集 两种指令集有不同的应用范围。为了最大限度两种指令集有不同的应用范围。为了最大限度 地支持芯片的特性,任务应当可以使用任意一地支持芯片的特性,任务应当可以使用任意一 个指令集并可以自由切换,而且不同的任务应个指令集并可以自由切换,而且不同的任务应 当可以使用不同的指令集。当可以使用不同的指令集。 20

14、21-4-3016 第第7章章 移植移植C/OS-II 到到ARM7 1. C/OS-II简介简介 2.移植规划移植规划 3.移植移植 C/OS-II 4.移植代码应用到移植代码应用到LPC2000 2021-4-3017 概述概述 要移植一个操作系统到一个特定的要移植一个操作系统到一个特定的CPU体系结体系结 构上并不是一件很容易的事情,它对移植者有构上并不是一件很容易的事情,它对移植者有 以下要求:以下要求: 对目标体系结构要有很深了解;对目标体系结构要有很深了解; 对对OS原理要有较深入的了解;原理要有较深入的了解; 对所使用的编译器要有较深入的了解;对所使用的编译器要有较深入的了解;

15、对需要移植的操作系统要有相当的了解;对需要移植的操作系统要有相当的了解; 对具体使用的芯片也要一定的了解。对具体使用的芯片也要一定的了解。 因为第因为第4点的影响是全局性的,它决定移植代码的框架和功能。点的影响是全局性的,它决定移植代码的框架和功能。 所以重点介绍第所以重点介绍第4点。点。 7.3 移植移植C/OS-II 参考参考ARMARM公司的公司的ARMARM体系结构体系结构文档文档 参考参考嵌入式实时操作系统嵌入式实时操作系统C/OS-IIC/OS-II 一书一书 参考参考ADSADS软件自带的软件自带的编译器和连接器手册编译器和连接器手册 参考参考嵌入式实时操作系统嵌入式实时操作系统

16、C/OS-IIC/OS-II 一书一书 参考具体芯片的参考具体芯片的数据手册数据手册和和使用手册使用手册 2021-4-3018 7.3 移植移植C/OS-II 概述概述 根据根据 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只有在以下苛刻条件下可以不只有在以下苛刻条件下可以不 使用,而

17、同时满足这些条件的微控制器几乎没有:使用,而同时满足这些条件的微控制器几乎没有: 可以直接使用可以直接使用C语言开关中断;语言开关中断; 可以直接使用可以直接使用C语言编写中断服务程序;语言编写中断服务程序; 可以直接使用可以直接使用C语言操作堆栈指针;语言操作堆栈指针; 可以直接使用可以直接使用C语言保存语言保存CPU的所有寄存器。的所有寄存器。 2021-4-3019 概述概述移植代码包括的内容移植代码包括的内容 移植内容移植内容类型类型所属文件所属文件描述描述 1 BOOLEAN, INT8U, INT8S 数据类型数据类型 OS_CPU.H与编译器无关的数据类型与编译器无关的数据类型

18、2 OS_STK数据类型数据类型 OS_CPU.H堆栈的数据类型堆栈的数据类型 3 OS_ENTER_CRITICAL( ) OS_EXIT_CRITICAL( ) 宏宏OS_CPU.H开关中断的代码开关中断的代码 4 OS_STK_GROWTH常量常量OS_CPU.H定义堆栈的增长方向定义堆栈的增长方向 5 OS_TASK_SW函数函数OS_CPU.H任务切换时执行的代码任务切换时执行的代码 1 OSTaskStkInit( )函数函数OS_CPU_C.C任务堆栈初始化函数任务堆栈初始化函数 2 OSInitHookBegin( ) OSInitHookEnd( ) 函数函数OS_CPU_C

19、.C 在执行某些操作时调用的在执行某些操作时调用的 用户函数,一般为空用户函数,一般为空 1 OSStartHighRdy( )函数函数*OS_CPU_A.ASM 进入多任务环境时运行优先级进入多任务环境时运行优先级 最高的任务,最高的任务, 2 OSIntCtxSw( )函数函数*OS_CPU_A.ASM中断退出时的任务切换函数中断退出时的任务切换函数 3 OSTickISR( ) 中断服务中断服务 程序程序 *OS_CPU_A.ASM 时钟节拍中断服务程序时钟节拍中断服务程序 实际上,还有一个文件很重要,它就是实际上,还有一个文件很重要,它就是IRQ.INCIRQ.INC,它定义了一个汇编

20、宏,它定义了一个汇编宏, 它是它是 C/OS-II for ARM7C/OS-II for ARM7通用的通用的。时钟。时钟 节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户 自己编写,不过可以通过自己编写,不过可以通过IRQ.INCIRQ.INC简化用户代码的编写。简化用户代码的编写。 2021-4-3020 7.3 移植移植C/OS-II 关于头文件关于头文件includes.h和和config.h C/OS-II要求所有要求所有.C文件都要包含头文件文件都要包含头文件inclu des.h,虽然可能会包含

21、一些实际不用的头文,虽然可能会包含一些实际不用的头文 件,增加编译时间,但增强了代码的可移植性。件,增加编译时间,但增强了代码的可移植性。 在移植中另外增加了一个头文件在移植中另外增加了一个头文件config.h,它,它 包含包含includes.h和特定的头文件和配置项。这和特定的头文件和配置项。这 样可以保障样可以保障 C/OS-II的系统文件的系统文件includes.h完完 全不必改动。所有的配置改变包括头文件的增全不必改动。所有的配置改变包括头文件的增 减均在减均在config.h中进行。中进行。 congfig.h UCOS内核文件内核文件 Includes.h 用户程序用户程序

22、2021-4-3021 一、编写一、编写OS_CPU.H 1、不依赖于编译的数据类型、不依赖于编译的数据类型 COS-II不使用不使用C语言中的语言中的short、int、long等数据等数据 类型的定义,因为它们与处理器类型有关,隐含类型的定义,因为它们与处理器类型有关,隐含 着不可移植性。代之以移植性强的整数数据类型,着不可移植性。代之以移植性强的整数数据类型, 这样,既直观又可移植,不过这就成了必须移植这样,既直观又可移植,不过这就成了必须移植 的代码。根据的代码。根据ADS编译器的特性,这些代码如程编译器的特性,这些代码如程 序清单序清单7.1所示。所示。 typedefunsigne

23、d 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; 7.3 移植移植C/OS-II 2021-4-3022 一、编写一、编写OS_CPU.H 2、使用软中断、使用软中

24、断SWI作底层接口作底层接口 ARM指令指令 系统模式系统模式 COS-IICOS-II运行时,处理器可能处于的状态运行时,处理器可能处于的状态 Thumb指令集指令集ARM指令集指令集 用户模式用户模式 系统模式系统模式 用户任务使用用户任务使用 的处理器模式的处理器模式 ARM7内核具有的指令集内核具有的指令集 ARM指令指令 用户模式用户模式 Thumb指令指令 系统模式系统模式 Thumb指令指令 用户模式用户模式 7.3 移植移植C/OS-II 2021-4-3023 一、编写一、编写OS_CPU.H 2、使用软中断、使用软中断SWI作底层接口作底层接口 为了使底层接口函数与处理器状

25、态无关,同时在为了使底层接口函数与处理器状态无关,同时在 任务调用相应的函数不需要知道函数位置,本移任务调用相应的函数不需要知道函数位置,本移 植使用软中断指令植使用软中断指令SWI作为底层接口,使用不同作为底层接口,使用不同 的功能号区分不同的函数。软中断功能号分配如的功能号区分不同的函数。软中断功能号分配如 下表所示,未列出的为保留功能。下表所示,未列出的为保留功能。 功能号功能号接口函数接口函数简介简介 0 x00void OS_TASK_SW(void)任务级任务切换函数任务级任务切换函数 0 x01_OSStartHighRdy(void) 运行优先级最高的任务运行优先级最高的任务,

26、由由OS StartHighRdy产生产生 0 x02void OS_ENTER_CRITICAL(void)关中断关中断 0 x03Void OS_EXIT_CRITICAL(void)开中断开中断 0 x80Void ChangeToSYSMode(void)任务切换到系统模式任务切换到系统模式 0 x81Void ChangeToUSRMode(void)任务切换到用户模式任务切换到用户模式 0 x82Void TaskIsARM(INT8U prio)任务代码是任务代码是ARM代码代码 0 x83Void TaskIsTHUMB(INT8U prio)任务代码是任务代码是THUMB代码

27、代码 7.3 移植移植C/OS-II 2021-4-3024 一、编写一、编写OS_CPU.H 2、使用软中断、使用软中断SWI作底层接口作底层接口 用软中断作为操作系统的底层接口就需要在用软中断作为操作系统的底层接口就需要在C语言语言 中使用中使用SWI指令。指令。 在在ADS中,有一个关键字中,有一个关键字_swi, 用它声明一个不存在的函数,则调用这个函数就用它声明一个不存在的函数,则调用这个函数就 在调用这个函数的地方插入一条在调用这个函数的地方插入一条SWI指令,并且指令,并且 可以指定功能号。同时,这个函数也可以有参数可以指定功能号。同时,这个函数也可以有参数 和返回值,其传递规则

28、与一般函数一样。和返回值,其传递规则与一般函数一样。 _swi(0 x00) void OS_TASK_SW(void); /* 任务级任务切换函数任务级任务切换函数 */ _swi(0 x01) void _OSStartHighRdy(void); /* 运行优先级最高的任务运行优先级最高的任务 */ _swi(0 x02) void OS_ENTER_CRITICAL(void); /* 关中断关中断 */ _swi(0 x03) void OS_EXIT_CRITICAL(void); /* 开中断开中断 */ _swi(0 x80) void ChangeToSYSMode(void

29、); /* 任务切换到系统模式任务切换到系统模式 */ _swi(0 x81) void ChangeToUSRMode(void); /* 任务切换到用户模式任务切换到用户模式 */ _swi(0 x82) void TaskIsARM(INT8U prio); /* 任务代码是任务代码是ARM代码代码 */ _swi(0 x83) void TaskIsTHUMB(INT8U prio); /* 任务代码是任务代码是THUMB代码代码 */ 程序中调用软中程序中调用软中 断时使用的函数断时使用的函数 名名 软件中断号软件中断号 该调用不返该调用不返 回参数回参数 7.3 移植移植C/OS-

30、II 2021-4-3025 一、编写一、编写OS_CPU.H 3、堆栈生长方式、堆栈生长方式 COS-II使用结构常量使用结构常量OS_STK_GROWTH中指定中指定 堆栈的生长方式:堆栈的生长方式: 置该常量置该常量=0,表示堆栈从下往上长。,表示堆栈从下往上长。 置该常量置该常量=1,表示堆栈从上往下长。,表示堆栈从上往下长。 虽然虽然ARM处理器核均支持两种方式,但处理器核均支持两种方式,但ADS的的C语言编语言编 译器仅支持从上往下长,并且必须是满递减堆栈,所以译器仅支持从上往下长,并且必须是满递减堆栈,所以 该常量该常量=1。 #define OS_STK_GROWTH 1 7.

31、3 移植移植C/OS-II 2021-4-3026 二、编写二、编写Os_cpu_c.c 1、OSTaskStkInit( ) 该函数用于初始化任务堆栈,使任务的堆栈看起该函数用于初始化任务堆栈,使任务的堆栈看起 来就像刚发生中断一样。即任务被执行时,就像来就像刚发生中断一样。即任务被执行时,就像 从中断返回一样。从中断返回一样。 在编写此函数之前,必须先确定任务的堆栈结构。在编写此函数之前,必须先确定任务的堆栈结构。 而任务的堆栈结构是与而任务的堆栈结构是与CPU的体系结构、编译器的体系结构、编译器 有密切的关联。本移植的堆栈结构如下图所示。有密切的关联。本移植的堆栈结构如下图所示。 任务入

32、栈的任务入栈的 其它数据其它数据 LR R12 R11 R10 R9 R8 . 栈底栈底 任务环境开始任务环境开始 SP PC R2 R1 R0 OSEnterSum 空闲空间空闲空间 7.3 移植移植C/OS-II 2021-4-3027 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; *

33、-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|0 x00); *-stk = 0; return (stk); 入栈的数据入栈的数据 二、编写二、编写Os_cpu_c.c 1、OSTaskStkInit( ) 2021-4-3028 OS_STK *OSTaskStkInit (void (*t

34、ask)(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; *-

35、stk = (USER_USING_MODE|0 x00); *-stk = 0; return (stk); 该数据比较特别,它用于保存该任务关中断的次数,该数据比较特别,它用于保存该任务关中断的次数, 它在调用它在调用OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( )时加时加1 1 ,在调用,在调用 OS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) 时减时减1 1。 这样每个任务都可以独立控制本任务的中断允许状这样每个任务都可以独立控制本任务的中断允许状 态,而不会影响其它任务的中断允许状态。因此关中断态,而不会影响其它任务的中断

36、允许状态。因此关中断 和开中断就可以嵌套。和开中断就可以嵌套。 二、编写二、编写Os_cpu_c.c 1、OSTaskStkInit( ) 2021-4-3029 功能号功能号接口函数接口函数简介简介 0 x00void OS_TASK_SW(void)任务级任务切换函数任务级任务切换函数 0 x01_OSStartHighRdy(void) 运行优先级最高的任务运行优先级最高的任务,由由OSStartHigh Rdy产生产生 0 x02void OS_ENTER_CRITICAL(void)关中断关中断 0 x03Void OS_EXIT_CRITICAL(void)开中断开中断 0 x80

37、Void ChangeToSYSMode(void)任务切换到系统模式任务切换到系统模式 0 x81Void ChangeToUSRMode(void)任务切换到用户模式任务切换到用户模式 0 x82Void TaskIsARM(INT8U prio)任务代码是任务代码是ARM代码代码 0 x83Void TaskIsTHUMB(INT8U prio)任务代码是任务代码是THUMB代码代码 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 前面介绍过,操作系统与硬件相关的底层函数使前面介绍过,操作系统与硬件相关的底层函数使 用软件中断作为接口,如下表。移植代

38、码中一个用软件中断作为接口,如下表。移植代码中一个 重要的工作就是重要的工作就是。 2021-4-3030 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务, 由由OSStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代代 码码 void SWI_Exception(int SWI_Num, int *Regs)

39、 OS_TCB *ptcb; switch(SWI_Num) case 0 x02: / 关中断关中断 . case 0 x03: / 开中断开中断 . case 0 x80: / 任务切换到系统模式任务切换到系统模式 . case 0 x81: / 任务切换到用户模式任务切换到用户模式 . case 0 x82: / 任务代码是任务代码是ARM代码代码 . case 0 x83: / 任务代码是任务代码是Thumb代码代码 . default: 这两个软件中断使这两个软件中断使 用汇编代码完成用汇编代码完成 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序

40、 2021-4-3031 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由 OSStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代码 C/OS-IIC/OS-II的启动多任务环境的函数的启动多任务环境的函数 叫做叫做OSStart()OSStart(),用户在调用,用户在调用OSStart()OSSt

41、art() 之前,必须已经建立了一个或更多任之前,必须已经建立了一个或更多任 务。务。OSStart()OSStart()最终调用函数最终调用函数 OSStartHighRdy()OSStartHighRdy()运行多任务启动前运行多任务启动前 优先级最高的任务。优先级最高的任务。 void void OSStartHighRdyOSStartHighRdy(void)(void) _OSStartHighRdy(); _OSStartHighRdy(); 该函数在该函数在Os_cpu_a.sOs_cpu_a.s文件中实现。文件中实现。 二、编写二、编写Os_cpu_c.c 2、软件中断异常服

42、务程序、软件中断异常服务程序 2021-4-3032 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由 OSStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代码 关中断和开中断是为了保护临界关中断和开中断是为了保护临界 段代码。这些代码与处理器有关,是段代码。这些代码与处理器有关,是 需要移植的代码。

43、在需要移植的代码。在ARMARM处理器核中处理器核中 关中断和开中断时通过改变程序状态关中断和开中断时通过改变程序状态 寄存器寄存器CPSRCPSR中的相应控制位实现。由中的相应控制位实现。由 于使用了软件中断,程序状态寄存器于使用了软件中断,程序状态寄存器 CPSRCPSR保存到程序状态保存寄存器保存到程序状态保存寄存器SPSRSPSR 中,软件中断退出时会将中,软件中断退出时会将SPSRSPSR恢复到恢复到 CPSRCPSR中,所以程序只要改变程序状态中,所以程序只要改变程序状态 保存寄存器保存寄存器SPSRSPSR中的相应的控制位就中的相应的控制位就 可以了。可以了。 二、编写二、编写O

44、s_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3033 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由 OSStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代码 void SWI_Exception(int SWI_Num, int *Regs) . case 0

45、 x02: / 关中断关中断 _asm MRS R0,SPSR ORR R0,R0,#NoInt MSR SPSR_c,R0 OsEnterSum+; break; case 0 x03: / 开中断开中断 if (-OsEnterSum = 0) _asm MRS R0,SPSR BIC R0,R0,#NoInt MSR SPSR_c,R0 break; . 每关闭一次中断,中每关闭一次中断,中 断关闭计数器加断关闭计数器加1 1 每调用一次开中断函每调用一次开中断函 数,该计数器减数,该计数器减1 1, 为为0 0时允许打开中断时允许打开中断 关闭中断关闭中断 打开中断打开中断 二、编写二

46、、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3034 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由O SStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代码 它们可以在任何情况下使用。它们改它们可以在任何情况下使用。它们改 变程序状态保留寄存器变程序状

47、态保留寄存器SPSRSPSR的相应位的相应位 段,而程序状态保留寄存器会在软件段,而程序状态保留寄存器会在软件 中断退出时复制到程序状态寄存器中断退出时复制到程序状态寄存器 CPSRCPSR,任务的处理器模式就改变了。,任务的处理器模式就改变了。 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3035 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由 OSStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式

48、任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代码 void SWI_Exception(int SWI_Num, int void SWI_Exception(int SWI_Num, int * *Regs)Regs) . . case case 0 x800 x80: / : / 任务切换到系统模式任务切换到系统模式 _asm_asm MRS MRS R0,SPSRR0,SPSR BIC BIC R0,R0,#0 x1fR0,R0,#0 x1f ORR ORR R0,R0,#S

49、YS32ModeR0,R0,#SYS32Mode MSR MSR SPSR_c,R0SPSR_c,R0 break; break; case case 0 x810 x81: / : / 任务切换到用户模式任务切换到用户模式 _asm_asm MRS MRS R0,SPSRR0,SPSR BIC BIC R0,R0,#0 x1fR0,R0,#0 x1f ORR ORR R0,R0,#USR32ModeR0,R0,#USR32Mode MSR MSR SPSR_c,R0SPSR_c,R0 break; break; . . 使用内嵌汇编将处理器模式切换到用户使用内嵌汇编将处理器模式切换到用户 模

50、式模式 使用内嵌汇编将处理器模式切换到系统使用内嵌汇编将处理器模式切换到系统 模式模式 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3036 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由O SStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代

51、码 任务可以使用任务可以使用ARMARM的两种指令集的的两种指令集的 任意一种运行,但是任务建立时默认任意一种运行,但是任务建立时默认 的只是一种指令集。如果任务使用的的只是一种指令集。如果任务使用的 第一条指令与默认的指令集不同,则第一条指令与默认的指令集不同,则 程序运行错误。所以增加两个函数程序运行错误。所以增加两个函数 TaskIsARM()TaskIsARM()和和TaskIsTHUMB()TaskIsTHUMB()用于改用于改 变任务建立时默认的指令集。变任务建立时默认的指令集。 它们都有唯一的参数:需要改变的它们都有唯一的参数:需要改变的 任务的优先级,值得注意的是,这两任务的优

52、先级,值得注意的是,这两 个函数必须在相应的任务建立后但还个函数必须在相应的任务建立后但还 没有运行时调用。没有运行时调用。 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3037 功能号功能号简介简介 0 x00任务级任务切换函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务,由由OS StartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x8

53、3任务代码是任务代码是THUMB代码代码 . . case case 0 x820 x82: / : / 任务代码是任务代码是ARMARM代码代码 if (Regs0 = OS_LOWEST_PRIO)if (Regs0 OSTCBStkPtr1 (1 5); break; break; case case 0 x830 x83: / : / 任务代码是任务代码是ThumbThumb代码代码 if (Regs0 = OS_LOWEST_PRIO)if (Regs0 OSTCBStkPtr1 |= ptcb - OSTCBStkPtr1 |= (1 5); (1 5); break; break

54、; . . 被设置的任务号一定不能被设置的任务号一定不能 大于最低优先级任务大于最低优先级任务 获取指定任务的任务控制获取指定任务的任务控制 块的地址块的地址 修改任务堆栈中修改任务堆栈中CPSRCPSR的值,的值, 在任务重新运行时,切换到在任务重新运行时,切换到 ARMARM指令方式指令方式 修改任务堆栈中修改任务堆栈中CPSRCPSR的值,的值, 在任务重新运行时,切换到在任务重新运行时,切换到 ThumbThumb指令方式指令方式 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3038 功能号功能号简介简介 0 x00任务级任务切换

55、函数任务级任务切换函数 0 x01运行优先级最高的任务运行优先级最高的任务, 由由OSStartHighRdy产生产生 0 x02关中断关中断 0 x03开中断开中断 0 x80任务切换到系统模式任务切换到系统模式 0 x81任务切换到用户模式任务切换到用户模式 0 x82任务代码是任务代码是ARM代码代码 0 x83任务代码是任务代码是THUMB代码代码 注意注意: 这两个函数必须在相应的任务建立后这两个函数必须在相应的任务建立后 但还没有运行时调用。但还没有运行时调用。 如果在低优先级的任务中创建高优先如果在低优先级的任务中创建高优先 级的任务就十分危险了。此时,解决的方级的任务就十分危险

56、了。此时,解决的方 法有三种:法有三种: 1.1. 高优先级任务使用默认的指令集;高优先级任务使用默认的指令集; 2.2. 改变函数改变函数OSTaskCreateHook()OSTaskCreateHook()使任务默认使任务默认 不是处于就绪状态,建立任务后调用函数不是处于就绪状态,建立任务后调用函数 OSTaskResume()OSTaskResume()来使任务进入就绪状态;来使任务进入就绪状态; 3.3. 建立任务时禁止任务切换,调用函数建立任务时禁止任务切换,调用函数 TaskIsARM()TaskIsARM()或或TaskIsTHUMB()TaskIsTHUMB()后再允许任后再

57、允许任 务切换。务切换。 二、编写二、编写Os_cpu_c.c 2、软件中断异常服务程序、软件中断异常服务程序 2021-4-3039 二、编写二、编写Os_cpu_c.c 3、Hook( )函数函数 在在Os_cpu_c.c文件中还有许多钩子函数,它们在文件中还有许多钩子函数,它们在 某个特定的系统动作时被调用,允许执行函数中某个特定的系统动作时被调用,允许执行函数中 的用户代码。这些函数默认是空函数,用户根据的用户代码。这些函数默认是空函数,用户根据 实际情况添加相关代码。它们分别如下表所示。实际情况添加相关代码。它们分别如下表所示。 函数名函数名被执行条件被执行条件 OSInitHook

58、Begin( )在开始执行在开始执行OSInit( )函数时被执行函数时被执行 OSInitHookEnd( )在在OSInit()函数结束时被执行函数结束时被执行 OSTaskCreateHook( )在任务建立时被调用在任务建立时被调用 OSTaskDelHook( )在任务删除时被调用在任务删除时被调用 OSTaskSwHook( )在进行任务切换时被调用在进行任务切换时被调用 OSTaskStatHook( )被统计任务调用,每秒执行一次被统计任务调用,每秒执行一次 OSTCBInitHook( )在建立所有的在建立所有的TCB后,由后,由OSTCBInit函数调用函数调用 OSTim

59、eTickHook( )每个时钟节拍产生后被调用每个时钟节拍产生后被调用 OSTaskIdleHook( )由空闲任务调用由空闲任务调用 2021-4-3040 7.3 移植移植C/OS-II 三、编写三、编写Os_cpu_a.s 在在Os_cpu_a.s文件中有文件中有 软件中断的汇编接口程序软件中断的汇编接口程序 任务切换程序任务切换程序 OS启动时运行就绪最高优先级任务的程序启动时运行就绪最高优先级任务的程序 2021-4-3041 SoftwareInterrupt LDR SP, StackSvc STMFD SP!, R0-R3, R12, LR MOV R1, SP MRS R3

60、, SPSR TST R3, #T_bit LDRNEH R0, LR,#-2 BICNE R0, R0, #0 xff00 LDREQ R0, LR,#-4 BICEQ R0, R0, #0 xFF000000 CMP R0, #1 LDRLO PC, =OSIntCtxSw LDREQ PC, =_OSStartHighRdy BL SWI_Exception LDMFD SP!, R0-R3, R12, PC 保护被中断的现场保护被中断的现场 将要用到的寄存器压栈将要用到的寄存器压栈 判断中断前的指令集类型判断中断前的指令集类型 从产生软件中断从产生软件中断 的指令中提取的指令中提取 中

温馨提示

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

评论

0/150

提交评论