|  | 
 
| 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 小灯不停的闪烁...
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册  |