嵌入式系统教案(7-ARM7操作系统).doc

上传人:asd****56 文档编号:70336617 上传时间:2023-01-19 格式:DOC 页数:9 大小:52.50KB
返回 下载 相关 举报
嵌入式系统教案(7-ARM7操作系统).doc_第1页
第1页 / 共9页
嵌入式系统教案(7-ARM7操作系统).doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《嵌入式系统教案(7-ARM7操作系统).doc》由会员分享,可在线阅读,更多相关《嵌入式系统教案(7-ARM7操作系统).doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、教案课程题目 DSP及ARM技术专题题目 ARM技术第七讲移植C/OS-II到ARM7授课教员 王金洪授课单位 研究六室第七讲移植C/OS-II到ARM7一、教学目的、要求使学员掌握移植一个操作系统到不同架构的微处理器的一般方法。掌握以C/OS-II移植到ARM7为例所要修改的文件和注意事项。二、教学重点、难点重点:以C/OS-II移植到ARM7为例所要修改的文件和注意事项。难点:以C/OS-II移植到ARM7为例所要修改的文件和注意事项。三、课堂讲授设计采用PowerPoint课件讲授。四、讲授内容(一)C/OS-II C/OS-II是一个完整、可移植、可固化及可剪裁的占先式实时多任务内核。

2、C/OS-II用ANSI C语言编写,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。(二)移植规划 1、编译器的选择 针对ARM处理器核的C语言编译器有很多,如SDT、ADS、IAR、TASKING和GCC。GCC虽然支持广泛,很多开发套件使用它作为编译器,与ADS比较其编译效率较低,这对充分发挥芯片性能很不利,所以最终使用ADS编译程序和调试。2、任务模块的取舍ARM7处理器核具有用户、系统、管理、中止、未定义、中断和快中断7种模式,其中除用户模式外,其他均为特权模式。关于ARM7处理器核的详细情况由第3章可知,管理、中止、未定义、中断和快中断与相应异常相联系,任务使用这些模式不太

3、适合。而系统模式除了是特权模式外,其他与用户模式一样,因而可选的给任务使用的模式只有用户模式和系统模式。为了尽量减少任务代码错误对整个程序的影响,缺省的任务模式定为用户模式,可选为系统模式,同时提供接口使任务可以在这两种模式间切换。3、支持的指令集 带T变量的ARM7处理器核具有两个指令集:标准32位ARM指令集和16位Thumb指令集,两种指令集有不同的应用范围。为了最大限度地支持芯片特性,任务应当可以使用任意一个指令集并可以自由切换,而且不同的任务应当可以使用不同的指令集,这次移植的代码已经实现了这一点。(三)移植C/OS-II 1、移植C/OS-II简介(1)对移植者的要求l 对目标体系

4、结构要有很深的了解;l 对OS(操作系统)原理要有较深入的了解;l 对所使用的编译器要有较深入的了解;l 对需要移植的操作系统要有相当的了解;l 对具体使用的芯片也要有一定的了解。C/OS-II中要移植的部分见表7.1。(2)不需要OS_CPU_A.ASM的条件l 可以直接使用C语言开关中断;l 可以直接使用C语言编写中断服务程序;l 可以直接使用C语言操作堆栈指针;l 可以直接使用C语言保存CPU的所有寄存器。 同时支持以上4点的C语言编译器几乎不存在。(3)中断服务程序的处理 IRQ.inc文件中定义了一个汇编宏,是C/OS-II为ARM7通用的中断服务程序的汇编与C函数接口代码。时钟节拍

5、中断服务程序可以通过IRQ.S简化用户代码的编写。2、关于头文件includes.h和config.hC/OS-II要求所有.C文件都要包含头文件includes.h,这样使得用户项目中的每个.c文件不用分别去考虑它实际上需要哪些头文件。使用该文件的缺点是它可能会包含一些实际不相关的头文件,这意味着每个文件的编译时间可能会增加,但却增强了代码的可移植性。本移植中另外增加了一个头文件config.h,要求用户程序必须包含此文件,在config.h文件中包含includes.h和特定的头文件和配置项。而C/OS-II的系统文件依然只包含includes.h。所有的配置改变包括头文件的增减均在con

6、fig.h中进行。3、编写OS_COU.h(1)不依赖于编译器的数据类型程序清单7.1 不依赖于编译器的数据类型。(2)使用软中断SWI作底层接口见表7.2 软中断功能。见程序清单7.2 SWI服务函数。(3)OS_STK_GROWTHADS的C语言编译器仅支持从上往下长,并且必须是满递减堆栈,所以OS_STK_GROWTH的值为1。见程序清单7.3 定义堆栈增长方向。4、编写OS_CPU_C.c文件(1)OSTaskStkInit()在编写此函数之前,必须先确定任务的堆栈结构。而任务的堆栈结构是与CPU的体系结构、编译器有密切的关联。见图7.1 任务堆栈结构。见程序清单7.4 函数OSTas

