当前位置:首页 > 嵌入式 > 嵌入式硬件

摘要:针对实时操作系统 μC/OS-II没有自己的网络协议栈,提出了基于 ARM7TDMI处理器的 μC/OS-II操作系统上轻型 PPP协议的设计与实现,对 μC/OS-II与处理器相关的代码部分进行了修改与编译,实现了 μC/OS-II在 ARM开发板上移植,为 PPP协议的设计与实现提供了系统软件开发平台。通过编写了 PPP协议main主模块、LCP模块、PAP模块、NCP模块和PPP等模块代码,在μC/OS-II操作系统中实现了轻型 PPP协议。通过测试,验证了 ARM开发板的 PPP协议的网络通信功能。

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所示。


用软中断作为操作系统的底层接口就需要在 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主模块:该模块控制着整个 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数据帧。

4 轻型 PPP协议模块的测试和性能分析

根据点对点通信的特点,分别在 PC和ARM板两端安装一个Modem,通过一个交换机,或直接用电话线连接起来。由 PC端通过拨号软件,进行与 ARM开发板端的连接后,分别通过双方的协商,建立数据通信;在ARM开发板端,建立一个Test_task测试任务模块,将一个信息“ hello world”封装成 UDP包,再经 PPP模块的封装,发送到 PC机端,PC机端若与ARM板连接成功,在 Modem状态对话框中,能够正确的显示出对方所发送来的字符数和自己发送给对方字节数以及连接状态;若 PC端显示出这个信息,说明PPP模块得以实现。通过测试后,其 Modem状态连接图如图 1所示。


从PC端的Modem状态连接图可知,该 PC机端已经通过了相互协商,建立连接,处于数据帧的接收状态。已经正确地接收到由 ARM开发板所发送的PPP数据帧,进行了相互通信,表明 ARM板上PPP协议成功的得到了实现。

5 结束语

本文作者创新点在于从uCOS—II内核工作原理入手 ,以ARM开发板为平台,简述了系统硬件平台 ARM7TDMI处理器的体系结构和相应的指令集。对与处理器相关的代码部分进行了修改与编译,实现了μC/OS-II在ARM开发板上移植;在该系统平台上重点的介绍了轻型PPP协议设计与实现的具体过程,主要对main主模块、LCP模块、PAP模块、NCP模块和PPP模块等五个方面的设计与代码编写。通过测试,验证了ARM开发板的PPP协议的网络通信功能。



可可

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式系统开发、调试和测试过程中,J-Link作为一种高效的调试工具,为开发者提供了极大的便利。然而,要想充分发挥J-Link的功能,首先需要正确安装其驱动程序。本文将详细介绍J-Link驱动的安装过程,并深入解析其中...

关键字: jlink 嵌入式系统 嵌入式开发

与谷歌的合作使 Nordic 能够在 nRF Connect SDK 中嵌入开发人员软件,以构建与安卓移动设备兼容的谷歌Find My Device和未知跟踪器警报服务

关键字: 谷歌 SoC 嵌入式开发

嵌入式开发作为当今电子工程和信息技术领域的核心分支,涵盖了广泛的软硬件技术和系统集成方法,用于构建高性能、低成本、低功耗、体积小巧且功能专一的嵌入式系统。这些系统无处不在,从微型传感器节点到复杂的工业控制设备,从日常使用...

关键字: 嵌入式开发 Python

嵌入式开发是当今信息技术领域不可或缺的一部分,它融合了硬件设计、软件开发和系统集成等多个学科,专门用于创建那些被嵌入到特定设备或系统中的专用计算机系统。嵌入式开发的主要过程包括利用分立元件或集成器件进行电路设计、结构设计...

关键字: 嵌入式开发 硬件设计 软件开发

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...

关键字: 嵌入式开发 C语言

嵌入式开发是一项综合了硬件设计、软件编程以及系统整合的技术活动,其目的是为了创造出能够在特定环境中高效、稳定运行的嵌入式系统。这一流程涵盖了多个紧密关联且不可或缺的阶段,从最初的客户需求分析到最终的产品测试和交付,每个环...

关键字: 嵌入式开发 硬件设计

嵌入式开发作为一个融合了计算机软硬件和系统工程的综合性领域,其成功与否往往取决于三个核心要素的有效整合与协调。这三个要素分别是:硬件平台的选择与设计、软件开发及其优化、以及系统级的设计与集成。深入理解并熟练掌握这三个方面...

关键字: 嵌入式开发 ARM

嵌入式开发作为信息技术的关键支柱,在全球数字化转型浪潮中扮演着无可替代的角色。从传统的嵌入式微控制器到如今先进的片上系统(SoC),再到与云计算、人工智能深度融合的智能终端,嵌入式系统的演进与发展始终紧跟时代脉搏。本文将...

关键字: 嵌入式开发 智能应用

嵌入式开发是一种专门针对特定硬件平台设计和实现软件系统的工程实践,它涵盖了从需求分析、系统设计、编程实现、调试测试直到产品部署及维护的全过程。本文将深入探讨嵌入式开发的主要阶段,分解其流程并阐述每个步骤的关键要点,以便于...

关键字: 嵌入式开发 嵌入式软件
关闭
关闭