Skip to main content

rtos load压缩rtos

一 概述

当rtos编译出来的镜像大小觉得过于庞大, 可以通过压缩将rtos镜像变小, 需要另外编译一个rtos镜像用于load解压这个被压缩的rtos镜像.

二 load压缩rtos的rtos制作

2.1 软件配置

以x1600en_nand_defconfig 为例

1

这个rtos只是为了load解压压缩的rtos, 固件加载地址放在ddr后面,解压压缩的rtos后,内存就可以给解压后的rtos使用

2

勾选lzma相关

3

修改完成配置后保存.

2.2 软件修改

在/rtos工程目录/freertos/vendor/vendor.c内, 修改代码如下:

#include <stdio.h>
#include "../example/driver/load_rtos_split_example.c"
void vendor_init(void *arg)
{
printf("vendor init...\n");
load_rtos_split();
}

编译rtos系统:

bhu@bhu-PC:~/rtos/freertos$ make x1600en_nand_defconfig
bhu@bhu-PC:~/rtos/freertos$ make
bhu@bhu-PC:~/rtos/freertos$ ls -l rtos-with-spl.bin
-rw-r--r-- 1 bhu bhu 408392 819 16:42 rtos-with-spl.bin //生成文件

三 压缩rtos制作

3.1 软件配置

以x1600en_nand_defconfig为例

1

勾选压缩rtos,使用lzma(与二章节中的解压方式对应), 压缩的rtos固件加载可以使用到ddr所有大小

4

5

分包的目的是一边读取数据一边解码,加速启动

分包最大值是最多可以多少个包,需要和代码里面的值一致(一般不修改), 位于工程freertos/example/driver/load_rtos_split_example.c

9

包大小可以根据镜像大小调整

修改完成配置后保存, 编译rtos系统

bhu@bhu-PC:~/rtos/freertos$ make x1600en_nand_defconfig
bhu@bhu-PC:~/rtos/freertos$ make
bhu@bhu-PC:~/rtos/freertos$ ls -l zero_split.lzma 
-rw-r--r-- 1 bhu bhu 133852 819 16:42 zero_split.lzma //生成文件

四 烧录

6

分区划分:

boot : load rtos并解压,即二章节编译出来的镜像

rtos1 :选择压缩rtos镜像, 即三章节编译的镜像, 若不配置ota分区, 默认从rtos1启动, 若配置了ota分区, 可以选择rto1或rtos2启动

rtos2:选择压缩rtos镜像, 可通过写入ota分区信息, 切换分区启动, 不需要切换分区, 可以不配置

ota:通过ota分区内容判断从rtos1分区启动还是rtos2, 默认从rtos1分区启动, 烧录内容可为空, 不需要切换分区, 可以不配置

分区可修改, 代码位于工程freertos/example/driver/load_rtos_split_example.c

10

7

8

五 验证

U-Boot SPL 2013.07-00023-ge59480c41e-dirty (Dec 31 2025 - 10:29:40)
ERROR EPC 83fac8e4
CPA_CPAPCR:02e049cd
CPM_CPMPCR:0af0c9cd
CPM_CPEPCR:019051cd
CPM_CPCCR:9a094410
SOC: X1600EN
DDR: X1600EN-DDR2 type is : DDR2
ddr_inno_phy_init ..! 11: 00000006
mr0 = 0x00b73011
mr1 = 0x00004111
DDRP_INNOPHY_CALIB_DELAY_AL:00000051
DDRP_INNOPHY_CALIB_DELAY_AH:00000051
-----ddr_readl(DDRP_INNOPHY_CALIB_DONE): 00000003
ddr calib finish
457, VID=0x000000c8, PID=0x00000091
rtos not found: rtos
use rtos default offset_addr:26624
[0.000000] xburst rtos @ Aug 20 2026 09:15:22, epc: 83fac8e4
[0.000105] pwm clk rate 300000000
[0.000385] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064593] vendor init...
[0.138999] now uncompress : rtos1 //默认从rtos1分区启动,解压rtos1
[0.172532] ready jump to: rtos1
[0.000000] xburst rtos @ Aug 20 2026 09:16:48, epc: 83fac8e4
[0.000101] pwm clk rate 300000000
[0.000382] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064558] vendor init...


往ota分区写入信息ota:rtos2

$ nand_write 0x300000 0x6f 0x74 0x61 0x3a 0x72 0x74 0x6f 0x73 0x32

0x300000 #ota分区offset
6f 74 61 3a 72 74 6f 73 32 0a |ota:rtos2.|
U-Boot SPL 2013.07-00023-ge59480c41e-dirty (Dec 31 2025 - 10:29:40)
ERROR EPC 800274e8
CPA_CPAPCR:02e049cd
CPM_CPMPCR:0af0c9cd
CPM_CPEPCR:019051cd
CPM_CPCCR:9a094410
SOC: X1600EN
DDR: X1600EN-DDR2 type is : DDR2
ddr_inno_phy_init ..! 11: 00000006
mr0 = 0x00b73011
mr1 = 0x00004111
DDRP_INNOPHY_CALIB_DELAY_AL:00000051
DDRP_INNOPHY_CALIB_DELAY_AH:00000051
-----ddr_readl(DDRP_INNOPHY_CALIB_DONE): 00000003
ddr calib finish
457, VID=0x000000c8, PID=0x00000091
rtos not found: rtos
use rtos default offset_addr:26624
[0.000000] xburst rtos @ Aug 20 2026 09:15:22, epc: 800274e8
[0.000106] pwm clk rate 300000000
[0.000385] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064592] vendor init...
[0.138997] now uncompress : rtos2 //切换到rtos2分区,解压rtos2
[0.172533] ready jump to: rtos2
[0.000000] xburst rtos @ Aug 20 2026 09:16:48, epc: 800274e8
[0.000101] pwm clk rate 300000000
[0.000381] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064557] vendor init...