完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
μC/OS-II操作系统是一种抢占式多任务、单内存空间、微小内核的嵌入式操作系统,具有高效紧凑的特点。它执行效率高,占用空间小,可移植性强,实时性能良好且可扩展性强。采用μC/OS-II实时操作系统,可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应;采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。 μC/OS-11非常适合应用在一些小型的嵌入式产品应用场合,在家用电器、机器人、工业控制、航空航天、军事科技等领域有着广泛的应用。 单片机、ARM、FPGA与μC/OS-II操作系统相结合,实现一些具体功能,是目前嵌入式应用中比较常见的。在这些应用中,基础性的工作就是操作系统的移植。本文选取使用较多的51单片机、LPC2210、NiosII三种处理器进行介绍。 1 μC/OS-II操作系统移植条件 μC/OS-II操作系统的大部分源代码都是用C语言书写的,但仍需使用汇编语言来完成一些和处理器相关的操作,例如读写处理器、寄存器时只能使用汇编语言来实现。因此,将μC/OS-II操作系统移植到目标处理器上,需要从硬件和软件两方面来考虑。 硬件方面,目标处理器需满足以下条件: ①处理器的C编译器能产生可重入代码; ②用C语言可以开/关中断; ③处理器支持中断,并且能够产生定时中断(通常在10~1 000 Hz之间); ④处理器能够支持容纳一定量数据的硬件堆栈; ⑤处理器有将堆栈指针和其他寄存器读出和存储到堆栈或内存中的指令。 软件方面,主要关注的是一些与处理器相关的代码移植,其分布在OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM这3个不同的文件中。 2 目标处理器硬件支持 51单片机、LPC2210、NiosII三种处理器在硬件方面均能满足μC/OS-II操作系统的移植要求。 51单片机:选择Keil公司的集成开发环境作为开发工具,因为该集成开发环境的C51编译器能产生可重入型代码,且用C语言就可以开/关中断。同时具有一定数量的堆栈和操作相关寄存器的指令。 LPC2210:采用ARM7微控制器可以满足上述②、④、⑤,而ADS1.2的C编译器可以满足①、③的要求。 NiosII处理器:Nios处理器可以配置成最多支持64个中断,包括外部硬件中断、内部中断以及TRAP(调试中断)。Nios II处理器可以配置使用32位内部定时器,通过用软件控制写入几个控制寄存器的内容来获得定时工作,与一般的定时器工作原理相同,可以产生定时中断。 Nios处理器可以外接存储器。以使用的DE2开发板为例,外接512 KB SRAM资源,可提供足够的数据硬件堆栈。 NioslI 8.0 IDE采用GNU编译器,支持C/C++的编译、链接产生重入代码,允许在C语言中嵌入汇编语言。 3 软件移植过程 3.1 OS_CPU.H的实现 OS_CPU.H文件包括了用#define语言定义的与处理器相关的常数、宏以及数据类型。 在上述三种处理器采用的不同编译器中,数据类型的定义是相同的,在此不做具体介绍。 在OS_CPU.H中定义与处理器相关的宏,主要是进入临界区的OS_ENTER_CRItiCAL()和退出临界区的OS_EXIT_CRITICAL()。 在Keil编译器中,EA是总中断。 #define OS_ENTER_CRITICAL() EA=0;//关中断 #define OS_EXIT_CRITICAL() EA=1;//开中断 在ADS编译器中定义为软件中断函数,并编写软件中断处理代码实现开/关中断。 _swi(0x00)viod OS_TASK_SW(viod);//任务级任务切换函数 _swi(0x00)viod OS_ENTER_CRITICAL(viod);//关中断 _swi(0x00)viod OS_EXIT_CRITICAL(viod); //开中断 在NiosII 8.0 IDE编译器中: #define OS_ENTER_CRITICAL() asm(“PFX 8n WRCTL%g0;”) //关中断 #define OS_EXIT_CRITICAL() asm(“PFX 9n WRC TL%g 0;”) //开中断 堆栈的增长方向通过设置OS_STK_GROWTH为0或者1来确定。51单片机中只能设置为0,表示堆栈是从下往上增长的。LPC2210中则可以设置成0或者1。NiosII中则只能设置成1,表示堆栈是从上往下增长的。 3.2 OS_CPU_C.C的实现 OS_CPU_C.C中,主要应改写堆栈初始化函数OS-TaskStkIint()。必须根据移植时统一定义的任务堆栈结构进行初始化,其他9个钩子函数只需说明即可。也可根据移植时用户自己的需要,编写相应的操作代码。 以LPC2210为例,堆栈空间从高到低依次存放着PC,LR,R12,R11,…,R1,R0,CPSR,OsEnterSum。每个任务都有独立的 OsEnterSum,在任务切换时保存和恢复各自的OsEnterSum值。各个任务开/关中断的状态可以不同,这样实现了开/关中断的嵌套。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4856 浏览 0 评论
87336 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4656 浏览 2 评论
3551 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2439 浏览 0 评论
1926浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
1308浏览 1评论
1200浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1272浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1197浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 17:48 , Processed in 0.944682 second(s), Total 67, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号