新闻中心

EEPW首页>嵌入式系统>设计应用> 基于S3C44B0芯片的uClinux内核引导过程分析

基于S3C44B0芯片的uClinux内核引导过程分析

作者: 时间:2012-04-20 来源:网络 收藏

然后,对存储器空间中需要清零的区域进行清零操作,该区域的范围往往是由开发人员通知编译器的,主要是用来存放C语言中全局变量等。

LDR a1, = Image_ZI_Base /* 获取清零区域基地址*/

MOV a3, #0 /* 清零a3寄存器*/

LDR a2, = Image_ZI_L imit /* 获取清零区域尾地址*/

CMP a1, a2

BEQ move_data

clear_loop: : /* 清零Image_ZI_Base到Image_ZI_Limit区域*/

STR a3, [ a1 ] , #4/* 清零4个字节,即一个字*/

CMP a1, a2 /* 判断是否到达清零区域尾部*/

BNE clear_loop /* 否则,继续清零循环*/

(4) 为运行C程序组织堆栈。由于在系统的下一阶段,通常会使用C语言来完成大部分(如建立主机通信、驱动外部端口的工作) ,故必须调整SP指针到堆栈顶,为C程序配置合适的堆栈环境。在具体实现中为避免堆栈数据被程序运行代码破坏,往往会把堆栈设置在RAM的高端地址,并把堆栈的生长方向设为向下生长,这样可以最大限度地利用RAM空间,同时可以避免上述问题发生。

(5)拷贝初始化阶段代码到RAM。由于在中Flash和RAM是统一编址的,只需通过简单的循环来实现代码拷贝工作。

copy_code_to_ram :

LDR r3, = Flash_Sou/* Flash_Sou为Flash中代码首地址*/

LDR r2, =Ram_Dest /* Ram_Dest为Ram中代码首地址*/

LDR r1, = 0

next :

LDR r0, [ r1 ] , #4

STR r0, [ r2 ] , #4 /* 复制到ram*/

CMP r1, r3

BNE next

跳转到C程序入口:

LDR pc, =Main

系统初始化阶段

系统初始化阶段的主要工作是建立与主机间的通信、初始化定时器、检测内存映射、加载镜像和配置启动参数等。

与主机建立通讯

面向最终用户的嵌入式产品,其启动应该是不需要人工干预的,但对于大多数嵌入式开发平台而言,必须通过某种方式与主机间建立通讯联系,输出启动提示信息,以实现人工干预的系统启动,提供更加丰富的附加功能。一般情况下,最为廉价和简单的方式是通过串口实现嵌入式系统与主机间通讯(提供2个Uart口,建立通信前必须初始化至少一个),这种情况下就必须事先对串口进行初始化工作。

以本开发板为例,在系统初始化的初期,就进行了Uart口的初始化工作,并通过该端口与用户宿主机上的超级终端程序通信,从而提供了多种启动功能的选择,包括Demo程序下载、Flash重新编程等。Uart0口初始化过程可参看以下C代码,其中波特率因子的计算公式可以查阅手册。

rULCON0 = 0x3;//设置Uart0 口线控寄存器,无奇偶效验, 8数据位, 0停止位

rUCON0 = 0x345;//设置Uart0控制寄存器

rUBRD IV0 = ( ( int) (mclk /16. /baud + 0.5) - 1 ) ;//设置波特率因子,其中mclk和baud为系统频率和波特率

初始化定时器

通过设置系统定时器相关的寄存器,实现为操作系统提供最基本的系统时钟支持。

检测内存映射

为防止发生内存映射错误,即系统映射到物理地址不存在的空间,必须对内存地址作读写一致性效验。通常做法是以内存页为单位,在每个页头进行读写操作,并比较读写结果。



评论


相关推荐

技术专区

关闭