|
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 0100 0000 0000 1001 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> [len=4]
<help>: list of commands in this shell
download - download uue file to 0x8000
go - run program at 0x8000
l-boot> download
Get Command: <download> [len=8]
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> [len=2]
<go>: to run code from 0x8000.
此时可以看到 led_blink 程序在执行,板上的 4 位 led 小灯不停的闪烁... |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|