轻型PPP协议在μC/OS-II操作系统中的实现
1 引言
随着嵌入式技术的发展,让嵌入式设备接入Internet,实现网络资源共享,是未来发展的必然趋势,μC/OS-II操作系统中没有完备的网络协议栈[1,2],要实现嵌入式设备网络通信,必须要有自己的网络协议。鉴于目前PPP协议使用的普遍性和广泛性[3,4],本文提出了基于ARM7TDMI处理器的μC/OS-II操作系统上PPP协议的设计与实现。通过PPP协议在μC/OS-II上的实现[5,6],能让嵌入式设备接入Internet,进行信息互访,为未来的“普适计算”的发展提供了一个有利条件。
2 μC/OS-II移植实现
2.1 编写ARM7TDMI的启动程序
启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,启动代码主要有4个文件:Vectors.s、Init.s、 Target.c和Target.h。Vectors.s主要包括了异常向量表、堆栈初始化InitStack和中断服务程序与C程序的接口。而 Init.s主要是指系统初始化代码,执行的顺序是初始化堆栈,目标设备初始化和执行Main模块。对于Target.c和Target.h来说,主要包含了异常处理程序和目标板初始化程序。
2.2 μC/OS-II的移植
OS_CPU.H中函数软中断SWI机制[7],为了使底层接口函数与处理器状态无关,同时在对底层函数调用不需要知道函数的位置,因此在uC/OS移植中,使用软中断指令SWI[1]作为底层接口,通过不同的功能号来区分不同的函数,其软功能分配号如表1所示。
表1 软中断功能号分配
Table 1 SWI function number assignments
功能号 | 接口函数 | 简述 |
0x00 | Void OS_TASK_SW() | 任务级任务切换函数 |
0x01 | _OSStartHighRdy(void) | 运行优先级最高的任务 |
0x02 | Void OS_ENTER_CRITICAL() | 关中断 |
0x03 | Void OS_EXIT_CRITICAL() | 开中断 |
0x40 | Void *GetOSFunctionAddr(int index) | 获取系统服务函数入口 |
0x41 | Void *GetUdrFunctionAddr(int index) | 获取自定义服务函数入口 |
0x42 | Void OSISRBegin(void) | 中断开始处理 |
0x43 | Int OSISRNeedSwap(void) | 判断中断退出需要切换吗 |
0x80 | Void ChangeToSYSMode(void) | 任务切换到系统模式 |
0x81 | Void ChangeToUSRMode(void) | 任务切换到用户模式 |
0x82 | Void TaskIsARM(INT8U prio) | 任务切换是ARM代码 |
0x83 | Void TaskIsTHUMB(INT8U prio) | 任务切换是THUMB代码 |
用软中断作为操作系统的底层接口就需要在C语言中使用SWI指令。在ADS中,有一个关键字_swi,用它声明一个不存在的函数,若在用户任务中调用这个函数就在调用这个函数的任务代码中地方插入一条SWI指令,并且指定了功能号。
OS_CPU.H中关中断OS_ENTER_CRITICAL()和开中断OS_EXIT_CRITICAL()都是用来保护临界资源代码[8]。移植使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并通过调用功能号0x02和Ox03来关中断和开中断。但在C语言中,仍然使用OS_ENTER_CRITICAL()关中断,而使用OS_EXIT_CRITICAL()开中断。
OS_CPU.H中通过使用结构常量OS_STK_GROWTH中值来指定堆栈的生长方式:当OS_STK_GROWTH置为1时,表示在堆栈存储时,是从上到下的方式存储。当OS_STK_GROWTH置为0时,表示在堆栈存储时,是从下向上的方式存储。
OS_CPU_A.S中OS_TASK_SW()是在μC/OS-II中从低优先级任务切换到最高优先级任务时被调用的。在ARM移植使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并调用功能号0实现OS_TASK_SW()的功能。但在C语言中,仍然使用OS_TASK_SW()函数进行任务切换功能。
OS_CPU_A.S中OSStartHighRdy():在多任务环境下,OSStart()最终调用OSStartHighRdy()函数运行多任务启动优先级最高的任务。移植中使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并使用功能号1实现OSStartHighRdy()功能。在调用OSStartHighRdy()函数之前,OSTCBHighRdy指向的是优先级最高的任务的任务控制块。
OS_CPU_C.C中断服务子程序的算法如下:
void XxxISR(void)
{OS_ENTER_CRITICAL()或直接给变量OSIntSum赋1;
清除中断源(与具体的外设有关);
通知中断控制器中断结束:VICVectAddr=0;
开中断:OS_EXIT_CRITICAL();
用户处理程序;}
OS_CPU_C.C中任务堆栈的初始化函数OSTaskStkInit()
OS_STK *OSTaskStkInit()
{模拟带参数(pdata)的函数调用;
模拟ISR向量;
按照预先所设定的寄存器值初始化堆栈结构;
返回栈顶指针给调用该函数的函数;}
3 轻型PPP协议的设计与实现
PPP协议软件模块主要通过各层协商机制完成数据链路的建立、配置、测试、以及在链路连接建立后,将收到的PPP数据帧解析,根据协议字段将数据信息交由不同的上层模块进行处理;同时可根据系统的需要,将上层模块传来的信息打包成不同的PPP数据帧发送出去。
Main主模块:该模
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)