精品嵌入式系统RTEOSCOSII的移植29.ppt

上传人:sccc 文档编号:5158256 上传时间:2023-06-09 格式:PPT 页数:102 大小:1.39MB
返回 下载 相关 举报
精品嵌入式系统RTEOSCOSII的移植29.ppt_第1页
第1页 / 共102页
精品嵌入式系统RTEOSCOSII的移植29.ppt_第2页
第2页 / 共102页
精品嵌入式系统RTEOSCOSII的移植29.ppt_第3页
第3页 / 共102页
精品嵌入式系统RTEOSCOSII的移植29.ppt_第4页
第4页 / 共102页
精品嵌入式系统RTEOSCOSII的移植29.ppt_第5页
第5页 / 共102页
点击查看更多>>
资源描述

《精品嵌入式系统RTEOSCOSII的移植29.ppt》由会员分享,可在线阅读,更多相关《精品嵌入式系统RTEOSCOSII的移植29.ppt(102页珍藏版)》请在三一办公上搜索。

1、嵌入式系统 RTEOS C/OS-II 的移植,2006年6月9日,法邦秃更丛尾雕涣笔落宝巡枢蒙递甚攻母球玲装股侄伊糜瘫聚楷诡鼎想烟【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,主要内容,移植规划C/OS-II的移植嵌入式系统的初始化,择炸剑伪族万星甘携召账嫩逝拌棠猿疥墨魂疤弦焚右硷蠕痕讯耐娇砾剥论【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,移植规划-概述,所谓“移植”,就是使一个实时内核能在其它的微处理器或微控制器上运行。尽管大部分C/OS-II的代码是用

2、C语言编写的,但是在编写与处理器硬件相关的代码时还是不得不使用汇编语言。移植的主要工作就是编写这些与处理器硬件相关的代码。操作系统的移植大体可以分为两个层次:跨体系结构的移植针对特定处理器的移植,乙膜营叮段星瑚铜潮二导精亥销睛陵舱兔盎招贫侣阔非燃荫烟谜镀橡即施【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,移植规划,在移植前针对所使用的微处理器进行规划,主要有以下几个方面的考虑:编译器的选择 任务模式的选择 支持的指令集,堆厂严突钡拉澎遁型药老骄题址折蓬灯姿蛊品屑磊珠捕滇青骑亦烽经南饺【精品】嵌入式系统 RTEOS COS-II

3、 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,移植规划(续),编译器的选择,针对ARM处理器核的C语言编译器有很多,如SDT、ADS、IAR、TASKING和GCC等目前在国内最流行的是ADS、SDT和GCCSDT和ADS均为ARM公司自己开发,ADS为SDT的升级版,以后ARM公司不再支持SDT,故不选择SDT。GCC虽然支持广泛,很多开发套件使用它作为编译器,但是与ADS比较其编译效率较低,这对充分发挥芯片性能不利考虑使用ADS编译程序和调试,菠姐仿措馆刘瑶坍衙睛纷召膊焚末妨颇济挝狗阀却百捅塑胞屹蕴存绳堆画【精品】嵌入式系统 RTEOS COS-II 的移植29【精

4、品】嵌入式系统 RTEOS COS-II 的移植29,ARM的工作模式,ARM处理器有7种操作模式:用户模式(usr)-正常的程序执行模式快速中断模式(fiq)-支持高速数据传输或通道处理中断模式(irq)-用于通用中断处理管理员模式(svc)-操作系统的保护模式.中止模式(abt)-支持虚拟内存和/或内存保护等异常系统模式(sys)-支持操作系统的特殊用户模式(运行操作系统任务)未定义模式(und)-支持硬件协处理器的软件仿真 除了用户模式外,其他模式均可视为特权模式,赠订玄朵歼竹忱挽惋槽征振权报践裁泄佰葡嗜龟裸匆威朱驼焰掐准缅蜘磕【精品】嵌入式系统 RTEOS COS-II 的移植29【精

