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指向的是优先级最高的任务的任务控制块。[page]
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主模块:该模块控制着整个PPP守护进程的程序流程。当PPP连接成功后,它使PPP守护进程进入休眠状态,一直到管理员断开或者外部事件引起断开时它负责断开PPP连接。在PPP成功建立连接后,建立一个信号量,由PPP模块处理任务不断检测这个信号量;若检测到有调制解调器中断复服务程序发来的信号量,则进行PPP数据帧的发送或接收。
LCP模块:该阶段是通过交换配置数据包来建立和配置数据链路,发送LCP REQ数据包,将会收到客户端的发送过来的LCP ACK数据包,客户端还要回REQ数据包,服务器端接受到LCP REQ后,则向客户端同样发送一个LCP ACK数据包,至此链路协商正式结束。
认证协商模块(PAP):认证阶段是可选的,如果在链路建立协商阶段,服务器发送的第一个LCP REQ数据包中含有了认证的数据选项,而且其数据选项一直没有被对方拒绝并且得到确认,则进入认证协商阶段;否则,进入网络层协商阶段。
网络层协商模块(NCP):NCP协商的主要目的是服务器首先让客户端确认自身的IP地址,然后给客户端动态分配一个合法的IP地址。网络层协商 NCP每次请求数据包必须含有服务器端的IP选项,并且此选项最终被确认。在客户端回送了对服务器端的确认数据包后,开始进入客户端向服务器端申请动态分配IP地址的阶段,所以客户端继续向服务器端发送含有客户端IP地址且值为0的NCP REQ数据包,服务器端接受到这个数据包后,从IP地址池中取出一个合法的IP地址,发送了一个NCP NAK数据包。在该数据包中,客户端IP地址的数据选项中填入了从IP地址池中取出的IP地址的值,即给客户端动态的分配IP地址的值。随后,客户端将接收到的NCP NAK中的IP地址值作为下一次回送的NCP REQ中的客户端的IP地址值的选项。当服务器端再接收到此NCP REQ数据包后,便发送NCP ACK数据包,至此整个PPP协商过程结束,链路建立成功。
PPP模块:在协商好网络协议,可以进行数据的传输。为了更实时的进行数据传输,在这里为PPP协议模块建立一个信号量,当发生modem接受事件时,当Modem接收到数据时引发处理器的外部中断。在外部中断0处理函数中,将接收到的数据存入串口缓冲区中,如果缓冲区的数据已组成了一个完整的 PPP数据帧,则由中断服务子程序通过µC/OS-II所提供的OSSemPost()向任务PPP模块任务发送一个信号量。
对PPP模块任务来说,通过OSSemPend()函数等待由Modem中断服务程序发出的信号量,当接收到这个信号量后,说明有事件发生;再次判断这个事件是什么事件,若是接送事件,则调用Receive()接收PPP数据帧,放到SRAM接收缓冲区,若接收后,判断接收缓冲区是否正确地接收到数据,若正确地接收到PPP数据帧时,则调用PPPInput()进行对PPP数据帧的解析。若帧类型是IP则调用IP数据包的处理例程;若帧类型是LCP则调用LCP数据帧的处理例程;若帧类型是PAP、NCP则分别调用这两种类型数据包的处理例程。若是发送事件,则调用 Send()发送PPP数据帧。[page]
4 轻型PPP协议模块的测试和性能分析
根据点对点通信的特点,分别在PC和ARM板两端安装一个Modem,通过一个交换机,或直接用电话线连接起来。由PC 端通过拨号软件,进行与ARM开发板端的连接后,分别通过双方的协商,建立数据通信;在ARM开发板端,建立一个Test_task测试任务模块,将一个信息“hello world”封装成UDP包,再经PPP模块的封装,发送到PC机端,PC机端若与ARM板连接成功,在Modem状态对话框中,能够正确的显示出对方所发送来的字符数和自己发送给对方字节数以及连接状态;若PC端显示出这个信息,说明PPP模块得以实现。通过测试后,其Modem状态连接图如图1所示。
图1 Modem状态连接图
Fig.1 The state link block of modem
从PC端的Modem状态连接图可知,该PC机端已经通过了相互协商,建立连接,处于数据帧的接收状态。已经正确地接收到由ARM开发板所发送的PPP数据帧,进行了相互通信,表明ARM板上PPP协议成功的得到了实现。
5 结束语
本文作者创新点在于从uCOS—II内核工作原理入手,以ARM开发板为平台,简述了系统硬件平台ARM7TDMI处理器的体系结构和相应的指令集。对与处理器相关的代码部分进行了修改与编译,实现了µC/OS-II在ARM开发板上移植;在该系统平台上重点的介绍了轻型 PPP协议设计与实现的具体过程,主要对main主模块、LCP模块、PAP模块、NCP模块和PPP模块等五个方面的设计与代码编写。通过测试,验证了 ARM开发板的PPP协议的网络通信功能。
1. Jean J L.uC/OS-||The Real_Time Kernel[M].2nd ed.北京:北京航空航天出版社,2003.
2. uC/OS-II for ARM Processors[Z].2006.http://www.Micrium.com.
3. The Point-to-Point Protocol[S]. RFC 1661, 1994.
4. 姚念龙,尹航,姜久春.μC/OS-Ⅱ在MC9S12A64上的移植及应用[J]. 微计算机信息,2006,12-2:53-55。
5. 谢林枫.基于PPP协议单片机拨号上网的设计与实现[J].单片机与嵌入式统应用,2002,(7):53-55.
6. ARM Developer Suite Version1.2 CodeWarrior IDE Guide[Z].2006. http://www.arm.com
7. LABROSSE J J.嵌入式实时操作系统uC/OS-Ⅱ[M].2版.邵贝贝,译.北京:北京航空航天大学出版社,2005.
8. Andrew N S,Dominic S,Chris W.ARM System Developer’s Guide designing and Optimizing System Software[M].北京:北京航空航天出版社,2005.
上一篇:基于WinCE的嵌入式系统注册表的研究
下一篇:基于Windows CE的7×3手机键盘驱动实现
推荐阅读最新更新时间:2024-05-02 21:58
- 热门资源推荐
- 热门放大器推荐
- 电力工程设计手册 26 工程测绘
- 基于状态机的嵌入式系统开发
- 嵌入式系统软硬件协同设计教程:基于Xilinx Zynq-7000 (符意德)
- 深入理解Linux驱动程序设计 (清华开发者书库) (吴国伟 姚琳 毕成龙)
An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
If you are the system administrator of this resource then you should check the error log for details.
Faithfully yours, OpenResty.
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况