去除UBOOT
1. 去除uboot(单独运行)
指的是整个Flash的运行镜像不包含uboot,从 0 地址开始,仅有RT-Thread系统,并可直接单独运行。需要通过修改一个link文件以及一个脚本实现。
1.1 修改RT-Thread的link文件
link文件名为:link.flash.ld,所在RT-Thread相对路径为:board\linker_scripts\link.flash.ld,上图为修改前后的对比图,其中uboot相关内容需要删除或注释掉。
为方便编辑,避免出错,关于上图中MEMORY部分的配置,可直接拷贝下面的配置:
MEMORY
{
uc_rom : ORIGIN = 0x00000000, LENGTH = 0x3000 /*12K uncompressed code sys data, NO RODATA!!!!*/
protocal_stack : ORIGIN = 0x00003000, LENGTH = 0x11000
instrram : ORIGIN = 0x00014000, LENGTH = 0x15000 /* 84K actually rom... */
datarom : ORIGIN = 0x00200000, LENGTH = 0x4FC00 /* 319K data rom*/
dataram : ORIGIN = 0x00308000, LENGTH = 0x7B00 /* 30.75K byte board.h also need change!!! */
traceram : ORIGIN = 0x0030FB00, LENGTH = 0x400 /* 1 KB */
stack : ORIGIN = 0x0030FF00, LENGTH = 0x100 /* 256 byte */
ota_flag : ORIGIN = 0x00400000, LENGTH = 0x100
}
修改如上图所示内容。
1.2 修改RT-Thread脚本
修改的脚本位于RT-Thread程序的根目录下,文件名为rtconfig.py,只需要修改上图中选中的部分,修改成如下:
POST_ACTION += './tools/bintools.exe -u $TARGET ' + TARGET_NAME + '\n'
上述link文件和脚本文件修改完毕后,执行重新编译,即可编译出只含RT-Thread系统的rtthread.bin镜像。
2. 单独编译RT-Thread(不能直接运行)
若实际开发中,希望把uboot替换成自定义的(镜像大小也可自定义),或单独编译RT-Thread镜像,RT-Thread系统需要单独编译。运行时,RT-Thread系统的入口地址从非0开始。
注意:该修改会让前述的OTA升级功能失效。
2.1 修改RT-Thread的link文件
link文件名为:link.flash.ld,所在RT-Thread相对路径为:board\linker_scripts\link.flash.ld,当前以RT-Thread系统的入口地址为0x7000为例进行说明,修改共有4处,以下为修改前后的对比图
2.2 修改RT-Thread脚本
与前述1.2 修改RT-Thread脚本相同。
2.3 修改启动代码
这里指的启动代码主要指uc_boot_strap.c文件,该文件位于工程目录下的libraries/UC8088_HAL_Driver/src/uc_boot_strap.c文件。
上图中,新增的是关于字节序大小端转换的宏定义,可用于复制的代码如下:
#define BSWAP_32(x) \
((((x) & 0xFF000000u) >> 24) | (((x) & 0x00FF0000u) >> 8) | \
(((x) & 0x0000FF00u) << 8) | (((x) & 0x000000FFu) << 24))
上图中,新增的内容在boot_strap()函数内,主要作用是告知MCU,RT-Thread镜像的真正入口地址,代码中的0x7000即为RT-Thread镜像入口地址,也可以理解为(自定义)uboot镜像的大小。可用于复制的代码如下:
for (i = 7; i >= 0; i--)
{
if (6 == i)
{
stbls[i] = BSWAP_32(stbls[i]) + 0x7000;
*(mtr_addr + i) = BSWAP_32(stbls[i]);
}
else
{
*(mtr_addr + i) = stbls[i];
}
}
以当前0x7000入口地址为例,烧写工具在烧写RT-Thread镜像时,需要修改起始地址为7000,如下图所示:
注意:若RT-Thread系统的入口地址为其他时,请务必使link.flash.ld、uc_boot_strip.c和烧写工具"起始地址"保持一致,否则RT-Thread系统将无法启动。