7、kStkInit()代码。OsEnterSum用于保存关中断的次数。(2)软件中断异常SWI服务程序C语言部分程序清单7.5 软中断代码的C语言部分,其中参数SWI_Num为功能号,而Regs为指向堆栈中保存寄存器的值的位置。(3)OS_ENTER_CRITICAL()关中断和OS_EXIT_CRITICAL()开中断(4)OSStartHighRdyC/OS-II启动多任务环境的函数叫OSStart(),用户在调用OSStart()之前,必须已经建立了一个或更多任务。OSStart()最终调用函数OSStartHighRdy()运行多任务启动前优先级最高的任务。见程序清单7.6 OSStar

8、tHighRdy()代码。(5)移植增加的特定函数根据ARM核心的特点和移植的目标,为此增加了两个处理机模式转换函数(ChangeToSYSMode()、ChangeToUSRMode())和两个任务初始指令集设置函数(TaskIsARM()、TaskIsHUMB())。它们都是通过软件中断指令SWI转换到系统模式,通过软件中断服务程序实现的。处理器模式转换函数ChangeToSYSMode()和ChangeToUSRMode()使用软件中断功能0x80和0x81实现,其中函数ChangeToSYSMode()把当前任务转换到系统模式,函数ChangeToUSRMode()把当前任务转换到用户

9、模式,它们可以在任何情况下使用。它们改变程序状态保留寄存器SPSR的相应位段,而程序状态保留寄存器会在软件中断推出师傅知道程序状态寄存器CPSR,任务的处理器模式就改变了。任务可以使用ARM的两种指令集的任意一种运行,但是任务建立时默认的只是一种指令集。如果任务使用的第一条指令与默认的指令集不同,则程序运行错误。为了纠正这个错误,本移植增加两个函数TaskIsARM()和TaskIsHUMB()用于改变任务建立时默认的指令集。函数TaskIsARM()用于声明指定优先级的任务的第一条指令是ARM指令集中的指令,而函数TaskIsHUMB()用于声明指定优先级的任务的第一条指令是Thumb指令集

10、中的指令,它们都有唯一的参数,即需要改变的任务的优先级,值得注意的是,这两个函数必须在相应的任务建立后但还没有运行时调用。这样,如果在低优先级的任务中创建高优先级的任务就十分危险了。此时,解决的方法有三种:l 高优先级任务使用默认的指令集;l 改变函数OSTaskCreatHook()使任务默认不是处于就绪状态,建立任务后调用函数OSTaskResume()来使任务进入就绪状态;l 建立任务时禁止任务切换,调用函数TaskIsARM()或TaskIsTHUMB()后再允许任务切换。 函数TaskIsARM()和TaskIsTHUMB()使用软件中断功能0x82和0x83实现。两个功能代码极其相

11、似,代码也比较简单。首先,程序判断传递的参数(任务的优先级)是否在允许的范围内。然后获取任务的任务控制块(tcb)的地址,接着判断指针是否有效,有效则改变指定任务的堆栈中存储的CPSR的T位,这两个函数仅在任务建立时使用。(6)Hook()函数C/OS-II有很多由用户编写的Hook()函数,它在本移植中全为空函数,用户就可以按照C/OS-II的要求修改它。5、编写OS_CPU_A.S(1)软件中断的汇编接口见程序清单7.7 软件中断代码的汇编部分。软中断的功能号包含在SWI指令中,程序通过读取该指令的相应位段获得。由于ARM处理器具有两个指令集,两个指令集的指令的长度不同,SWI指令的功能号

12、的位段也不同,所以程序先判断在进入软中断前处理器是在什么指令集状态。然后,程序用功能号与1比较,当功能号无符号小于1时,就是0了,将跳转到任务切换函数处,也就是OS_TASK_SW()。当功能号等于1时,就跳转到第一个任务切换处,也就是_OSStartHighRdy()。这两个功能不在C语言中实现,原因一是因为它们需要明确的堆栈结构,这是C语言不能提供的;二是两个任务切换程序本身是使用汇编编写,且同在OS_CPU_A.s这个文件中,使用汇编跳转十分方便。其他功能就给软件中断的C语言处理函数处理,它有两个参数,第一个就是功能号,存于R0中,第二个是保存参数和返回值得指针,也就是堆栈中存储用户函数

