您的位置 首页 主动

uC/OS-II实时操作系统在嵌入式渠道上进行移植的方

引言 —实时操作系统的使用,能够简化嵌入式系统的应用开发,有效地确保稳定性和可靠性,便于维护和二次开发。 μC/OS-II是一个基于抢占式的实时

导言 —实时操作体系的运用,能够简化嵌入式体系的运用开发,有效地保证稳定性和可靠性,便于保护和二次开发。 μC/OS-II是一个依据抢占式的实时多使命内核,可固化、可取舍、具有高稳定性和可靠性,除此以外,μC/OS-II的鲜明特色便是源码揭露,便于移植和保护。 在μC/OS-II官方的主页上能够查找到一个比较全面的移植典范列表。可是,在实践的开发项目中,依然没有针对项目所选用芯片或开发东西的适宜版别。那么,无妨自己依据需求进行移植。 本文则以在TMS320C6711 DSP上的移植进程为例,剖析了μC/OS-II在嵌入式开发渠道上进行移植的一般办法和技巧。μC/OS-II移植的根本过程 在选定了体系渠道和开发东西之后,进行μC/OS-II的移植作业,一般需求遵从以下的几个过程: ● 深化了解所选用的体系中心 ● 剖析所选用的C言语开发东西的特色 ● 编写移植代码 ● 进行移植的测验 ● 针对项意图开发渠道,封装服务函数 (相似80×86版别的PC.C和PC.H) 体系中心 不管项目所选用的体系中心是MCU、DSP、MPU,进行μC/OS-II的移植时,所需求重视的细节都是附近的。 首要,是芯片的中止处理机制,怎么敞开、屏蔽中止,可否保存前一次中止状况等。还有,芯片是否有软中止或是圈套指令,又是怎么触发的。 此外,还需重视体系关于存储器的运用机制,比方内存的地址空间,仓库的添加方向,有无批量压栈的指令等。 在本例中,运用的是TMS320C6711 DSP。这是TI公司6000系列中的一款浮点类型,由于其时钟频率非常高,且选用了超凡指令字(VLIW)结构、类RISC指令集、多级流水等技能,所以运算功用适当强壮,在通讯设备、图画处理、医疗仪器等方面都有着广泛的运用。 在C6711中,中止有3种类型,即复位、不行屏蔽中止(NMI)和可屏蔽中止(INT4-INT15)。可屏蔽中止由CSR寄存器操控大局使能,此外也可用IER寄存器别离置位使能。而在C6711中并没有软中止机制,所以μC/OS-II的使命切换需求编写一个专门的函数完结。 此外,C6711也没有专门的中止回来指令、批量压栈指令,所以相应的使命切换代码均需编程完结。由于选用了类RISC中心,C6711的内核结构中,只要A0-A15和B0-B15这两组32bit的通用寄存器。 C言语开发东西 不管所运用的体系中心是什么,C言语开发东西关于μC/OS-II是必不行少的。 最简略的信息能够从开发东西的手册中查找,比方:C言语各种数据类型别离编译为多少字节;是否支撑嵌入式汇编,格局要求怎样;是否支撑 “interrupt”非标准关键字声明的中止函数;是否支撑汇编代码列表(list)功用,等等。 上述的这样一些特性,会给嵌入式的开发带来许多便当。TI的C言语开发东西CCS for C6000就包含上述的一切功用。 而在此基础上,能够进一步地澄清开发东西的一些技能细节,以便进行之后真实的移植作业。 首要,敞开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: STW 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的移植来说,了解以上信息就足够了。 终究,再编写一个用“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寄存器能主动保存中止产生时的程序地址) ● 编译器会主动计算中止函数所用到的寄存器,然后在中止一开始将他们悉数入栈保护——例如上述程序段中,只用到了B4寄存器。 编写移植代码 在深化了解了体系中心与开发东西的基础上,真实编写移植代码的作业就相对比较简略了。 μC/OS-II本身的代码绝大部分都是用ANSI C编写的,而且代码的层次结构非常洁净,与渠道相关的移植代码仅仅存在于OS_CPU_A.ASM、OS_CPU_C.C以及OS_CPU.H这三个文件傍边。 在移植的时分,结合前面两个过程中现已把握的信息,根本上依照《嵌入式实时操作体系μC/OS-II》一书的相关章节的辅导来做就能够了。 可是,由于体系中心、开发东西的千差万别,在实践项目中,一般都会有一些处理办法上的不同,需求特别注意。以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,然后回复到之前的中止设置。 这样,就能够防止运用这两个宏而意外改动了体系的中止状况——此外,也没有运用仓库或局部变量,比原作者引荐的办法要好。 ● 使命的切换: 前文说过,C6711中没有软中止机制,所以使命的切换需求用汇编言语自行编写一个函数_OSCtxSw来完结,而且 #define OS_TASK_SW() OSCtxSw() 在C6711中需求入栈保护的寄存器包含A0-A15、B0-B15、CSR、IER、IRP和AMR,这些再加上当时的程序地址构成一个存储帧,需求入栈保存。 _OSCtxSw函数中,需求像产生了一次中止那样,将上述存储帧入栈,然后获取被激活使命的TCB指针,将其存储帧的内容弹出,然后完结使命切换。 需求特别注意的是,在这儿OS_TASK_SW是作为函数调用的,所以如前文所述,调用时的当时程序地址是保存在B3寄存器中的,这也便是使命从头激活时的回来地址。 ● 中止的编写: 如前文所述,假如用“interrupt”关键字声明函数,CCS在编译时,会主动将该函数中运用到的寄存器入栈、出栈保护。 可是,这会导致各种中止产生时,收支栈的内容各不相同。这关于μC/OS-II是会引起严重过错的。由于μC/OS-II要求中止产生时的入栈操作运用和产生使命切换时彻底相同的存储帧结构。 因而,在移植时、依据μC/OS-II进行开发时,都不应当运用“interrupt”关键字,而运用如下结构编写中止函数: void OSTickISR (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函数的差异在于:中止产生时的当时程序地址是主动保存在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.H │ DSP_C6x_ Service.ASM │ └─ TEST // 详细的开发项目代码 OS_CFG.H INCLUDES.H TEST.C …… 如上,DSP_C6x_Service中的服务函数,相似于原作者供给的80×86版别中的PC.C和PC.H文件。在本文的比如中,服务函数则包含了上文提及的中止相关函数,以及体系初始化函数DSP_C6x_SystemInit()和时钟初始化函数DSP_C6x_TimerInit()等。 而详细的开发项目代码,则能够别离在“/TI_C6711” 途径下新建自己的目录,就好像移植测验的“TEST”项目,而无需再重视μC/OS-II的源代码和服务函数。 如此,就能够防止不必要的编译过错,也便于开发项意图保护。 – ———— 关于μC/OS-II系列软件版权的说明 Micrium 公司产品包含μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司供给嵌入式体系运用方面的产品,并对其软件具有知识产权。Micrium花费了很多的时刻和财力为嵌入式范畴供给高质量的软件产品。一切上述产品都以源代码的方法供给给客户,具有极大的适用性。产品不是免费软件,也不是开放源码的软件,因而,不能免费运用,需求清楚的说明μC/OS-II和系列的软件不是开放源码的免费软件,这是和Linux彻底不相同的。 开发和研究者能够经过购买Micrium公司的Jean先生的μC/OS-II的书本,而得到μC/OS-II源代码,可是仅能够作为个人和校园学习运用,一切和μC/OS-II直接和直接相关的商业意图行为,有必要购买运用μC/OS-II及系列产品的商业授权,包含芯片/单板/体系厂家的任何参阅规划,教育设备和终究的产品,假如没有得到Micrium公司Jean先生签字的合法授权都是不合法的运用, 这在μC/OS-II的书本Micrium公司(www.micrium.com)和我国代理商-北京麦克泰软件公司网站(www.bmrtech.com)上面中有明确规定。 Micrium公司其它软件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的出售方法与μC/OS-II不同,假如没有购买运用授权,彻底不能够具有该源代码,也不能将源代码用于产品的规划,训练,教育和出产。 μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授权方法有:单个产品、产品线(系列)、依照CPU 区分的产品三种方法,μC/OS-KA,μC/OS-VIEW 等东西是依照运用人的数目收取费用的,相对起传统的RTOS 动辄2-3万美圆的开发费用和每块单板的运用费(依据数量从数百到几个美圆),μC/OS-II及系列产品是选用一次性的收费方法,应该仅仅大约适当于传统RTOS 的10-20% 的整体费用。 假如您正在将μC/OS-II系列软件用于您的产品,您需求购买并取得正式运用授权。 北京麦克泰软件技能有限公司

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/299398.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部