![ucosii及时操纵系统在嵌进式平台上前进移植的通俗方法和技能[趣读]_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/188e55c5-8da1-49af-b6a5-4cf0f3678454/188e55c5-8da1-49af-b6a5-4cf0f36784541.gif)
![ucosii及时操纵系统在嵌进式平台上前进移植的通俗方法和技能[趣读]_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/188e55c5-8da1-49af-b6a5-4cf0f3678454/188e55c5-8da1-49af-b6a5-4cf0f36784542.gif)
![ucosii及时操纵系统在嵌进式平台上前进移植的通俗方法和技能[趣读]_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/188e55c5-8da1-49af-b6a5-4cf0f3678454/188e55c5-8da1-49af-b6a5-4cf0f36784543.gif)
![ucosii及时操纵系统在嵌进式平台上前进移植的通俗方法和技能[趣读]_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/188e55c5-8da1-49af-b6a5-4cf0f3678454/188e55c5-8da1-49af-b6a5-4cf0f36784544.gif)
![ucosii及时操纵系统在嵌进式平台上前进移植的通俗方法和技能[趣读]_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/188e55c5-8da1-49af-b6a5-4cf0f3678454/188e55c5-8da1-49af-b6a5-4cf0f36784545.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、引言-实时操作系统的使用,能够简化嵌入式系统的应用开发,有效地确保稳定性和可靠性,便于维护和二次开发。C/OS-II是一个基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性,除此以外,C/OS-II的鲜明特点就是源码公开,便于移植和维护。在C/OS-II官方的主页上可以查找到一个比拟全面的移植范例列表。但是,在实际的开发工程中,仍然没有针对工程所采用芯片或开发工具的适宜版本。那么,不妨自己根据需要进行移植。本文那么以在TMS320C6711 DSP上的移植过程为例,分析了C/OS-II在嵌入式开发平台上进行移植的一般方法和技巧。C/OS-II移植的根本步骤在选定了系统平台和开发工
2、具之后,进行C/OS-II的移植工作,一般需要遵循以下的几个步骤: 深入了解所采用的系统核心 分析所采用的C语言开发工具的特点 编写移植代码 进行移植的测试 针对工程的开发平台,封装效劳函数 类似80x86版本的PC.C和PC.H系统核心无论工程所采用的系统核心是MCU、DSP、MPU,进行C/OS-II的移植时,所需要关注的细节都是相近的。首先,是芯片的中断处理机制,如何开启、屏蔽中断,可否保存前一次中断状态等。还有,芯片是否有软中断或是陷阱指令,又是如何触发的。此外,还需关注系统对于存储器的使用机制,诸如内存的地址空间,堆栈的增长方向,有无批量压栈的指令等。在本例中,使用的是TMS320C
3、6711 DSP。这是TI公司6000系列中的一款浮点型号,由于其时钟频率非常高,且采用了超常指令字VLIW结构、类RISC指令集、多级流水等技术,所 以运算性能相当强大,在通信设备、图像处理、医疗仪器等方面都有着广泛的应用。在C6711中,中断有3种类型,即复位、不可屏蔽中断NMI和可屏蔽中断INT4-INT15。可屏蔽中断由CSR存放器控制全局使能, 此外也可用IER存放器分别置位使能。而在C6711中并没有软中断机制,所以C/OS-II的任务切换需要编写一个专门的函数实现。此外,C6711也没有专门的中断返回指令、批量压栈指令,所以相应的任务切换代码均需编程完成。由于采用了类RISC核心
4、,C6711的内核结构中,只有A0-A15和B0-B15这两组32bit的通用存放器。 C语言开发工具无论所使用的系统核心是什么,C语言开发工具对于C/OS-II是必不可少的。 最简单的信息可以从开发工具的手册中查找,比方:C语言各种数据类型分别编译为多少字节;是否支持嵌入式汇编,格式要求怎样;是否支持“interrupt非标准关键字声明的中断函数;是否支持汇编代码列表(list)功能,等等。上述的这样一些特性,会给嵌入式的开发带来很多便利。TI的C语言开发工具CCS for C6000就包含上述的所有功能。而在此根底上,可以进一步地弄清开发工具的一些技术细节,以便进行之后真正的移植工作。首先
5、,开启C编译器的“汇编代码列表(list)功能,这样编译器就会为每个C语言源文件生成其对应的汇编代码文件。在CCS开发环境中的方法是:在菜单“/Project/Build options的“Feedback栏中选择“Interlisting:Opt/C and ASM(-s);或者,也可以直接在CCS的C编译命令行中加上“-s参数。然后分别编写几个简单的函数进行编译,比拟C源代码和编译生成的汇编代码。例如:void FUNC_TEMP (void) Func_tmp2(); /调用任一个函数 在CCS中编译后生成的ASM代码为: .asg B15, SP / 宏定义 _FUNC_TEMP: S
6、TW B3,*SP-(8) / 入栈 NOP 2 CALL _ Func_tmp2 /- MVKL BACK, B3 / 函数调用 MVKH BACK, B3 /- NOP 3 BACK: LDW *+SP(8),B3 / 出栈 NOP 4 RET B3 / 函数返回 NOP 5由此可见,在CCS编译器的规那么中,B15存放器被用作堆栈指针,使用通用存取指令进行栈操作,而且堆栈指针必须以8字节为单位改变。此外,B3存放器被用来保存函数调用时的返回地址,在函数执行之前需要入栈保护,直到函数返回前再出栈。当然,CCS的C编译器对于每个通用存放器都有约定的用途,但对于C/OS-II的移植来说,了解以
7、上信息就足够了。最后,再编写一个用“interrupt关键字声明的函数:interrupt void ISR_TEMP (void) int a; a=0; 生成的ASM代码为: _ISR_TEMP: STW B4,*SP-(8) / 入栈 NOP 2 ZERO B4 /- STW B4,*+SP(4) / a=0 NOP 2 /- B IRP / 中断返回 LDW *+SP(8),B4 / 出栈 NOP 4 与前一段代码相比,对于中断函数的编译,有两点不同: 函数的返回地址不再使用B3存放器,相应地也无需将B3入栈。IRP存放器能自动保存中断发生时的程序地址 编译器会自动统计中断函数所用到的
8、存放器,从而在中断一开始将他们全部入栈保护例如上述程序段中,只用到了B4存放器。编写移植代码在深入了解了系统核心与开发工具的根底上,真正编写移植代码的工作就相比照拟简单了。C/OS-II自身的代码绝大局部都是用ANSI C编写的,而且代码的层次结构十分干净,与平台相关的移植代码仅仅存在于OS_CPU_A.ASM、OS_CPU_C.C以及OS_CPU.H这三个文件当中。在移植的时候,结合前面两个步骤中已经掌握的信息,根本上按照?嵌入式实时操作系统C/OS-II?一书的相关章节的指导来做就可以了。但是,由于系统核心、开发工具的千差万别,在实际工程中,一般都会有一些处理方法上的不同,需要特别注意。以
9、C6711的移植为例: 中断的开启和屏蔽的两个宏定义为: #define OS_ENTER_CRITICAL() Disable_int() #define OS_EXIT_CRITICAL() Enable_int()Disable_int和Enable_int是用汇编语言编写的两个函数。在这里使用了控制状态存放器(CSR)的一个特性CSR中除了控制全局中断的GIE位之外,还有一个PGIE位,可用于保存之前的GIE状态。因此在Disable_int中先将GIE的值写入PGIE,然后再将GIE写0,屏蔽中断。而在Enable_int中那么从PGIE读出值,写入GIE,从而回复到之前的中断设置。
10、这样,就可以防止使用这两个宏而意外改变了系统的中断状态此外,也没有使用堆栈或局部变量,比原作者推荐的方法要好。 任务的切换: 前文说过,C6711中没有软中断机制,所以任务的切换需要用汇编语言自行编写一个函数_OSCtxSw来实现,并且 #define OS_TASK_SW() OSCtxSw() 在C6711中需要入栈保护的存放器包括A0-A15、B0-B15、CSR、IER、IRP和AMR,这些再加上当前的程序地址构成一个存储帧,需要入栈保存。 _OSCtxSw函数中,需要像发生了一次中断那样,将上述存储帧入栈,然后获取被激活任务的TCB指针,将其存储帧的内容弹出,从而完成任务切换。 需要
11、特别注意的是,在这里OS_TASK_SW是作为函数调用的,所以如前文所述,调用时的当前程序地址是保存在B3存放器中的,这也就是任务重新激活时的返回地址。 中断的编写: 如前文所述,如果用“interrupt关键字声明函数,CCS在编译时,会自动将该函数中使用到的存放器入栈、出栈保护。 但是,这会导致各种中断发生时,出入栈的内容各不相同。这对于C/OS-II是会引起严重错误的。因为C/OS-II要求中断发生时的入栈操作使用和发生任务切换时完全一样的存储帧结构。 因此,在移植时、基于C/OS-II进行开发时,都不应当使用“interrupt关键字,而应用如下结构编写中断函数:void OSTick
12、ISR (void) DSP_C6x_Save(); / 效劳函数,入栈 OSIntEnter(); if (OSIntNesting = 1) / v2.51版本新增加 OSTCBCur->OSTCBStkPtr =(OS_STK*) DSP_C6x_GetCurrentSP(); / 效劳函数 / 获取当前SP的值 / 允许中断嵌套 那么在此处开中断 OSTimeTick(); OSIntExit(); DSP_C6x_Resume(); / 效劳函数,出栈 DSP_C6x_Save和DSP_C6x_Resume是两个效劳函数,分别完成中断的出、入栈操作。它们与OS_TASK_SW函
13、数的区别在于:中断 发生时的当前程序地址是自动保存在IRP存放器的,应将其作为任务返回地址,而不再是B3。此外,DSP_C6x_Resume是一个永远不会返回的函 数,在将所有内容出栈后,它就直接跳转回到中断发生前的程序地址处,继续执行。进行移植的测试 在编写完了所有的移植代码之后,就可以编写几个简单的任务程序进行测试了,大体上可以分三个步骤来进行,相关资料比拟详尽,这里就不多作赘述了。封装效劳函数 最后这个步骤,往往是容易被无视的,但对于保持工程代码的简洁、易维护有很重要的意义。 C/OS-II的原作者强烈建议将源代码分路径进行存储,例如本文例子中的所有源代码就应按如下路径结构存储: uCOS-II SOURCE / 平台无关代码 OS_CORE.C . TI_C6711 / 系统核心 CCS / 开发工具 OS_CPU.H OS_CPU_A.ASM OS_CPU_C.C DSP_C6x_Service / 效劳函数 DSP_C6x_ Service
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业机器人研发与生产分包合同
- 机械工程材料力学专项训练题
- 外语课堂交互模式的评估与反馈机制探讨
- 线下品牌商品特许经营合同
- 小学生综合素质的培养
- 低空空域安全与应急管理
- DB14-T 3381-2025 药用酸枣栽培技术规程
- 建筑垃圾减量化行业标准化管理机制的构建
- 印刷业数字化人才培养与技术支持体系构建
- 媒体广告发布与投放合同书
- 企业技术管理咨询服务合同书
- 安全总监竞聘上岗
- 污泥处置年产54000吨生物质燃料原材料项目可行性研究报告模板
- 化工厂急救知识培训课件
- 2025届广东省深圳宝安区四校联考中考生物全真模拟试卷含解析
- 高中家长会 共筑梦想,携手未来课件-高二下学期期末家长会
- 国家中医药管理局机关服务中心人员招聘笔试真题2023
- 《混凝土灌注桩检测》课件
- 防范非法金融活动
- 数字资产投资策略-洞察分析
- 【MOOC】微型计算机原理与接口技术-南京邮电大学 中国大学慕课MOOC答案
评论
0/150
提交评论