Skip to content

去除UBOOT

1. 去除uboot(单独运行)

指的是整个Flash的运行镜像不包含uboot,从 0 地址开始,仅有RT-Thread系统,并可直接单独运行。需要通过修改一个link文件以及一个脚本实现。

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
}

link源文件

修改如上图所示内容。

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升级功能失效。

link文件名为:link.flash.ld,所在RT-Thread相对路径为:board\linker_scripts\link.flash.ld,当前以RT-Thread系统的入口地址为0x7000为例进行说明,修改共有4处,以下为修改前后的对比图

link文件对比1

link文件对比2

link文件对比3

2.2 修改RT-Thread脚本

与前述1.2 修改RT-Thread脚本相同。

2.3 修改启动代码

这里指的启动代码主要指uc_boot_strap.c文件,该文件位于工程目录下的libraries/UC8088_HAL_Driver/src/uc_boot_strap.c文件。

uc_boot_strap.c修改1

上图中,新增的是关于字节序大小端转换的宏定义,可用于复制的代码如下:

#define BSWAP_32(x)                                              \
    ((((x) & 0xFF000000u) >> 24) | (((x) & 0x00FF0000u) >>  8) | \
     (((x) & 0x0000FF00u) <<  8) | (((x) & 0x000000FFu) << 24))

uc_boot_strap.c修改2

上图中,新增的内容在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系统将无法启动。

Back to top