嵌入式系统上使用RTOS能有效的处理复杂的多任务应用。互联网上有许多开源的RTOS可资使用。uCOS是推广的较早开源RTOS,有资质的教育机构可以免费用于教育目的,商业应用则需要得到付费的商业许可证。FreeRTOS则是一个遵循GPL许可的开源RTOS。
开源RTOS一般由一个处理器无关的公共内核代码和少量处理器相关的代码组成。为了在特定的处理器上使用RTOS,需要获得与该处理器相关的部分代码。处理器相关的代码主要包括寄存器上下文切换,时钟节拍相关的定时器初始化,将定时器中断挂接到Tick中断例程上。网络上一般比较容易找到特定的处理器(MPU)下的移植代码,但是这个代码一般针对的是该系列处理器的官方评估板,其MPU型号和系统资源与我们的目标板一般不可能完全一致。项目开发中要做的工作一般是将官方评估板上移植好的RTOS修改到可以在我们的应用目标板上运行。
由于类似架构处理器的处理器寄存器上下文切换代码一般相同,故在这种情况下,需要做的主要是RTOS时钟节拍(Tick)的建立。具体的工作有,选择一个用于发生时钟节拍的定时器,在初始化程序中根据处理器的主频和Tick值确定定时器的计数值,将TickISR挂到所选用的定时器的中断,使能中断。
我们的目标板是基于ATmega128单片机,工作采用的RTOS是FreeRTOSv7.2.0。FreeRTOS官网上有ATmega323的移植代码。官网上的示例代码包括有LED闪烁任务和一个串口通信任务,移植目标是在ATmega128目标板运行此示例代码。ATmega323与ATmega128A的差异很小,主要在于内部的Flash和SRAM的大小和外设的数目。
进行的修改有以下内容:
1. 原始程序使用了16位定时器1,8MHz主频。改为使用八位定时器0,目标板的主频为16MHz,对定时器0使用1024分频,设置比较计数值为125,得到结果是16000000/1024/125=125Hz的节拍,节拍时间为1s/125=8ms。
2. 原始程序运行的ATmega323单片机只有一个串口,串口程序所用的寄存器,中断向量均改到ATmega128的USART1对应的各寄存器。由于寄存器内部的结构相同,故此修改很简单,在寄存器名称中插入1即可。
把makefile中的处理器设置行改为 MCU = atmega128后,重新编译的程序即在目标板上得到的正确运行。
出现过的问题:
在修改串口部分代码时,对编译器提示未定义的寄存器名称逐个处理后,得到的程序在目标板上反复复位。注释掉串口任务即可正常闪灯,检查发现是串口中断服务程序的定义处未修改,编译器并不报错,改正到USART1对应的中断向量后复位问题得到解决。