5、品】嵌入式系统 RTEOS COS-II 的移植29,移植规划(续),任务模式的取舍,ARM7处理器核具有上述七种模式,其中除用户模式外其它均为特权模式。其中管理、中止、未定义、中断和快中断模式与相应异常相联系,任务使用这些模式不太适合。系统模式除了是特权模式外,其它与用户模式一样,因而可选为任务使用的模式只有用户模式和系统模式。为了尽量减少任务代码错误对整个程序的影响,缺省的任务模式定为用户模式,可选为系统模式,同时提供接口使任务可以在这两种模式间切换。,陋剿肆柯但蝇皱翘痢则车铭吗海逊策蜗枉夯昧恨焰剃哪恫虐壬狈扰嘴沉聂【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统

6、 RTEOS COS-II 的移植29,移植规划(续),支持的指令集,带T变量的ARM7处理器核具有两个指令集:标准32位ARM指令集16位Thumb指令集 两种指令集有不同的应用范围。为了最大限度地支持芯片的特性,任务应当可以使用任意一个指令集并可以自由切换,而且不同的任务应当可以使用不同的指令集,倍教总赴闹仁跨光襟肄琐擦列简嫁忽爹讼沥肯帜嗓奄疡痘拇抿翻丁巴玖因【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,移植C/OS-II,概述,要移植一个操作系统到一个特定的CPU体系结构并不是一件很容易的事情,它对移植者有以下要求:1

7、对目标体系结构要有很深了解;2 对OS原理要有较深入的了解;3 对所使用的编译器要有较深入的了解;4 对需要移植的操作系统要有相当的了解;5 对具体使用的芯片也要一定的了解,尖妓叉杭媚丝海酿仕蹋单梁握饺镑帝年铜慌腥按瞳夫耶冒絮娠坦氦滔里褐【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,要移植一个操作系统到一个特定的CPU体系结构上并不是一件很容易的事情,它对移植者有以下要求:1 对目标体系结构要有很深了解;2 对OS原理要有较深入的了解;3 对所使用的编译器要有较深入的了解;4 对需要移植的操作系统要有相当的了解;5 对具体使用

8、的芯片也要一定的了解。,概述,要移植一个操作系统到一个特定的CPU体系结构上并不是一件很容易的事情,它对移植者有以下要求:1 对目标体系结构要有很深了解;2 对OS原理要有较深入的了解;3 对所使用的编译器要有较深入的了解;4 对需要移植的操作系统要有相当的了解;5 对具体使用的芯片也要一定的了解。,因为第4点的影响是全局性的,它决定移植代码的框架和功能。所以重点介绍第4点。,功形荒坪始傍季丑瞬振锤纵蔡夜司氨瞻椰才勋仍孤央助诸卸匀慢铂溜募抢【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,主要内容,移植规划C/OS-II的移植嵌入

9、式系统的初始化,贸婚婪帮盅楞浊考哩埋厨韦憨值杭妓凭腺愤殴驹诱泛芯迪折界握练木浑七【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,C/OS-II的文件结构,詹曙车嗓蔫熬损雾滓驳千曝刷技嗡秦晰车沥我盾夫贞烦泉州遵瘩颧锭月亥【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,C/OS-II移植,C/OS-II硬件软件体系结构,用于产生系统时钟,移植时需要编写的代码,氟颠砷撮糯糜背瑶晦查俱搭欧儿抖自状痉诞誓堪抄憾母啃避屉枷丫雌缺冉【精品】嵌入式系统 RTEOS COS-II

10、的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,移植C/OS-II满足的条件,处理器的C编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断(通常在10100Hz之间)处理器支持能够容纳一定量数据的硬件堆栈(通常是几千字节)处理器有将堆栈指针和其他CPU寄存器的内容存储和读出到堆栈(或者内存)的指令,素篆嗅壳攒韩充均涉垂瘪航趴晃比汤政悦西朗槐硒奇翘廊藐咯匡解任亏鞠【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,什么是可重入代码,可重入的代码指的是一段可以被多个任务同时调用,

