微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM 4510开发板移植uclinux手记

ARM 4510开发板移植uclinux手记

时间:10-08 来源:互联网 点击:

我并没有为arm体系结构的处理器移植uclinux操作系统,因为这方面的关键工作已经有人做完了。我只是让uclinux操作系统在恒坚ARM4510开发板上跑起来了。

一、 熟悉开发板硬件构成和基本工作原理

恒坚ARM4510开发板选用32位的高性能三星4510微控制器、SST公司2Mx16bits的FLASH和现代公司的两片8Mx16bits的 SDRAM,共同构成了基本嵌入式硬件系统,属典型的嵌入式设备开发板,而且外围实验用件、开发及接口电路较为齐全。恒坚开发板自带的集成开发环境,易学易用,作为嵌入式软件编译入门和熟悉开发板硬件构成,还是不错的。在windows环境下,安装恒坚集成开发环境。然后,先跑恒坚开发板配的流水灯实验程序。从程序中,可以体会到几点:

1、 嵌入式软件构成

嵌入式软件一般由一段汇编程序(init.s)和随后的C程序构成。汇编程序作为起始部分,被定位在0x0地址,这个地址是硬件系统上电后,首先执行的地址。汇编程序通过写微控制器的各个硬件寄存器,完成硬件的初始化,如配置SDRAM地址、数据线位数(8位、16位、32位)等,然后跳转到后面的C程序中运行。

2、 嵌入式硬件构成

软、硬件是相互关联的。虽然用放大镜查板子、万用表量电路,都是熟悉“硬”构成的基础。这方面,可以查一下微控制器的32位数据线是如何与两片SDRAM的数据线相连的;还有低16位数据线与FLASH的16位数据线是如何相连的。

通过软件编程,可以写数据到微控制器的寄存器中,以配置硬件结构、功能、性能等。比如,向微控制器的SDRAMCON0寄存器中写入 0x20040380,SDRAM的地址就映射在微控制器的存取地址区域0x1000000~0x2000000之间。如果再次向SDRAMCON0寄存器中写入0x10000380,则SDRAM的地址就映射到0x0~0x1000000之间了。同时配合改写FLASH(ROM)控制寄存器 ROMCON0的内容,可把FLASH由上电时的0x0地址,映射到0x1000000地址,这就是地址重映射(remap)原理。重映射的目的,是让程序能够在SDRAM中运行,而非FLASH中,其原因是多样的。

以上硬件相关内容,可参考《ARM应用系统开发详解──基于S3C4510B的系统设计》一书的“应用系统设计与调试”一章,还有现代公司的SDRAM芯片数据资料、SST公司的FLASH芯片数据资料等。

3、 地址重映射的实现

在跑马灯实验程序中增加代码,可以实现地址重映射,并让程序在FLASH和SDRAM中循环跑动起来。

在汇编部分(init.s)的BL C_Entry 语句后,插入如下代码:

ldr r0, =0x0 /* FLASH起始地址*/

ldr r1, =0x200000 /* FLASH大小2M */

ldr r2, =0x1000000 /*SDRAM起始地址*/

rom2ram_copy_loop: /* copy image to ram*/

ldr r3, [r0], #4 /*[r0]->r3, r0=r0+4*/

str r3, [r2], #4 /*r3->[r2], r2=r2+4*/

subs r1, r1, #4 /*r1=r1-4*/

bne rom2ram_copy_loop /*将整个FLASH中的内容,全部拷贝到SDRAM中*/

LDR r1, =rEXTDBWTH /*设置外围各芯片与微控制器连结的数据线宽度(位)*/

LDR r2, =rROMCON0_S /*设置FLASH(ROM)起始(0x1000000)、结束地址*/

LDR r3, =rROMCON1 /*设置第二片ROM,本系统没有,可忽略*/

LDR r4, =rROMCON2 /*同上*/

LDR r5, =rROMCON3 /*同上*/

LDR r6, =rROMCON4 /*同上*/

LDR r7, =rROMCON5 /*同上*/

LDR r8, =rSDRAMCON0_S /*设置SDRAM起始(0x0)、结束地址*/

LDR r9, =rSDRAMCON1 /*设置第二片SDRAM,本系统没有,可忽略*/

LDR r10,=rSDRAMCON2 /*同上*/

LDR r11,=rSDRAMCON3 /*同上*/

LDR r12,=rSREFEXTCON /*设置SDRAM刷新率及外部I/O组0的地址*/

LDR r0, =EXTDBWTH /*寄存器组的起始地址,0x3FF3010*/

STMIA r0, {r1-r12} /* remap![r1]->[r0], [r2]->[r0+4], [r3]->[r0+8]……*

/*把SDRAM的地址映射到0x0,FLASH则映射到0x1000000*/

BL C_Entry /*重映射后,再次循环走灯和闪烁*/

另外,还须更改C代码主程序C_Entry()中的内容如下:

{

//while(1) 不再进入死循环

//{

ledRun(10); //循环走灯10次

shineled(5); //闪烁5次

//}

}

用恒坚的集成编译环境编译并下载程序到开发板,观察同样的C程序在FLASH和SDRAM中运行时跑马灯的循环和闪烁速度是否不同。

恒坚开发板还配有几个程序,如串口通信实验程序,LCD显示控制实验程序。这些程序都不大,很经典,值得花些时间认真研究一下。

最后需要说明,集成开发环境多用于编译简单的程序,如单循环前后台式的、编程量不大的应用程序。如果要实现多任务下的复杂调度,又要能简化软件设计和充分利用微控制器的高性能,就要嵌入操作系统了。在引入uclinux操作系统后,一般改用命令行式的编译工具,如arm-

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

网站地图

Top