微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM硬件平台上基于UCOS移植Lwip网络协议栈

ARM硬件平台上基于UCOS移植Lwip网络协议栈

时间:11-20 来源:互联网 点击:

存器,其目的是加快中断响应速度,从硬件上保存程序执行现常R13和R14这两个寄存器在每种模式下都有自己的独立寄存器。R15只有一个,所有模式公用。

下对这些寄存器中的比较有特殊功能的做一下介绍:

寄存器R13:在ARM指令中,常用R13做堆栈指针用。每种运行模式都有自己独立的堆栈,用于保存中断发生时的程序运行环境和C语言执行时进行过程控制。

寄存器R14:专职持有返回点的地址,在系统执行一条“跳转并链接(link)”(BL)指令

的时候,R14将收到一个R15的拷贝。其他的时候,它可以用作一个通用寄存器。相应的它在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und都同样用来保存在中断或异常发生时,或时在中断和异常中执行了BL指令时,R15的返回值。

寄存器R15是程序计数器(PC)。在ARM状态下,R15的bits[1:0]为0,bits[31:2]保存了PC的值。在Thumb状态下,bits[0]为0同时bits[31:1]保存了PC值。

FIQ模式拥有7个私有寄存器R8-14(R8_fiq-R14_fiq)。在ARM状态下,多数FIQ处理都不需要保存任何寄存器。用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄存器,R13和R14。允许这些模式都可拥有1个私有堆栈指针和链接(link)寄存器。

程序状态寄存器。

ARM920T具有一个当前程序状态寄存器(CPSR),另外还有5个保存程序状态寄存器(SPSRs)用于异常中断处理。这些寄存器的功能有:

1. 保留最近完成的ALU操作的信息。

2. 控制中断的使能和禁止。

3. 设置处理器的操作模式。

状态寄存器各位定义见图3.3-2 ARM状态寄存器:

图3.3-2 ARM状态寄存器

3.4 系统堆栈和UCOS的任务堆栈

当产生外部中断或者系统异常时,ARM会进入相应的模式,各种运行模式均有其独立的堆栈空间。UCOS中的任务是调度的最小单元,每个任务都有自己独立的堆栈空间,当任务运行时,它用来保存一些局部变量,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。

3.5 系统时钟

系统时钟是UCOS管理任务延时的基本依据,要求有一个周期性的定时器产生固定间隔时间。我们使用LPC2220的定时器0产生固定时间间隔事件,时间间隔设置为10ms,定时时间到产生中断。UCOS系统时钟处理函数是OSTimeTick(),时间中断服务程序里调用此函数即可。

3.6 任务级任务切换

UCOS的用户调用一些系统服务时(比如,OSTimeDly、OSSemPend),就会产生任务级任务切换。其切换的实质是保存正在执行任务的执行现场,然后恢复应该运行的任务的运行现场。
本工程中使用软中断的方式实现任务级任务切换的目的。
任务级切换函数的底层接口是使用的软中断技术,用__swi来声明一个不存在的函数,则调用这个函数就在调用这个函数的地方插入一条SWI指令,并且可以指定功能号。定义如下:__swi(0x00) void OS_TASK_SW(void); /* 任务级任务切换函数 */
调用OS_TASK_SW()这个函数时就会产生一个软中断,产生软中断后执行软中断服务程序。服务程序主要代码分析如下:
SoftwareInterrupt
LDR SP, StackSvc ; 重新设置堆栈指针
STMFD SP!, {R0-R3, R12, LR}
MOV R1, SP ; R1指向参数存储位置

MRS R3, SPSR
TST R3, #T_bit ; 中断前是否是Thumb状态
LDRNEH R0, [LR,#-2] ; 是: 取得Thumb状态SWI号
BICNE R0, R0, #0xff00
LDREQ R0, [LR,#-4] ; 否: 取得arm状态SWI号
BICEQ R0, R0, #0xFF000000
; r0 = SWI号,R1指向参数存储位置
CMP R0, #1
LDRLO PC, =OSIntCtxSw
LDREQ PC, =__OSStartHighRdy ; SWI 0x01为第一次任务切换

BL SWI_Exception

LDMFD SP!, {R0-R3, R12, PC}^
代码难点分析:
软中断指令使处理器进入管理模式,而用户程序处于系统/用户模式,其它异常也有自己的处理器模式,都有各自的堆栈指针,不会因为给堆栈指针赋值而破坏其它处理器模式的堆栈而影响其它程序的执行。返回的地址已经存储在连接寄存器LR中而不是存储在堆栈中。由于进人管理模式自动关中断,所以这段程序不会被其它程序同时调用。
因为ARM处理器核具有两个指令集,在执行Thumb指令的状态时不是所有寄存器都可见(参考ARM的相关资料),而且任务又可能不在特权模式(不能改变CPSR)。为了兼容任意一种模式,本移植使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并使用功能0实现OS_TASK_SW()的功能。
因任务级任务切换使用的是软中断技术,我们把osctxsw()与osintctxsw()合二为一了,统一采用osintctxsw()来实现。之所以这样搞的原因是任务进行切换的时候,都必须进入软中断的状态,而对于软中断的异常响应代码已经将任务的环境变量进行了保存,从而也不需要像osctxsw()里面规定的那样对将环境变量进行保存。osintctxsw()函数的移植分析见3.7中断级任务切换。

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

网站地图

Top