ARM硬件平台上基于UCOS移植Lwip网络协议栈
vectors,CODE,READONLY
ENTRY
;interrupt vectors
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
初始化总线频率以满足各个BANK外接的设备正常使用,一个复杂的系统可能存在多种存储器类型的接口,需要根据实际的系统设计对此加以正确配置。对同一种存储器类型来说,也因为访问速度的差异,需要不同的时序设置。工程中我们使用的存储器包括NorFlash和SRAM,设置的访问总线宽度都为16bit。
堆栈空间是C语言正常运行所需要的基本环境,函数调用参数、返回值、函数调用关系都需要使用堆栈。因此,需要设置ARM各个运行模式的堆栈空间。
InitStack
MOV R0, LR
;Build the SVC stack
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;Build the FIQ stack
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;Build the DATAABORT stack
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;Build the UDF stack
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;Build the SYS stack
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
BX R0
调用__main()函数,此函数主要工作流程如图2.4-3 __main 函数执行流程。
图2.4-3 __main 函数执行流程
- 调用__user_setup_stackheap()设置用户模式下的栈空间和堆空间。空间可以通过程序定义,也可以通过分散加载文件制定绝对地址空间。
- 调用__rt_lib_init()初始化库函数,在必要时为用户main函数设置argc、argv参数。调用__cpp_initialize__aeabi_初始化C++特性。
- Calls main(), the user-level root of the application.
From main(),your program might call, among other things, library functions.
调用用户main函数,在main函数里,你可以调用其他用户函数,也可以调用库函数。
- Calls exit() with the value returned by main().
- 当main函数返回时,调用exit函数清理资源。
3. UCOS移植
3.1 ucos简介
UCOS是一个可裁剪、支持抢占式调度的实时嵌入式操作系统。提供基本的任务管理功能,支持信号量、邮箱、队列等任务间同步、通讯机制。
3.2 ucos移植总述
Ucos移植主要是实现保存、恢复ARM芯片执行程序所需要的寄存器环境和实现系统时钟接口需要的硬件定时器的设置及启动。需要移植实现的主要有任务级任务切换、中断级任务切换、任务堆栈初始化、系统时钟。
3.3 和移植UCOS有关的ARM芯片知识
C语言经过编译器编译、链接后生成的二进制指令是能在ARM芯片上直接执行的指令代码。这些指令执行是依赖于各种寄存器的,保护程序运行环境其实就是保护这些寄存器。
ARM芯片有7种运行模式:
1. 用户模式(user模式),运行应用的普通模式。
2. 快速中断模式(fiq模式),用于支持数据传输或通道处理。
3. 中断模式(irq模式),用于普通中断处理。
4. 超级用户模式(svc模式),操作系统的保护模式。
5. 异常中断模式(abt模式),输入数据后登入或预取异常中断指令。
6. 系统模式(sys模式),是操作系统使用的一个有特权的用户模式。
7. 未定义模式(und模式),执行了未定义指令时进入该模式。
外部中断,异常操作或软件控制都可以改变中断模式。大多数应用程序都时是在用户模式下运行。进入特权模式是为了处理中断或异常请求或操作保护资源服务的。
些工作模式是芯片硬件提供的程序运行的不同环境,不同的模式有不同的硬件访问权限,使用不同的寄存器。这就给不同的程序提供了不同的权限机制,你比如说你的操作系统代码运行在权限比较高的模式下,而你的应用程序运行在权限比较低的模式下。这样就起到了对操作系统代码的保护作用。
寄存器,各个模式下可见的寄存器以及各个寄存器的功能:
ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器。但在同一时间,对程序员来说并不是所有的寄存器都可见。在某一时刻存储器是否可见(可被访问),是处理器当前的工作状态和工作模式决定的。其各个模式下的寄存器如图3.3-1 ARM各种运行模式:
图3.3-1 ARM各种运行模式
其中系统模式和用户模式所用的寄存器是一样的。画三角阴影的寄存器表示在不同模式下有不同的物理寄存器。
以下对其进行分类说明。
通用寄存器:
ARM的通用寄存器包括R0~R15,其中R0~R7是属于未分组寄存器,各个模式下都使用同样的寄存器。R8~R14在FIQ模式下是有独立的物理寄
ARM硬件平台UCOS移植网络协议 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)