移植UC/OSii到系统上必须满足下面的一些条件:
(1) 处理器的C编译器能产生可重入代码。
(2) 用C语言就可以打开和关闭中断
(3) 处理器支持中断还能产生定时中断
(4) 处理器支持容纳一定量的数据的硬件堆栈
(5) 处理器中可以将堆栈指针和其他CPU寄存器读出和储存到堆栈或内存中的指令。
这些在ARM处理器中都可以实现,所以本设计的硬件选择没什么问题。
移植步骤一:基本的配置和定义
所有需要完成的基本配置和定义全部集中在os_cpu.h头文件中。定义与编译器相关的数据类型,定义通过和禁止中断宏,定义栈的增长方向,定义符号OS_STK_GROWTH的值。
定义OS_TASK_SW的宏。
移植步骤二:有四个汇编函数需要移植。
2.5.1 OSStartHighRdy函数
OSStartHighRdy()由多任务系统启动函数OSStart()中调用。主要负责获取新任务的堆栈指针,并从指针中恢复新任务的所有寄存器。就因为他涉及到保存处理器寄存器到堆栈,所以需要进行移植。
2.5.2 OSCtxSw()函数
OSCtxSw()在任务级在任务切换函数调用. .ISR向量地址必须指向OSCtxSw()。这一中断的功能:保存任务环境变量(主要是寄存器的值,通过堆栈),当前的SP在任务TCB, 负载在地方最高优先级的任务就绪SP,恢复优先级最高的任务环境变量,返回。这就完成了任务级调换。
2.5.3 OSIntCtxSw函数
在OSIntExit OSIntCtxSw退出中断服务函数()()调用,实现中断级任务切换。因为它是在中断电话,所以处理器寄存器栈的工作已经完成,没有使用这个工作的一部分。具体任务:调整堆栈指针(因为调用函数可以使任务堆栈结构和系统结构的任务切换堆栈标准不一致),SP,保存当前任务负载在地方最高优先级的任务就绪SP,恢复优先级最高的任务环境变量,返回。这样就完成了中断级任务切换。
2.5.4 OSTickISR()函数
OSTickISR()系统时钟中断服务函数,这是一个时钟中断服务。频率越高的系统负载较重。这个周期确定大小的内核提供了应用程序与最低的时间间隔的服务。一般限于MS级(与单片机相关),更困难的任务需要用户建立中断来自己解决。具体内容:这个函数保存寄存器(如果硬件自动可以省略)调用 OSIntEnter(),(),OSTimeTick调用OSIntExit(),恢复寄存器、中断返回。
接下来就是移植C语言的源代码文件OS_CPU_C.C,这个源文件是由6个函数组成的。需要移植的是OSTaskStkInit(),OSTaskCreateHook(),OSTaskDelHook(),
OSTaskSwHook(),OSTaskStTHook(),OSTaskTickHook()。后面5个就是钩子函数,主要是用来扩展UC/OSII的功能。唯一必须要移植的函数式OS_TaskStkInit(),这个函数是任务创建时候调用来初始化任务的堆栈结构的。
3 数据采集系统设计
3.1 主要芯片介绍
主要硬件原理图:
3.1.1 LPC2138
这里本人对LPC2138进行一下简单的介绍。首选是LPC2138的管脚图,如图3.1所示:
图3.1 LPC2138的管脚图
16/32 位ARM7TDMI-S 核,超小LQFP64 封装。
8/16/32kB 的片内静态RAM 和32/64/128/256/512kB 的片内Flash 程序存储器。128 位宽度接口/加速器可实现高达60 MHz 工作频率。
通过片内boot 装载程序实现在系统编程/在应用编程(ISP/IAP)。单个Flash 扇区或整片擦除时间为400ms。256 字节行编程时间为1ms。
EmbeddedICE RT 和嵌入式跟踪接口通过片内RealMonitor 软件对代码进行实时调试和高速跟踪。
1 个(LPC2131/32)或2 个(LPC2134/36/38)8 路10 位的A/D 转换器,共提供16 路模拟输入,每个通道的转换时间低至2.44us。 基于uCOS-II的多功能数据采集系统的开发+源代码+流程图(5):http://www.youerw.com/zidonghua/lunwen_771.html