rtt-7招简单实现代码的“小而美”
选出固件最小的ash 比较紧张时,我们需要考虑代码体积的优化,使其尽量精简,这样的代码在之后的迭代开发中才可以实现小而美的目标。
裁剪 选择合适的优化等级 开启 newlib-nano 选项 使用 Map File 分析工具 readelf 命令分析 ELF 文件 更换 libc 库 更换同类型 Flash 较大的硬件平台
01
裁剪
裁剪是优先需要考虑的方向,这种方式操作简单,也最为见效。
内核:信号量、互斥量、事件集、邮箱、消息队列;main 线程、tshell 线程、idle 线程 组件:文件系统(fatfs)、Finsh 组件、UART 框架、GPIO 框架、SFUD 组件、QSPI 框架 外设驱动:片上 UART、GPIO、QSPI、板上 QSPI FLASH、NRF24L01、LCD、PWM、ADC等
main 中的 led 闪烁:PIN 驱动、PIN 框架 FinSH 控制台:使用 UART 驱动、UART 框架、FinSH 组件 文件系统(板上 QSPI FLASH):使用 QSPI 驱动、QSPI 框架、文件系统组件 Fatfs、FAL 软件包 Ulog:ulog 组件 其他硬件板载设备驱动:LCD、TIMER、PWM、ADC、RTC、Audio
2 260932 1648 5388 267968 416c0 rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 262580 B 256.43 KB
5RAM: 7036 B 6.87 KB
裁剪 Ulog 组件(-3.8KB)
2 257000 1648 5120 263768 40658 rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 258648 B 252.59 KB
5RAM: 6768 B 6.61 KB
裁剪文件系统及 Flash 设备(-83.2KB)
2 172148 1308 3556 177012 2b374 rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 173456 B 169.39 KB
5RAM: 4864 B 4.75 KB
裁剪外设驱动(-101.8KB)
2 95204 1260 2864 99328 18400 rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 96464 B 94.20 KB
5RAM: 4124 B 4.03 KB
2 68856 384 2524 71764 11854 rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 69240 B 67.62 KB
5RAM: 2908 B 2.84 KB
裁剪 FinSH(-13K)
2 55500 384 2240 58124 e30c rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 55884 B 54.57 KB
5RAM: 2624 B 2.56 KB
裁剪内核 IPC(体积几乎不变)
2 54888 336 2232 57456 e070 rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 55224 B 53.93 KB
5RAM: 2568 B 2.51 KB
检查 RT-Thread Setting 和 rtconfig.h 配置文件
可以看到目前系统有使用到 libc 组件、Serial 驱动、Pin 设备驱动、Soft I2C 驱动。例如现在除能 libc 组件,直接单击 libc 按钮去除使能即可。
2#define RT_CONFIG_H__
3
4/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */
5
6/* RT-Thread Kernel */
7
8#define RT_NAME_MAX 8
9#define RT_ALIGN_SIZE 4
10#define RT_THREAD_PRIORITY_32
11#define RT_THREAD_PRIORITY_MAX 32
12#define RT_TICK_PER_SECOND 1000
13#define RT_USING_OVERFLOW_CHECK
14#define RT_USING_HOOK
15#define RT_USING_IDLE_HOOK
16#define RT_IDLE_HOOK_LIST_SIZE 4
17#define IDLE_THREAD_STACK_SIZE 256
18#define RT_DEBUG //DEBUG相关还可以再优化掉
19#define RT_DEBUG_COLOR //DEBUG相关还可以再优化掉
20
21/* Inter-Thread communication */
22
23#define RT_USING_SEMAPHORE
24#define RT_USING_MUTEX
25/* end of Inter-Thread communication */
26
27/* Memory Management */
28
29#define RT_USING_MEMPOOL //内存池还可以再优化掉
30#define RT_USING_SMALL_MEM
31#define RT_USING_HEAP
32/* end of Memory Management */
33
34/* Kernel Device Object */
35
36#define RT_USING_DEVICE
37#define RT_USING_CONSOLE
38#define RT_CONSOLEBUF_SIZE 256
39#define RT_CONSOLE_DEVICE_NAME 'uart1'
40/* end of Kernel Device Object */
41#define RT_VER_NUM 0x40003
42/* end of RT-Thread Kernel */
43#define ARCH_ARM
44#define RT_USING_CPU_FFS
45#define ARCH_ARM_CORTEX_M
46#define ARCH_ARM_CORTEX_M4
47
48#endif
02
选择合适的优化等级
gcc -O option flag
+increase ++increase more +++increase even more -reduce --reduce more ---reduce even more
开启-O2优化等级
2 38724 336 2232 41292 a14c rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 39060 B 38.14 KB
5RAM: 2568 B 2.51 KB
开启-Os化等级
2 35140 336 2232 37708 934c rtthread.elf
3 Used Size(B) Used Size(KB)
4Flash: 35476 B 34.64 KB
5RAM: 2568 B 2.51 KB
03
开启newlib-nano 选项
Use float with nano printf
和 Use float with nano scanf
选项框。04
对Map File进行分析优化(使用 Amap.exe 工具)
05
使用readelf命令分析ELF文件
readelf --help
查看用法。readelf -all rtthread.elf
可以查看 elf 的所有信息。GLOBAL
代表全局符号,OBJECT
代表数据对象,比如变量数组,FUNC
代表函数等等。我们可以利用这些这些信息,分析具体的段对应的大小。06
如有必要,可以更换libc库
07
更换同类型Flash较大的硬件平台
赞 (0)