limingth 发表于 2005-6-3 00:16:03

Learn lumit Step 7 : 下载与执行

Learn lumit Step 7 : 下载与执行 download & go
++++++++++++++++++++++++++++++++++++++++++++++++++++++

    接下来,我们要为 bootloader 添加支持二进制可执行代码的下载与执行功能。
如果每次我们都通过烧写 Flash 的方式来测试新添加的功能模块,是一件相当费时
且怪异的做法,因此需要能通过串口下载的方式来尽快地测试新写的模块。

    首先我们先修改一下 uart.h 的头文件宏定义,添加对波特率 115200 的定义:

/* default baud rate value */
#define BAUD_9600        (162 << 4)

/* add 115200 for download faster */
#define BAUD_115200        (13 << 4)

    关于串口波特率的设置参数,通过查阅 um_s3c4510b_rev1.pdf 的 UART 章节
有关 UART Baud Rate Generator 的参数设置表不难得到。这样,bootloader 启动后
通过 115200 的波特率和 PC 通信,下载的速度就会快很多了。

    然后我们来实现对 uue 格式文件的下载支持。uue 格式是通过 uuencode 编码算法
对二进制文件做处理后得到的 ASCII 码文件,通过串行通讯来传输二进制文件。

uue 文件的格式如下:

begin <模式> <文件名>
<数据>
end

    例如在第一节里面的 led_0000.bin 转换为 led_0000.uue 之后就是

begin 0666 led_0000.bin
H% "?Y100G^4 $(#E !"@XPP G^4 $(#E_/__Z@!0_P/__P, "%#_ T

end

    UUE 编码算法是:不断地用 3 个字节数据列成一组(不足3个字节以零补齐),然后
将 24 位数据分为 4 组,每组 6 位,再将得到的6位二进制数映射到ASCII码32~95之间
的字符。一般情况下,每行以M 开头(表示32+45),其中45表示该行有效输入数据的长度,
32 是6位二进制数映射到 ASCII 码的基数。这样,45 个二进制就转换为 60个字符一行
(不包括"M"), 最后一行以 32+N 的ASCII字符开头,N 为最后一行编码的输入字节数。

    编码以一个只含一个空格的一行和只含"end"的一行结束。这里给出一个简单例子:
led_0000.bin 的最开始 3 位是 0x14 0x00 0x9F:

1    4   0    0   9    F         ( bin 格式文件的头 3 个字节数据 )
0001 01000000 00001001 1111      ( 二进制表示 )

000101 000000 000010 011111            ( 分为 4 组,每组 6 位 )
5      0      2      31                ( 对应的十进制数表示 )
37   32   34   63                ( 加 32 后映射到 ASCII 码 )
%      空格   "      ?               ( 对应的 ASCII 码 )

    这也就是 led_0000.uue 中第一行 H 后面四个字节 % "? 的来龙去脉。这里 H 是
因为 led_0000.bin 的文件长度是 40 个字节,加上 32 等于 72 ,即 H 的 ASCII 码。
反过来,从 ASCII 码文件中,先读取 4 个字节,再通过逆运算得到 3 个字节的二进制。
关于 uue 的算法 C 语言实现可以参考附件中的 command.c 文件中 download 命令。

    go 命令的实现有一些编程技巧在里面,功能是使得当前的程序计数器 PC 指针指向
0x8000 的地址,实际上我们是通过函数指针来实现的,很简单,只需要两行语句。

current_pc = 0x8000;               
((void (*)(void))(current_pc))(); /* thanks, STheobald */       
      
    当启动代码支持 download 和 go 命令之后,就开始有了新的生命,可以更灵活地
用来测试新的代码,添加新的特性,驱动更多的硬件来为我们工作。

下面是从我们这个 little bootloader 启动后输出和执行命令的结果显示:

---- Welcome to lumit bootloader ----
For more information, visit http://www.lumit.org
-------------------------------------------------
l-boot> help
Get Command: <help>
<help>: list of commands in this shell
download - download uue file to 0x8000
go - run program at 0x8000
l-boot> download
Get Command: <download>
Ready to download. Use 'transmit' option on terminal emulator to download file.
Loaded file led_blink.bin at address 8000, size = 88
l-boot> go
Get Command: <go>
<go>: to run code from 0x8000.

此时可以看到 led_blink 程序在执行,板上的 4 位 led 小灯不停的闪烁...
页: [1]
查看完整版本: Learn lumit Step 7 : 下载与执行