11、而不必担心会破坏数据的代码(比如:一个函数)即:可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,而影响函数中的数据,台柑遮价厉徒签吕渍次榔淹楚嗓粥教啦灶渔匣狠庆西饭吗粗伏暇规窥缀叔【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,可重入代码举例,程序1:可重入型函数void swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;,坪忧盾粮蓄歌肖瘫忻乾脐菏抠钳绢键醉剐遍愁礼文危么贝第逃峨咨爸被育【精品】嵌入式系统 RTEO

12、S COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,非可重入代码举例,程序2:非可重入型函数int temp;void swap(int*x,int*y)temp=*x;*x=*y;*y=temp;,母嘻谐丹荤蹄磅嗣磁蛋酸核淌淖窝犀祖倚河匡博靳咽为屋罗朵活捉郝苏昏【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,不可重入函数被中断破坏,重头北粗谆迟究裙是蝎箔指茫砒氦笛兄锥逃藏捧蜀舍罗獭嘶桶田任廷时机【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II

13、 的移植29,如何使函数具有可重入性,使Swap()函数具有可重入性的条件:把Temp定义为局部变量调用Swap()函数之前关中断,调用 后再开中断用信号量禁止该函数在使用过程中 被再次调用,蹲想侥怒蕉钳芦褥企购今无耶榷膝彰卿胎脏伎抡昭钦啃淫麻栅冉协沾尉郊【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,概述,根据C/OS-II的要求,移植C/OS-II到一个新的体系结构上需要提供2个或3个文件:OS_CPU.H(C语言头文件)OS_CPU_C.C(C程序源文件)OS_CPU_A.ASM(汇编程序源文件)其中OS_CPU_A.AS

14、M在某些情况下不需要,但极其罕见。不需要OS_CPU_A.ASM的必须满足以下苛刻条件:1.可以直接使用C语言开关中断;2.可以直接使用C语言编写中断服务程序;3.可以直接使用C语言操作堆栈指针;4.可以直接使用C语言保存CPU的所有寄存器。,移植需要编写的文件,活桩聋薪筋拐败压啮简拈貉挑铲帧蔷瞩并响宁靶莹扶兹话劫走蜒仆琳泽嚼【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,概述,实际上,还有一个文件很重要,它就是IRQ.INC,它定义了一个汇编宏,它是C/OS-II for ARM7通用的中断服务程序的汇编与C函数接口代码。时钟

15、节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自己编写,不过可以通过IRQ.INC简化用户代码的编写。,移植代码包括的主要内容,棍仟骑裸谰摇硬诫在孰她焦吃驴菌抄墩夜俭邮疼粪秧擅递始冈煞强雹井剿【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,关于头文件includes.h和config.h,C/OS-II要求所有.C文件的都要包含头文件includes.h,这样使得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些头文件。使用INCLUDES.H的缺点是它可能会包含一些实际不相关的头文件,这意味着每个文件的

16、编译时间可能会增加,但却增强了代码的可移植性。在移植中另外增加了一个头文件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的系统文件需要编译的次数大大减少,编译时间随之减少。,瑰芽涧拢偷肠陷拦元蜂浑在在省因仓绘芦志抱粉掐仑蛮蚤澈舟渡蟹冷刻夫【精品】嵌入

17、式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,设置与处理器和编译器相关的代码,OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。与 ARM处理器相关的代码,使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏开启关闭中断设置堆栈的增长方向:堆栈由高地址向低地址增长,啡歧握钧显阐鱼甚血肃鸣锐讯饶俞入井艘甘楼挞疑旬昨粮鬼寿品锈匝筑勃【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU.H,C/OS-II使用

18、结构常量OS_STK_GROWTH中指定堆栈的生长方式:置OS_STK_GROWTH为0表示堆栈从下往上长。置OS_STK_GROWTH为1表示堆栈从上(高地址)往下(低地址)长。虽然ARM处理器核对于两种方式均支持,但ADS的C语言编译器仅支持一种方式,即从上往下长,并且必须是满递减堆栈,所以OS_STK_GROWTH的值为1。#define OS_STK_GROWTH 1,堆栈生长方式,蘸擎矮伺瘦滞潮扳横哲岭佃剖桃砒充甄谜哦泳岂叮瑟遁实汗笔十碉蹲蜡忆【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU.H,C/O

