首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 ADS 移植 uC/OS-II 的实例分析

使用 ADS 移植 uC/OS-II 的实例分析

使用 ADS 移植 uC/OS-II 的实例分析


摘 要:  本文介绍了使用 ARM 公司提供的 ADS 开发工具,进行移植 uC/OS-II 的工作。结合基于 StrongARM 评估板的硬件结构,对移植工作中的若干要点做了详细分析。最后,给出了移植体会和程序技巧分析。

关键词:  ADS  uC/OS-II  StrongARM  移植 

 

一、             选择开发工具

在嵌入式系统设计中,开发工具的选取是一个重要的考虑因素,通常这是与开发项目的需求和应用背景相关。一般嵌入式开发工具包含用于目标系统的交叉编译器、连接器、调试器以及辅助处理用的二进制文件分析工具等。

目前可以用来编译链接产生 ARM 处理器执行代码的开发工具主要有如下几类:

1.         ARM 公司提供的 ARM Developer Suite 集成开发环境

主要工具有 armasm、armcc、armlink、fromelf 等。

2.         GNU 组织提供的 tool chain for arm

主要工具有 arm-elf-gcc、arm-elf-gdb、arm-elf-objcopy 等

3.         Microsoft公司提供的 eMbedded Visual Tools

主要工具有 clarm、clthumb、c2_arm、link、lib等

       这里我们选用 ARM 公司提供的 ADS 下的工具集来编译我们的程序和链接目标代码并最终生成可执行的二进制映像。这里介绍一下主要会用到的一些工具:

armasm.exe : 汇编文件编译器

armcc.exe  : C 文件编译器

armlink.exe : 目标文件连接器

fromelf.exe : 用于将 axf 或者 elf 格式转换成其他格式的文件,例如二进制映像。

armprof.exe : 对调试过程中生成的 profiling 记录文件做分析用的工具软件

51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)

二、             存储空间分配

1.         存储器组织

StrongARM 存储器组织主要分4个部分:

1)        0h0000 0000 ~ 0h3FFF FFFF

用于静态存储器 ROM、SRAM、FLASH

2)        0h4000 0000 ~ 0h8FFF FFFF

用于静态存储器和各种 I/O 器件

3)        0h8000 0000 ~ 0hBFFF FFFF

包括所有片内寄存器,主要用于外围控制、系统控制、存储扩展、LCD和DMA。

4)        0hB000 0000 ~ 0hFFFF FFFF

用于动态存储器,DRAM、SDRAM等

2.         堆栈空间分配

| 0xc2000000 -------- 系统堆栈从 0xc2000000 开始向下增长

|                     其中 0xc2000000 为 svc 态的堆栈栈底

|                          0xc1000000 为 irq 态的堆栈栈底

| SDRAM (32M)   

|

| 0xc0000000 -------- rw-base  这里是程序的 rw 段,包括 uC/OS-II 的任务堆栈空间

|

:

|

| 0x02000000 --------

|

| FLASH ROM (32M)    

|                     从 0x00000000 开始依次放置跳转指令,即异常向量表

| 0x00000000 -------- ro-base 这里是程序的 text 段和 ro 段

 

三、             启动代码

由于板子的 0x0 地址处是 32M 的Flash ROM,因此在板子加电后,会从 Flash 中顺序执行启动代码。为了能使得 uC/OS-II 运行,启动代码需要完成如下工作:

1.         设置 异常向量表,即在 0x0 – 0x1c 位置放置7条跳转指令(其中 0x14 为空)

2.         分别实现每种异常的处理程序,其中包括 Reset_Handler、Undefined_Handler、SWI_Handler、Prefetch_Handler、Abort_Handler、IRQ_Handler、FIQ_Handler。

3.         程序从 Reset_Handler 进入后,需要首先进行相关硬件的初始化操作,例如 初始化SDRAM、CPU speed、Interrupt Controller、UART、timer 等。

4.         建立每种异常状态下的系统堆栈,为了简单起见可以只在 svc 态 和 irq 态下的建立堆栈:setup_svc_stack ,setup_irq_stack。

5.         强制 ARM 处理器状态转换为 svc 管理态。

6.         跳转到uC/OS-II 代码的 main 入口,实际上是编译链接后产生的 __main 入口。

51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)

四、             时钟与中断处理

1.         时钟控制逻辑

OS Timer Interrupt Enable Register
 
Operating System Match Register 0-3
 
Operating System Counter Register
 
Operating System Status Register
 

在上图中,有4种和系统时钟相关寄存器,它们的含义如下:

l         OSCR:  一个自动递增计数的 32 位计数器。

l         OSMR3-0:  4 个 32 位的匹配寄存器,当 OSCR 的值匹配时产生中断。

l         OSSR:  状态寄存器,当 OSCR 和 OSMR 匹配时,会对 OSSR 做标志。

l         OIER:  使能寄存器,表示当匹配发生时,允许在 OSSR 设置一个标识位。

OSCR 在自动累加的过程中,与OSMR里面设定的那些匹配寄存器进行匹配,发现有匹配的事件时,就会对 OSSR 中的相应位置设一个标志位“1”,表示OSCR与对应的OSMR 发生了匹配。当然这个匹配发生的前提是发生匹配的那个OSMR在OIER中的相应位被使能,否则OSMR中的设置将不起作用。

2.         系统时钟初始化流程

uC/OS-II 中创建的第一个任务将负责启动时钟节拍,时钟的初始化设置流程如下:

1) 设置 OSMR0 = x ,表示 初始化 OSMR0,即当计数器为x时发生匹配

2) 设置 OSSR = 0xf ,表示 清除所有已经发生的匹配,写“1”清除

3) 设置 OIER = OIER_EO ,表示 使能 OSMR0 来产生匹配

4) 设置 OSCR = 0 ,表示 初始化计数器的开始值 为 0

3.         系统时钟中断复位

1) 清除 OSSR 中的相应位,即向发生匹配的OSMR的那个对应位写“1”

2) 设置 OSCR = 0 ,表示 继续初始化计数器的值为 0

4.         中断控制器相关的寄存器

l         ICPR:  中断标示寄存器,表示了当前系统正处于激活状态的中断源。

l         ICMR:  中断屏蔽寄存器,用来屏蔽相应位的中断。

l         ICLR:  中断级别设置寄存器,设定报告中断的级别是 IRQ 或者是 FIQ 。

l         ICIP:  IRQ 级别的中断源寄存器,用来标识 IRQ 中断发生的源设备。

l         ICFP:  FIQ 级别的中断源寄存器,用来标识 FIQ 中断发生的源设备。


5.         中断控制器初始化流程

1) 设置 ICMR 屏蔽位为不屏蔽时钟中断 OSMR0 (相应位写“1”)

2) 设置 ICLR 为都报告为 IRQ 级别(所有位写“0”)

 

51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode