您的位置 首页 IOT

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()

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部