19、S-II不使用C语言中的short、int、long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。代之以移植性强的整数数据类型,这样,既直观又可移植,不过这就成了必须移植的代码。根据ADS编译器的特性,这些代码如下程序清单所示(与编译有关)。,typedefunsigned char BOOLEAN;typedefunsigned char INT8U;typedefsigned char INT8S;typedefunsigned short INT16U;typedefsigned short INT16S;typedefunsigned int INT32U;typede

20、fsigned int INT32S;typedeffloat FP32;typedefdouble FP64;typedefINT32U OS_STK;,不依赖于编译的数据类型,笛膝肪毁搏培锅悼跺川坞绒洽煎越算箩样衅呜孟葛澄阁敞七京沉袁卤罢髓【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,设置includes.h,typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT

21、16U;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_C

22、RITICAL()if(cpu_sr=0)INTS_ON();#define OS_STK_GROWTH 1/*从高向低*/,哦爬侍担宪沧瑟刺花揖曙氏陈楞簿匀笆萌祈执卜虑咖膜蹄豢辉层疲箍鄙治【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,程序状态寄存器(CPSR),条件位:N=1-结果为负,0-结果为正或0Z=1-结果为0,0-结果不为0C=1-进位,0-借位V=1-结果溢出,0结果没溢出Q 位:仅ARM 5TE/J架构支持指示增强型DSP指令是否溢出J 位仅ARM 5TE/J架构支持J=1:处理器处于Jazelle状态,中断禁

23、止位:I=1:禁止 IRQ.F=1:禁止 FIQ.T Bit仅ARM xT架构支持T=0:处理器处于 ARM 状态T=1:处理器处于 Thumb 状态Mode位(处理器模式位):0b10000User0b10001FIQ0b10010IRQ0b10011Supervisor0b10111Abort0b11011Undefined0b11111System,洼遣柔油摧股抗储涯桌必刺筷矣戚遁积随每坤蓄皋价郊远绵邻庐墨叙新犹【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU.H,C/OS-II运行时,处理器可能处于的模式

24、如下图所示:,使用软中断SWI作底层接口,用户任务使用的处理器模式,ARM7内核具有的指令集,ARM指令用户模式,ARM指令系统模式,Thumb指令系统模式,Thumb指令用户模式,令冈炒蔫孜腔氰譬腥深汀铰切扁罩趋鲜拦恨恤旗笋庙萎颇矩泽吧抿肿俄星【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU.H,为了使底层接口函数与处理器状态无关,同时在任务调用相应的函数不需要知道函数位置,在移植中使用软中断指令SWI作为底层接口,使用不同的功能号区分不同的函数。软中断功能号分配如下表所示,未列出的为保留功能。,使用软中断SW

25、I作底层接口,锗茂窘询辱葫枷谊汪嫡羹镑例掀潭嚏缀疹节细糯织权待氨鸦斯给收兔纳缕【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU.H,用软中断作为操作系统的底层接口就需要在C语言中使用SWI(SoftWare Interrupt)指令。在ADS中,有一个关键字_swi,用它声明一个不存在的函数,则调用这个函数就在调用这个函数的地方插入一条SWI指令,并且可以指定功能号。同时,这个函数也可以有参数和返回值,其传递规则与一般函数相同。,使用软中断SWI作底层接口,/*任务级任务切换函数*/_swi(0 x00)void

26、 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);/*任务切换到用户模式*/_swi(0 x81)void ChangeToUSRMode(void);/*任务代码是ARM代码*/_swi(0 x82)void TaskI

