QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3041|回复: 0

Learn lumit Step 7 : 下载与执行

[复制链接]
发表于 2005-6-3 00:16:03 | 显示全部楼层 |阅读模式
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 小灯不停的闪烁...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-29 06:09 , Processed in 0.049646 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表