13、R0R3的位置,实质就是当前堆栈指针值,它存于R1中。(2)OS_TASK_SW()和OSIntCtxSw()OS_TASK_SW()是在C/OS-II从低优先级任务切换到高优先级任务时被调用的,OS_TASK_SW()总是在任务级代码中被调用的。另一个函数OSIntCtxSw()被用来在ISR使得更高优先级任务处于就绪状态时,执行任务切换功能,它最终调用OSIntCtxSw()执行任务切换。OS_TASK_SW()是使用SWI软件中断的0号功能实现的,还是调用OSIntCtxSw()实现的。此时的堆栈结构如图7.2所示。同时,R3保存着SPSR。这样中断调用OSIntCtxSw()时需要相同

14、的堆栈结构,R3也要保存着SPSR,这需要中断服务程序保证。OSIntCtxSw()的代码见程序清单7.8。因为任务可能处于系统模式,也可能处于用户模式;可能使用ARM指令集,也可能使用Thumb指令集,只有用系统模式的SPSR保存任务的CPSR,然后返回任务才能正确地切换CPU的模式和状态。(3)OSStartHighRdy()C/OS-II启动多任务环境的函数叫OSStart(),用户在调用OSStart()之前,必须已经建立了一个或更多任务。OSStart()最终调用函数OSStartHighRdy()运行多任务启动前优先级最高的任务。见程序清单7.9 _OSStartHighRdy()

15、代码。6、关于中断及时钟节拍在本移植中,IRQ是受C/OS-II管理的中断,对于FIQ不做处理。由于各种ARM芯片的中断系统不一样,各个用户的目标板也不一样,中断及时钟节拍时需要进一步移植的代码。程序清单7.10 IRQ异常处理代码的汇编部分。程序清单7.10是根据C/OS-II对中断服务程序的要求、ARM7体系结构特点、ADS编译特点和OSIntCtxSw()的要求编写的,适合所有基于ARM7核的芯片。有了这段代码,中断服务程序的C语言部分很简单,示意代码见程序清单7.11。(四)移植代码应用到LPC2000上节介绍的代码仅为C/OS-II在ARM7上移植的通用代码,当在具体的项目中应用这些

16、代码时,还需要做一些工作,这是由以下原因造成:l 因为ARM公司的政策,各种基于ARM7处理器核的芯片的存储系统不同、片内外设不同,具有的中断源也不同,甚至连中断系统都不一样。l 因为各个项目对资源的要求不一样,所以尽管使用同一系列的芯片,其时钟节拍中断也可能使用不同的中断实现。 1、编写或获取启动代码 关于启动代码的编写参考第5章。2、挂接SWI软件中断将软中断异常处理程序挂接到内核是通过启动代码实现的,见程序清单7.12 异常向量表。3、中断及时钟节拍中断编写中断服务程序代码比较简单,关键在于把程序与芯片的相关中断源挂接,使芯片在产生相应的中断后会调用相应的处理程序。这需要做两个方面事情:

17、(1)增加汇编接口的支持方法是在文件IRQ.S中适当位置添加如程序清单7.13所示代码。(2)初始化向量中断控制器见程序清单7.14 中断初始化代码。至于时钟节拍中断服务程序的编写除了在程序清单7.11的“用户处理程序”中必须调用函数OSTimeTick()外,没有其他不同。4、编写应用程序移植C/OS-II是为了在自己的系统使用C/OS-II。要在自己的系统中使用C/OS-II编写自己的应用程序,就必须遵守C/OS-II的编程规范。程序清单7.15程序清单7.17是一个很简单的例子。这个例子在运行时,每按一下按键KEY1,蜂鸣器鸣叫两声。见程序清单7.15 应用程序主函数。见程序清单7.16

18、 第一个任务键盘扫描。见程序清单7.17 第二个任务蜂鸣器鸣叫。(五)小结 本讲讲解了C/OS-II移植到ARM7所要修改的文件和注意事项。如果需要详细了解C/OS-II,请详细阅读它的源代码。五、思考题1、移植C/OS-II到ARM7为何使用SWI软件中断异常接口?2、移植代码为何要增加ChangeToSYSMode()、ChangeToUSRMode()、TaskIsARM()和TaskIsTHUMB()这4个函数?它们如何使用?六、教材、参考书目l ARM嵌入式系统基础教程周立功 等编著 北京航空航天大学出版社l 嵌入式系统开发与应用教程 田泽 编著 北京航空航天大学出版社l ARM体系结构与编程杜春雷 编著 清华大学出版社备注8

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

当前位置:首页 > 技术资料 > 其他杂项

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