3μcos_II在InfineonC164CI十六位单片机上的移植实现
时间:01-18
来源:互联网
点击:
引 言
μc/osII功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是 μc/osII公开所有的源代码,90% 的代码使用标准的ANSIC语言书写,程序可读性强,移植性好,同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对μc/osII实时操作系统的学习研究、开发、应用具有重要意义。Infineon C164CI-8EM 处理器是一款非常优秀的16位单片机,CPU的体系片上集成了以部件:64KB OTP存储器,2KB 的片上RAM ,16位3/6通道PWM,8通道10位A/D,定时器单元,比较/ 捕捉单元。能够与常用的外围设备实现无缝连接,功能强大,目前在汽车领域应用较为广泛。
μc/osII实时操作系统结构
图 1 说明了μc/osII的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。μc /osII处理器无关的代码提供了μc/osII的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信及创建、删除任务等。
大部分的μc/osII代码是使用ANSIC语言书写的,因此μc/osII的可移植性好,然而仍需要使用C和汇编语言写一些处理器相关代码μc/osII的移植需要满足以下要求:
①处理器的C编译器可以产生可重人代码。
②可以使用C调用进入和退出临界区代码。
③处理器必须支持硬件中断,并且需要一个定时中断源。
④处理器需要能够容纳一定数据的硬件堆栈。
⑤处理器需要有能够在CPU寄存器与内存和堆栈交换数据的指令。
Infineon C164CI-8EM 处理器完全满足上述要求。
实时内核μc/osII在InfineonC164CI-8EM 处理器上的移植
我们使用KEIL 编译器,移植μc/osII主要包括以下几个步骤:
(1)设置OS_CPU. H 中与处理器和编译器相关的代码
与编译器相关的数据类型
typedef unsigned char BOOLEAN;/* 布尔量*/
typedef unsigned char INT8U;/*8位无符号数*/
typedef signed char INT8S;/*8位有符号数*/
typedef unsigned short INT16U;/*16位无符号数*/
typedef signed short INT16S;/*16位有符号数*/
typedef unsigned long INT32U;/*32 位无符号数*/
typedef signed long INT32S;/*32 位有符号数*/
typedef unsigned int OS_STK;/* 堆栈入口宽度位16位*/
与C164 处理器相关的代码
#define OS_EXIT_CRITICAL() (IEN= 1) /* 开中断,退出临界区*/
#define OS_ENTER_CRITICAL() (IEN= 0) /* 开中断,退出临界区*/
#define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/
(2)用C语言编写6个操作系统相关的函数
(OS_CPU_C.C)
OS_STK *OSTaskStkInit (void (*task)
(void *pd),void *pdata,OS_STK *ptos,
INT16Uopt)
{
INT16U*stk;
INT32Uusr;
INT16Upage;
INT16Uoffset;
INT16Udata_pag;
INT16Udata_pof;
opt = opt;
data_pag = (INT16U)_pag(pdata);
data_pof = (INT16U)_pof(pdata);
stk = (INT16U*)ptos;
*stk-- = data_pag;
*stk-- = data_pof;
*stk-- = (INT16U)_seg(task);
*stk-- = (INT16U)_sof(task);
usr = (INT32U)stk;
offset = (INT16U)((((usr) 0x3FFF)- 10) | 0x4000);
*stk-- = offset;
page = (INT16U)(usr >> 0x000E);
*stk-- = page;
*stk-- =(INT16U)0x0800;
*stk-- = (INT16U)_sof(task);
* st k - - = ( IN T 1 6U) _ se g ( t a sk ) ;
OSTaskBuildStk(page,offset,data_pag,
data_pof);
return ((OS_STK *)stk);
}
后5 个函数是钩子函数,可以不加代码
OSTaskCreateHook (OS_TCB *ptcb);
OSTaskDelHook (OS_TCB *ptcb);
OSTaskSwHook (void);
OSTaskStatHook (void);
OSTimeTickHook (void);
(3)用汇编语言编写4 个与处理器相关的函数(O S_ CPU. A SM)多任务启动函数中调用的函数:
OSStartHighRdy( ),该函数由OSStar()函数调用,功能是运行优先级最高的就绪任务。任务切换函数:OSCtxSw(),该函数的功能是实现任务级的任务切换。中断任务切换函数:OSIntCtxSw(),该函数的功能是实现中断级的任务切换。时钟节拍服务函数:OSTickISR(),该函数提供一个时钟资源来实现时间的延时和期满功能。
完成上述工作后,μc/osII就可以运行在C164CI上运行了。
测试、编写驱动和应用程序
做完以上工作以后,就要测试移植的是否正确测试一个μc/osII实时内核并不复杂,就是让这个实时内核在自己的目标板上跑起来。开始时,可以运行一些简单的任务和时钟节拍中断任务,如果调试成功功就可以在上面添加应用程序
μc/osII功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是 μc/osII公开所有的源代码,90% 的代码使用标准的ANSIC语言书写,程序可读性强,移植性好,同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对μc/osII实时操作系统的学习研究、开发、应用具有重要意义。Infineon C164CI-8EM 处理器是一款非常优秀的16位单片机,CPU的体系片上集成了以部件:64KB OTP存储器,2KB 的片上RAM ,16位3/6通道PWM,8通道10位A/D,定时器单元,比较/ 捕捉单元。能够与常用的外围设备实现无缝连接,功能强大,目前在汽车领域应用较为广泛。
μc/osII实时操作系统结构
图 1 说明了μc/osII的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。μc /osII处理器无关的代码提供了μc/osII的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信及创建、删除任务等。
大部分的μc/osII代码是使用ANSIC语言书写的,因此μc/osII的可移植性好,然而仍需要使用C和汇编语言写一些处理器相关代码μc/osII的移植需要满足以下要求:
①处理器的C编译器可以产生可重人代码。
②可以使用C调用进入和退出临界区代码。
③处理器必须支持硬件中断,并且需要一个定时中断源。
④处理器需要能够容纳一定数据的硬件堆栈。
⑤处理器需要有能够在CPU寄存器与内存和堆栈交换数据的指令。
Infineon C164CI-8EM 处理器完全满足上述要求。
实时内核μc/osII在InfineonC164CI-8EM 处理器上的移植
我们使用KEIL 编译器,移植μc/osII主要包括以下几个步骤:
(1)设置OS_CPU. H 中与处理器和编译器相关的代码
与编译器相关的数据类型
typedef unsigned char BOOLEAN;/* 布尔量*/
typedef unsigned char INT8U;/*8位无符号数*/
typedef signed char INT8S;/*8位有符号数*/
typedef unsigned short INT16U;/*16位无符号数*/
typedef signed short INT16S;/*16位有符号数*/
typedef unsigned long INT32U;/*32 位无符号数*/
typedef signed long INT32S;/*32 位有符号数*/
typedef unsigned int OS_STK;/* 堆栈入口宽度位16位*/
与C164 处理器相关的代码
#define OS_EXIT_CRITICAL() (IEN= 1) /* 开中断,退出临界区*/
#define OS_ENTER_CRITICAL() (IEN= 0) /* 开中断,退出临界区*/
#define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/
(2)用C语言编写6个操作系统相关的函数
(OS_CPU_C.C)
OS_STK *OSTaskStkInit (void (*task)
(void *pd),void *pdata,OS_STK *ptos,
INT16Uopt)
{
INT16U*stk;
INT32Uusr;
INT16Upage;
INT16Uoffset;
INT16Udata_pag;
INT16Udata_pof;
opt = opt;
data_pag = (INT16U)_pag(pdata);
data_pof = (INT16U)_pof(pdata);
stk = (INT16U*)ptos;
*stk-- = data_pag;
*stk-- = data_pof;
*stk-- = (INT16U)_seg(task);
*stk-- = (INT16U)_sof(task);
usr = (INT32U)stk;
offset = (INT16U)((((usr) 0x3FFF)- 10) | 0x4000);
*stk-- = offset;
page = (INT16U)(usr >> 0x000E);
*stk-- = page;
*stk-- =(INT16U)0x0800;
*stk-- = (INT16U)_sof(task);
* st k - - = ( IN T 1 6U) _ se g ( t a sk ) ;
OSTaskBuildStk(page,offset,data_pag,
data_pof);
return ((OS_STK *)stk);
}
后5 个函数是钩子函数,可以不加代码
OSTaskCreateHook (OS_TCB *ptcb);
OSTaskDelHook (OS_TCB *ptcb);
OSTaskSwHook (void);
OSTaskStatHook (void);
OSTimeTickHook (void);
(3)用汇编语言编写4 个与处理器相关的函数(O S_ CPU. A SM)多任务启动函数中调用的函数:
OSStartHighRdy( ),该函数由OSStar()函数调用,功能是运行优先级最高的就绪任务。任务切换函数:OSCtxSw(),该函数的功能是实现任务级的任务切换。中断任务切换函数:OSIntCtxSw(),该函数的功能是实现中断级的任务切换。时钟节拍服务函数:OSTickISR(),该函数提供一个时钟资源来实现时间的延时和期满功能。
完成上述工作后,μc/osII就可以运行在C164CI上运行了。
测试、编写驱动和应用程序
做完以上工作以后,就要测试移植的是否正确测试一个μc/osII实时内核并不复杂,就是让这个实时内核在自己的目标板上跑起来。开始时,可以运行一些简单的任务和时钟节拍中断任务,如果调试成功功就可以在上面添加应用程序
- 嵌入式Linux内核移植相关代码分析(04-21)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 蓝牙无线耳机设计及VxWorks移植方法(07-21)
- U-Boot的编译与移植到QT-S3C44B0X开发板上(03-08)
- LPC2292的μC/OS-II硬件抽象层构建(04-26)
- μC/OS-Ⅱ在MSP430F149上的移植(03-01)