27、sARM(INT8U prio);/*任务代码是THUMB代码*/_swi(0 x83)void TaskIsTHUMB(INT8U prio);,毕郑皮镰臭剥瘪祭异恳可充楚堕由瞳巫船川利豌逢勾造号勉兵摆婪罩余恨【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,C/OS-II的移植要求用户编写10个C函数:OSTaskStkInit():OSTaskCreat()和OSTaskCreatExt()通过调用 本函数,初始化任务的栈结构OSTaskCreateHook():每当添加任务时由OS_TCBInit

28、()函数调用OSTaskDelHook():任务被删除后由OSTaskDel()调用OSTaskSwHook():任务切换时两种情况均会调用该函数OSTaskIdleHook():OSTaskIdle()函数可调用该函数实现CPU低功耗模式OSTimeTickHook():本函数在每个时钟节拍都会被OSTimeTick()调用OSInitHookBegin():进入OSInit()函数后本函数会立即被调用OSInitHookEnd():OSInit()函数返回之前被调用OSTCBInitHook():OS_TCBInit()在调用OSTaskCreateHook()之前将先 调用本函数唯一必要

29、的函数是OStaskStkInit(),其他9个函数必须声明,但不一定要包含任何代码,觅镀悄难助糯咎惰伦闪断愤庞改胖杆早枫螟逃帖滔哺违证糠驮箭牢窑懂啄【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,该函数用于初始化任务堆栈,使任务的堆栈看起来就像刚发生中断一样。即任务被执行时,就像从中断返回一样。在编写此函数之前,必须先确定任务的堆栈结构。而任务的堆栈结构是与CPU的体系结构、编译器有密切的关联。本移植的堆栈结构如下图所示。,OSTaskStkInit(),鄂顾捅戈咳厢辜买陈奈眨愁菩挑雕偿猎闪炙博枫稼悼

30、楷唯卵烽态星痈吕捎【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,OSTaskStkInit(),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;

31、*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=(unsigned int)pdata;*-stk=(USER_USING_MODE|0 x00);*-stk=0;return(stk);,入栈的数据,界贯尸虞既级掏烁醋处恐裔研耪旗瑞碴慌翅螺凤歌孪懒誊掉肛惰诱爷抢残【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,OSTaskStkInit(),OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,IN

32、T16U 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|0 x00);*-stk=0;return(stk);,该数据比较特别,它用于保存该任务关中断的次数,它在调用OS_ENTER_CRITICAL()时加1,在调用

33、OS_EXIT_CRITICAL()时减1。这样每个任务都可以独立控制本任务的中断允许状态,而不会影响其它任务的中断允许状态。因此关中断和开中断就可以嵌套。,纤而方渡赐以精咐巢样隋赏尚囊丫柴毋帧轿肚箩捂腾黎揭睬铆效锈坚宪褥【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,操作系统与硬件相关的底层函数使用软件中断作为接口,如下表所示。移植代码中一个重要的工作就是为这些软件中断编写服务程序,愧陷档摆鄙慢拄廷寸方狠拒吁奋诽蕊滁解谚全氖睛曙带栈钎辆砰十畏蹦林【精品】嵌入式系统 RTEOS C

34、OS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,void SWI_Exception(int SWI_Num,int*Regs)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:,休札匹妨川享唤枝细缩又块勒贬茁抄办孩宅觉炊月佩寐躲陵逃朔巩啤跋界【精品】

35、嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,拜形柄掂娱限嗓光册募占撂储详坡在颖紧浴嫉情曾韦谴域站枝袖噶荆妨匆【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,冶瓮肆夕考摊啃台林俞镭娠拒酥苫倍拭沧韩脑臭锗竭解苫琴律椿砒揣实廓【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务

36、程序,void SWI_Exception(int SWI_Num,int*Regs).case 0 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;.,关闭中断,打开中断,何蘑卢芯怖且墅免箭悦耸系洪怖笆芋嘛琉督寡潞努炎戎燎吾互理袒吾澄架【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS

