让新人快速实现μc/os II在arm上的移植方法

2016-07-01 09:59作者陈若冰兰州大学
电子制作 2016年9期
关键词:堆栈寄存器中断

作者 / 陈若冰,兰州大学



让新人快速实现μc/os II在arm上的移植方法

作者 / 陈若冰,兰州大学

为了应用系统在一个专用计算机系统上对可靠性、功能、功耗的要求,嵌入式系统应运而生。为了充分发挥嵌入式系统的优势,在嵌入式系统上移植操作系统显得很必要了。所以我们将本文讨论以下问题:1.一个新人如何快速实现μc/os II操作系统在arm处理器上的移植;2.新人常见的障碍及解决方法

新人;移植;ARM;μc/os II

前言

对一个新人来说,在嵌入式系统上移植操作系统最难的是无从下手。本文就是让新人能快速上手,深入了解。5个步骤,2个常见问题,简单明了,同时便于学习的深入。

1. 为什么要进行μc/os II在ARM上的移植?

1)嵌入式系统需要操作系统来满足其越来越高的cpu位数对处理能力以及可靠性的要求,没有操作系统,发挥不出裸机功能,即便其能跑动,添加应用程序或用户有什么需求都需要极其熟悉其硬件及编程才行,这就相当于只有开发者能使用了,还很麻烦。2)ARM处理器功耗小,快速并且小型,它本身就具有适合跑操作系统的特性。3)μc/os II是一款实时操作系统,保证在一定时间完成特定功能,易实现多任务处理,它有很强的可移植性。

2.移植的5个步骤

(在IAR开发环境下,让整个系统工作在管理模式下移植,主要是移植OS_CPU_C.C和OS_CPU_A.S这两个文件)

■2.1 移植OS_CPU_C.C,主要是初始化堆栈结构:OSTaskStkInit函数

其目的是让堆栈处于刚刚发生过中断的状态,因为任务不会一被创建就被执行,为使后面的调度会一致,先要把改任务指针及返回地址都指向函数入口,被调度时从堆栈恢复刚开始的地方走。

■2.2 启动μc/os II:通过在主程序中调用OSStart()函数

(从这步开始,开始移植OS_CPU_A.S) 真正实现uC/OS-II启动运行是通过OSStart()函数来调用OSS-tartHighRdy()函数的,是为了让优先级状态最高的进入就绪状态任务运行。OSStart函数原型:

■ 2.3任务级的任务切换函数:OSCtxSw()

其功能是在当触发了更高的优先级任务以后,要调用OSCtxSw进行任务切换,原理如下:

(1)将当前处理的通用寄存器(RO-R12、R14),PC寄存器和当前的CPSR寄存器值压入当前任务堆栈中;(2)按下列顺序,将马上要切换任务的SP值,SPSR,RO-R12,R14和PC寄存器的值恢复到各自当前处理器的值中;(3)上述功能全恢复后就续表中最高任务优先级的运行。

■2.4 中断级的任务切换函数:OSIntCtxSW()

它的功能是在中断里面触发了更高的优先级而进行任务切换。由于是中断,进入时是已经保存了被中断任务的cpu现场,就不用像上面那样一个一个地恢复了,只需调整指针值。下面是详细代码,任务级的任务切换函数和下面代码大部分也是一致的。

2.5 OSIntEnter()、OSIntExit():用于对中断中的任务切换,它们必须在中断处理函数中成对使用(否则系统可能奔溃)。前者用于判断中断发生是否在uC/OS-II整个系统启动后,否则所有的系统功能均不能提供给用户使用。后者用于在用户编写的中断服务代码执行完毕以后调用,以保证“处于就绪状态下优先级最高的任务始终能得到系统的所有资源”。

3. 注意的2个要点

■3.1 搞清TCB、ECB两个数据结构

在上面的移植函数的使用和更改中,我们频繁提到TCB、ECB这两个数据结构,离开了数据结构,内核什么也完成不了。任务控制块TCB中包含了每个创建的任务的全部信息,μc/os II会给每个创建的任务分配一个TCB。 事件控制块ECB的总数由用户所需要的信号量、邮箱和消息队列的总数决定。在调用OSInit()时,执行了OS_InitEvent-List()函数,所有ECB被链接成一个单向链表—空闲ECB链表。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲ECB,并对它进行初始化。

■3.2 对ARM体系的发生的异常的分析

异常就是由内部或外部资源产生并且引起处理器去处理的事件。在执行所有异常程序之前,处理器状态寄存器必须被保存下来,以便当异常处理程序完成时处理器状态寄存器

能被恢复。由于异常模式对应各自的异常类型,系统模式由于其不受限制地访问系统内部所有资源的特性最适合作为操作系统正常运行的模式,而用户模式适用于用户运行进程时用,它通过限制用户对处理器模式的更改权限(比如中断)以保护系统的运行正常。然而中断任务的开始就是要将现场保护到堆栈中去,它大大占用了ARM的开销。在不需要任务切换时,中断开始执行时产生的开销明显浪费处理器宝贵的时间。所以要在中断开始执行的阶段将寄存器暂时保存在中断模式的堆栈中,在调用函数时,μc/os II判断是否要任务切换。注意,建议在移植的过程中把工作模式切换在管理模式,因为在用户和系统模式下,使用LDM指令时,会导致对不可预知的错误。

4. 结论

上述步骤便于μc/os II在arm上的移植,且对于新人起到快速入门的作用,对于其深入了解和日后操作起到良好奠基与引导作用。

* [1]Jean J.Labrosse. MicroC/OS-II The Real-Time Kernal[M].北京:北京航天航空大学出版社,2002

* [2]开发人员. IAR Embedded Workbench IDE User Gui[M].IAR开发公司,2001

* [3]任哲.嵌入式实时操作系统μc/os II原理及应用[M]北京:北京航天航空大学出版社,2004

* [4]杜春蕾.ARM体系结构与编程[M].北京.清华大学出版社.2003

猜你喜欢
堆栈寄存器中断
基于行为监测的嵌入式操作系统堆栈溢出测试*
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
基于FPGA的中断控制器设计*
跟踪导练(二)(5)
千里移防,卫勤保障不中断
基于堆栈自编码降维的武器装备体系效能预测
FPGA内嵌PowerPC的中断响应分析
高速数模转换器AD9779/AD9788的应用
一种用于分析MCS-51目标码堆栈深度的方法