基于嵌入式实时操作系统的现场总线网关的设计
在μC/OS-Ⅱ中同样实现了消息队列结构OSQ及其相应操作函数,但在μC/OS-Ⅱ并没有对消息队列中的消息进行管理,因此不能直接使用,所以sys_mbox_t结构定义如上面所述。对队列本身的管理利用μC/OS-Ⅱ的OSQ操作完成;对消息的创建、使用、删除回收使用μC/OS-Ⅱ中的内存管理模块实现,两部分综合起来形成了LwIP的消息队列功能。
2.网络设备驱动程序
驱动程序主要包括:
(1) 初始化CPU芯片s3c4510b的ethernet controller的寄存器和PHY芯片ICS1890的控制寄存器;
(2) 中断处理函数;
(3) 接收数据包和发送数据包处理函数。
四、μC/OS-Ⅱ在s3c4510b上的移值
μC/OS-Ⅱ是一个开源的RTOS,其主要工作流程如图4所示。任务切换的核心是利用出栈指令将每个任务的工作现场恢复,并且调整PC指针来完成任务的切换。μC/OS-Ⅱ移值的关键就是如何构造任务堆栈及切换任务时的出栈顺序。在这个流程图中我们可以看到在移值过程中需编写的几个子程序的位置。
由图4的工作流程可以看出要实现μC/OS-Ⅱ的移值,必须对系统源码做必要的修改,主要集中在以下三个文件中。
(一) OS CPU.H文件
OS_CPU.H中包括了用#define定义的与处理器相关的常量、宏、数据类型、堆栈单位和堆栈增长方向。
1.数据类型定义
不同的处理器有不同的字长,而且数据字长和所用的编译器也有关系,因此在移植中要定义一些数据类型。在本网关的设计中所用的编译器是开源的GNU下的arm-elf-gCC,用户需要做的就是查看所用的编译器手册,确定对应于μC/OS-Ⅱ的标准C数据类型。
2.堆栈单位及增长方向
任务堆栈的数据类型必须和CPU的寄存器长度一致,通过为OS_STK声明正确的数据类型来完成的,在本设计中的声明如下:
typedef unsigned int OS_STK;
/ * Each stack entrY is 32_bit wide */
堆栈的增长用OS_STK_GROWTH来设置,OS_STK_GROWTH为O表示堆栈从下向上增长,为1表示堆栈从上向下增长,在本设计中的定义如下:
#define OS_STK_GROWTH l
3.宏定义
宏定义包括开关中断及任务切换的宏定义:
#define OS_ENTER_CRITICAL( )ARMDis-ableInt( )
#define OS_EXIT_CRITICAL( )ARMEna-bleInt( )
#define OS_TASK_SW( )OSCtXSw( )
(二)OS_CPU_C.C
OS_CPU_C.C主要包括任务堆栈的初始化,及系统钩子函数的定义。在这个文件中包括以下6个函数:
OSTaskStkInit( )
OSSTaskCreateHook( )
OSTaskDelHook( )
OSTaskSwHook( )
OSTaskStatHook( )
OSTimeTickHook( )
其中5个HOOK函数如果没有特殊要求,只需声明为空函数,必须修改的是OSTaskStkInit ( )。 OSTaskStkInit( )的实现如下:
void * OSTaskStkInit (void (* task) (void * pd),void * pdata,void * ptos,INTl6Uopt)
{
unsigned int * stk;
评论