微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 3μcos_II在InfineonC164CI十六位单片机上的移植实现

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实时内核并不复杂,就是让这个实时内核在自己的目标板上跑起来。开始时,可以运行一些简单的任务和时钟节拍中断任务,如果调试成功功就可以在上面添加应用程序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top