ARM Bootloader的实现 ---C和ASM混合编程

[复制链接]
2872|0
 楼主| foxice 发表于 2007-4-10 16:19 | 显示全部楼层 |阅读模式
Cirrus&nbsp;Logic&nbsp;的&nbsp;clps7111~Ep9312&nbsp;系列ARM&nbsp;core&nbsp;的&nbsp;CPU&nbsp;内置&nbsp;128&nbsp;字节的boot&nbsp;程序。这个&nbsp;boot&nbsp;程序为把操作系统下载到裸机提供了极大的方便。这样再焊接电路板之前不用把操作系统预先写入&nbsp;Flash&nbsp;,而且日后升级操作系统也非常方便。&nbsp;这个&nbsp;boot&nbsp;程序的功能是:&nbsp;<br /><br />1.&nbsp;设置串行口的参数为:&nbsp;9600&nbsp;,&nbsp;8N1&nbsp;,&nbsp;No&nbsp;FlowControl&nbsp;。&nbsp;<br />2.&nbsp;然后送出一个&nbsp;&lt&nbsp;字符<br />3.&nbsp;开始接收&nbsp;2K&nbsp;字节程序(&nbsp;Bootloader&nbsp;)<br />4.&nbsp;送出一个&nbsp;&gt&nbsp;字符&nbsp;<br />5.&nbsp;跳转去执行这&nbsp;2K&nbsp;的程序。&nbsp;<br /><br />烧写操作系统的过程是&nbsp;:&nbsp;<br />1.&nbsp;连接&nbsp;ARM&nbsp;&nbsp;target&nbsp;的产性口和&nbsp;PC&nbsp;的串行口<br />ARM&nbsp;PC<br />RX&nbsp;-------------------&nbsp;TX&nbsp;<br />TX&nbsp;-------------------&nbsp;RX&nbsp;<br />GND&nbsp;----------------&nbsp;GND&nbsp;<br /><br />2.&nbsp;从&nbsp;BOOT&nbsp;程序引导&nbsp;ARM&nbsp;&nbsp;target<br />3.&nbsp;在&nbsp;Windows&nbsp;NT4.0&nbsp;的&nbsp;console&nbsp;中&nbsp;,&nbsp;设置串行口的参数&nbsp;9600&nbsp;8N1&nbsp;<br /><br />C:&gtmode&nbsp;COM2:&nbsp;baud=9600&nbsp;data=8&nbsp;parity=n&nbsp;stop=1&nbsp;<br /><br />4.&nbsp;在&nbsp;console&nbsp;中把&nbsp;bootloader&nbsp;送到串行口。&nbsp;/b&nbsp;表示以二进制方式&nbsp;<br /><br />C:&gtcopy&nbsp;/b&nbsp;bootldr.bin&nbsp;COM1:&nbsp;<br /><br />5.&nbsp;在&nbsp;console&nbsp;中&nbsp;,&nbsp;根据&nbsp;Bootloader&nbsp;的设置来调整串行口的参数&nbsp;115200&nbsp;8N1&nbsp;<br /><br />C:&gtmode&nbsp;COM2:&nbsp;baud=115200&nbsp;data=8&nbsp;parity=n&nbsp;stop=1&nbsp;<br /><br />6.&nbsp;在&nbsp;console&nbsp;中把&nbsp;vxworks&nbsp;image&nbsp;送到串行口。&nbsp;/b&nbsp;表示以二进制方式&nbsp;<br /><br />C:&gtcopy&nbsp;/b&nbsp;vxworks&nbsp;COM1:&nbsp;<br /><br />7.&nbsp;Power&nbsp;off&nbsp;ARM&nbsp;target&nbsp;,设置其从Flash启动。&nbsp;<br /><br />8.&nbsp;reboot&nbsp;,进入&nbsp;VxWorks&nbsp;<br /><br />这&nbsp;2K&nbsp;字节的程序就是我们说的&nbsp;ARM&nbsp;Bootloader&nbsp;,它的任务一般是:&nbsp;<br /><br />1.&nbsp;必要的硬件初始化&nbsp;<br />2.&nbsp;从串行口接收VxWorks的二进制文件,并写入Flash&nbsp;<br />3.&nbsp;在这过程中,显示一些提示信息。<br />像&nbsp;Bootloader&nbsp;这样底层的程序一般认为是要用纯汇编来写的。但是用汇编写的程序可读性肯定没有用C写的程序好。汇编程序不宜维护,没办法向其它类型的&nbsp;CPU&nbsp;去移植。这些方面&nbsp;C&nbsp;的程序是没有问题的!&nbsp;_&nbsp;<br /><br />那么Bootloader能否用纯C语言去写呢?不可能。因为有些操作特殊寄存器的指令也是特殊指令,用C是实现不了的。有些功能用C也是不能实现的。用C不能作的有:<br />1.&nbsp;操作&nbsp;CP15&nbsp;寄存器的指令&nbsp;<br />2.&nbsp;中断使能&nbsp;<br />3.&nbsp;堆栈地址的设定&nbsp;<br /><br />所以,只要知道这几条汇编指令可以了,不必学习所有的汇编指令。是不是上手很快呀。下面来看看我们在Bootloader&nbsp;中所用到的汇编部分:&nbsp;<br />asm&nbsp;(&quot;_my_start:&nbsp;<br />mov&nbsp;r14,&nbsp;#0x70&nbsp;<br />mcr&nbsp;p15,&nbsp;0,&nbsp;r14,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;/*&nbsp;MMU&nbsp;disabled,&nbsp;32&nbsp;Bit&nbsp;mode,&nbsp;Little&nbsp;endian&nbsp;*/&nbsp;<br />mrs&nbsp;r14,&nbsp;cpsr&nbsp;<br />bic&nbsp;r14,&nbsp;r14,&nbsp;#0x&nbsp;1f&nbsp;/*&nbsp;Mask&nbsp;*/&nbsp;<br />orr&nbsp;r14,&nbsp;r14,&nbsp;#0xc0&nbsp;+&nbsp;0x13&nbsp;/*&nbsp;Diasble&nbsp;IRQ&nbsp;and&nbsp;FIQ,&nbsp;SVC32&nbsp;Mode&nbsp;*/&nbsp;<br />msr&nbsp;cpsr,&nbsp;r14&nbsp;<br />ldr&nbsp;r13,&nbsp;=0xc0020000&nbsp;/*&nbsp;Setup&nbsp;Stack&nbsp;*/&nbsp;<br />&quot;);&nbsp;<br /><br />简单吧,比看几十K的汇编程序感觉好得多吧。也许你会问:硬件的初始化怎么办?那是要操作寄存器的。我说:看看这段&nbsp;C&nbsp;的代码:&nbsp;<br />*((DWORD*)(dwHardwareBase&nbsp;+&nbsp;HW1_SYSCON1))&nbsp;=&nbsp;SYSCON1_VALUE;&nbsp;<br /><br />明白了吧,&nbsp;ARM&nbsp;中把寄存器映射在内存中了,就跟读写内存没有区别。现在编写程序的问题已经全部解决了,但是否就没有问题了呢?不是。你的程序应该写成什么样呢?怎么编译生成二进制文件呢?让我们先写一个程序试一下吧:&nbsp;<br />#define&nbsp;DWORD&nbsp;unsigned&nbsp;int<br />int&nbsp;main(void)&nbsp;<br />{<br />register&nbsp;DWORD&nbsp;dwHardwareBase;<br />asm&nbsp;(&quot;_my_start:&nbsp;<br />mov&nbsp;r14,&nbsp;#0x70&nbsp;<br />mcr&nbsp;p15,&nbsp;0,&nbsp;r14,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;/*&nbsp;MMU&nbsp;disabled,&nbsp;32&nbsp;Bit&nbsp;mode,&nbsp;Little&nbsp;endian&nbsp;*/&nbsp;<br />mrs&nbsp;r14,&nbsp;cpsr&nbsp;<br />bic&nbsp;r14,&nbsp;r14,&nbsp;#0x&nbsp;1f&nbsp;/*&nbsp;Mask&nbsp;*/&nbsp;<br />orr&nbsp;r14,&nbsp;r14,&nbsp;#0xc0&nbsp;+&nbsp;0x13&nbsp;/*&nbsp;Diasble&nbsp;IRQ&nbsp;and&nbsp;FIQ,&nbsp;SVC32&nbsp;Mode&nbsp;*/&nbsp;<br />msr&nbsp;cpsr,&nbsp;r14&nbsp;<br />ldr&nbsp;r13,&nbsp;=0xc0020000&nbsp;/*&nbsp;Setup&nbsp;Stack&nbsp;*/&nbsp;<br />&quot;);&nbsp;<br />dwHardwareBase&nbsp;=&nbsp;(DWORD)0x80000000;&nbsp;<br />return&nbsp;0;&nbsp;<br />}&nbsp;---作者:Gavin&nbsp;Li&nbsp;ver&nbsp;<br /><br />详情&gt&gt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部