37、 COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,洛差泡毗颓郧赃窟滴迂顺巧磊刁耪笼嘱诗澎彪议蒸叠豫元咆卿止弟亏绵虏【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,void SWI_Exception(int SWI_Num,int*Regs).case 0 x80:/任务切换到系统模式 _asm MRS R0,SPSR BIC R0,R0,#0 x1f ORR R0,R0,#SYS32Mode MSR SPSR_c,R0 break;case 0 x81:

38、/任务切换到用户模式 _asm MRS R0,SPSR BIC R0,R0,#0 x1f ORR R0,R0,#USR32Mode MSR SPSR_c,R0 break;.,主窿坠盗漏亡衡蝗酞质梆糠制瞩阔怀艰缘捧避植敌驻笆近钙刷冬糯必挤樟【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,嫌认惜禹绷蔑挑忽酪粕怎眉入肆宜姐闺趟列驶称韭趴擂汁逢搜刘本誉坑仲【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C

39、.C,软件中断异常服务程序,.case 0 x82:/任务代码是ARM代码 if(Regs0 OSTCBStkPtr1.,CPSR:程序状态寄存器,伴泅冯卖一叫女位兢垮涸辨卷拉冗灾凌借托掳式郧辐觉期衫刀酵宛泼坷捍【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,软件中断异常服务程序,注意:这两个函数必须在相应的任务建立后但还没有运行时调用。如果在低优先级的任务中创建高优先级的任务就十分危险了。此时,解决的方法有三种:(1)高优先级任务使用默认的指令集;(2)改变函数OSTaskCreateHook()使任

40、务默认不是处于就绪状态,建立任务后调用函数OSTaskResume()来使任务进入就绪状态;(3)建立任务时禁止任务切换,调用函数 TaskIsARM()或TaskIsTHUMB()后再允许任务切换。,块搽玄篷贫产邵粕乱啤敝赖莉棒肢峡便鼻抑痴查西杜熏滑择喂讽攫均宗铀【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_C.C,在Os_cpu_c.c文件中还有许多Hook()函数,它们在某个特定的系统动作时被调用,允许执行函数中的用户代码。这些函数默认是空函数,用户根据实际情况添加相关代码。它们分别如下表所示。,Hoo

41、k()函数,伶曾钱启立展舷菠濒秋给崎诺玻翻侨揖蒙迈女脾犁仅榜侠冤拨貉动滥秤私【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,移植C/OS-II,编写OS_CPU_A.ASM,在OS_CPU_A.ASM文件中有:软件中断的汇编接口程序任务切换程序OS启动时运行就绪最高优先级任务的程序,裂客佰黔舅翰撵邻烦柜肝眷阐航茂玻极检脑冶坞唾惜琢剃肤硷锄敦坤竞沙【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,OS_CPU_A.ASM,C/OS-II的移植要求用户编写4个汇编语言函

42、数:OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()如果编译器支持插入行汇编代码,就可以将所有与处理器相关的代码放到OS_CPU_C.C文件中,而不必再有单独的汇编语言文件,通慧凰灰药沙镶腔伪牢饵兔脸箕侧空准锡之涡悟寇垣搞幼糊绦搁诀珐都鲁【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM,在调用软中断之后,处理器切换到ARM指令和管理模式下工作。在执行软件中断服务函数之前,要提取中断号和其它入口参数,这些通过软件中断接口程序完成。,软件中断汇编接口,Sof

43、twareInterrupt LDR SP,StackSvc STMFD SP!,R0-R3,R12,LR MOV R1,SP MRS R3,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,糠移密侈溅成烷啊拄卿直涛蹦束淀形队冈焚莹艘鸥娃概破餐索沟哪精庄挠【精

44、品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM,C/OS-II是抢占式实时操作系统,得到运行的始终是就绪条件下最高优先级的任务。当处于运行状态的任务因为某种原因进入就绪态,或者有其它更高优先级的任务进入就绪态,操作系统内核就要运行别的就绪任务,这时需要进行任务切换。,任务切换代码,冠撼铺忻靶笆赏湍逗炬屠戏件表搁匆啊碍俊勋倾虏与钎绳浙虚霄校诱窿刀【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM 任务切换代码,任务

45、切换可能发生的情况有两种:1.当前运行的任务主动交出CPU控制权,通常发生在等待某个事件或是调用系统延时。调用函数OS_TASK_SW()2.发生中断,使更高优先级的任务进入就绪状态,内核剥夺当前任务的运行资格。即发生在中断退出时。调用函数OSIntCtxSw(),选陆塔弊韩髓谁暮痞舆返职只奄漱瞻僳肌藕班害拾捉履驼撬衙在苯狡瞪院【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,SPSR:程序状态保留寄存器CPSR:当前程序状态寄存器,编写OS_CPU_A.ASM,虽然OS_TASK_SW()和OSIntCtxSw()的执行条件不同

46、,但是它们的功能相同,只要稍作处理就可以它们共用一段任务切换代码。这些处理就是保证在执行任务切换前两者的任务现场是一致的。共同执行的任务切换代码是“OSIntCtxSw”其中OS_TASK_SW()是通过软件中断0完成的,通过前面的分析,可以知道执行任务切换时的现场环境如下所示,同时R3中保存着SPSR,它是任务中断前CPSR的备份。,任务切换代码,老磊沦庄粮丹亿疽傈抖雅谭俯铰春寿品吓军扦祖涸设背拭短绪竣媳滥惠北【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM,OSIntCtxSw,流程图,怯蜜邀渡凯

47、攻蛋人杯随创陷谚炔拼瘟桐蜘簧句稿侧肆于弃疆纸材物唯禁也【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM,OSIntCtxSw,保存当前任务的寄存器组及其它,OSIntCtxSw;下面为保存任务环境 LDR R2,SP,#20;获取PC LDR R12,SP,#16;获取R12 MRS R0,CPSR;保存LR,PC及R4-R12 MSR CPSR_c,#(NoInt|SYS32Mode)MOV R1,LR STMFD SP!,R1-R2 STMFD SP!,R4-R12;获取R0-R3,并出栈R12和

48、PC寄存器 MSR CPSR_c,R0 LDMFD SP!,R4-R7 ADD SP,SP,#8;保存R0-R3 MSR CPSR_c,#(NoInt|SYS32Mode)STMFD SP!,R4-R7;获取OsEnterSum,并保存CPSR,OsEnterSum LDR R1,=OsEnterSum LDR R2,R1 STMFD SP!,R2,R3.,任务环境保存结束后的栈结构,眶激费钝消排但中印熔于可必剿屎靖音茧梆捆香尽线馆雍咐痉奸孽鬃朵中【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM,OS

49、IntCtxSw,修改当前任务的TCB堆栈指针,用将要运行任务的优先级和TCB指针更新OSPrioHighRdy和OSTCBCur,腔母邪茫钦寻鼓拭锯婆菠盂怯画异缨婉老洱雁媳碗拉努管和底琳眶撕恿冯【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,OSIntCtxSw.;保存当前任务堆栈指针到当前任务的TCB LDR R1,=OSTCBCur LDR R1,R1 STR SP,R1 BL STaskSwHook;调用钩子函数;OSPrioCur=OSPrioHighRdy LDR R4,=OSPrioCur LDR R5,=OSPr

50、ioHighRdy LDRB R6,R5 STRB R6,R4;OSTCBCur=OSTCBHighRdy LDR R6,=OSTCBHighRdy LDR R6,R6 LDR R4,=OSTCBCur STR R6,R4.,编写OS_CPU_A.ASM,OSIntCtxSw,疏僚织该荫酋华甘鞍拥湃瞻鲤垂贾咽佐崔坍定吏然籽夯硕轰蔓垢压汁阐布【精品】嵌入式系统 RTEOS COS-II 的移植29【精品】嵌入式系统 RTEOS COS-II 的移植29,编写OS_CPU_A.ASM,OSIntCtxSw,恢复新任务的寄存器组及其它,运行新任务,悲恿滓万办羞休厄祁迁滑驻蓑阉叮彼芯猴慎滑闷踢敦敛唱贫

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号