Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
[RealTouch例程]内核裁剪
发布于 2012-09-25 13:30:30 浏览:10350
订阅该版
实验目的 因为RT-Thread拥有高度可裁剪性,我们尝试一下可以它到底可以裁到多小 硬件说明 本实验使用RT-Thread官方的Realtouch开发板作为实验平台。涉及到的硬件主要为 无,本实验只涉及编译,当然在板上验证正确性也是可以的 实验原理及程序结构 关于内核裁剪的内容,也可以参考wiki:http://www.rt-thread.org/dokuwiki/doku.php?id=rt-thread%E8%A3%81%E5%89%AA%E7%A4%BA%E4%BE%8B 实验设计 本实验的主要设计目的是通过修改rt_config.h文件,来尝试可以达到的最小裁剪尺寸。请读者注意,本实验本身不具有实际的工程参考价值,只是帮助读者快速了解相关API的用法。 源程序说明 本实验对应xxxxxx 系统依赖 因为是为了裁剪,所以在rtconfig.h中不需要特意开启任何项目 主程序说明以及相关编译结果 首先我们看看默认的rtconfig.h中内容。 ```/* RT-Thread config file */ #ifndef __RTTHREAD_CFG_H__ #define __RTTHREAD_CFG_H__ //#define RT_USING_NEWLIB /* RT_NAME_MAX*/ #define RT_NAME_MAX 8 /* RT_ALIGN_SIZE*/ #define RT_ALIGN_SIZE 8 /* PRIORITY_MAX */ #define RT_THREAD_PRIORITY_MAX 32 /* Tick per Second */ #define RT_TICK_PER_SECOND 100 /* SECTION: RT_DEBUG */ /* Thread Debug */ #define RT_DEBUG #define RT_USING_OVERFLOW_CHECK /* Using Hook */ #define RT_USING_HOOK #define IDLE_THREAD_STACK_SIZE 1024 /* Using Software Timer */ /* #define RT_USING_TIMER_SOFT */ #define RT_TIMER_THREAD_PRIO 4 #define RT_TIMER_THREAD_STACK_SIZE 512 #define RT_TIMER_TICK_PER_SECOND 10 /* SECTION: IPC */ /* Using Semaphore*/ #define RT_USING_SEMAPHORE /* Using Mutex */ #define RT_USING_MUTEX /* Using Event */ #define RT_USING_EVENT /* Using MailBox */ #define RT_USING_MAILBOX /* Using Message Queue */ #define RT_USING_MESSAGEQUEUE /* SECTION: Memory Management */ /* Using Memory Pool Management*/ #define RT_USING_MEMPOOL /* Using Dynamic Heap Management */ #define RT_USING_HEAP /* Using Small MM */ #define RT_USING_SMALL_MEM /* SECTION: Device System */ /* Using Device System */ #define RT_USING_DEVICE #define RT_USING_SERIAL /* SECTION: Console options */ #define RT_USING_CONSOLE /* the buffer size of console*/ #define RT_CONSOLEBUF_SIZE 128 /* console name */ #define RT_CONSOLE_DEVICE_NAME "uart3" #define RT_USING_COMPONENTS_INIT /* SECTION: finsh, a C-Express shell */ #define RT_USING_FINSH /* Using symbol table */ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION /* SECTION: device filesystem */ /* #define RT_USING_DFS */ //#define RT_USING_DFS_ELMFAT #define RT_DFS_ELM_WORD_ACCESS /* Reentrancy (thread safe) of the FatFs module. */ #define RT_DFS_ELM_REENTRANT /* Number of volumes (logical drives) to be used. */ #define RT_DFS_ELM_DRIVES 2 /* #define RT_DFS_ELM_USE_LFN 1 */ #define RT_DFS_ELM_MAX_LFN 255 /* Maximum sector size to be handled. */ #define RT_DFS_ELM_MAX_SECTOR_SIZE 512 /* the max number of mounted filesystem */ #define DFS_FILESYSTEMS_MAX 2 /* the max number of opened files */ #define DFS_FD_MAX 4 /* SECTION: lwip, a lighwight TCP/IP protocol stack */ //#define RT_USING_LWIP /* LwIP uses RT-Thread Memory Management */ #define RT_LWIP_USING_RT_MEM /* Enable ICMP protocol*/ #define RT_LWIP_ICMP /* Enable UDP protocol*/ #define RT_LWIP_UDP /* Enable TCP protocol*/ #define RT_LWIP_TCP /* Enable DNS */ #define RT_LWIP_DNS /* the number of simulatenously active TCP connections*/ #define RT_LWIP_TCP_PCB_NUM 5 /* ip address of target*/ #define RT_LWIP_IPADDR0 192 #define RT_LWIP_IPADDR1 168 #define RT_LWIP_IPADDR2 1 #define RT_LWIP_IPADDR3 30 /* gateway address of target*/ #define RT_LWIP_GWADDR0 192 #define RT_LWIP_GWADDR1 168 #define RT_LWIP_GWADDR2 1 #define RT_LWIP_GWADDR3 1 /* mask address of target*/ #define RT_LWIP_MSKADDR0 255 #define RT_LWIP_MSKADDR1 255 #define RT_LWIP_MSKADDR2 255 #define RT_LWIP_MSKADDR3 0 /* tcp thread options */ #define RT_LWIP_TCPTHREAD_PRIORITY 12 #define RT_LWIP_TCPTHREAD_MBOX_SIZE 4 #define RT_LWIP_TCPTHREAD_STACKSIZE 1024 /* ethernet if thread options */ #define RT_LWIP_ETHTHREAD_PRIORITY 15 #define RT_LWIP_ETHTHREAD_MBOX_SIZE 4 #define RT_LWIP_ETHTHREAD_STACKSIZE 512 /* TCP sender buffer space */ #define RT_LWIP_TCP_SND_BUF 8192 /* TCP receive window. */ #define RT_LWIP_TCP_WND 8192 #define CHECKSUM_CHECK_TCP 0 #define CHECKSUM_CHECK_IP 0 #define CHECKSUM_CHECK_UDP 0 #define CHECKSUM_GEN_TCP 0 #define CHECKSUM_GEN_IP 0 #define CHECKSUM_GEN_UDP 0 #endif``` 这是keil编译的结果: ```Program Size: Code=52928 RO-data=4524 RW-data=432 ZI-dara=6552``` 这是gcc编译结果: ```text data bss dec hex filename 58148 240 5360 63748 f904 rtthread-stm32f4xx.axf``` 这时候的结果包含有一个初始化线程,接下来我们将application.c中这个初始化线程移除,另外的话我们要对rt_config.h做一次比较大的手术。参照wiki上项目,我们几乎见到RT_USING_字样的宏就将其注释掉,不多说,上“马”: ```/* RT-Thread config file */ #ifndef __RTTHREAD_CFG_H__ #define __RTTHREAD_CFG_H__ //#define RT_USING_NEWLIB /* RT_NAME_MAX*/ #define RT_NAME_MAX 4 /* RT_ALIGN_SIZE*/ #define RT_ALIGN_SIZE 4 /* PRIORITY_MAX */ #define RT_THREAD_PRIORITY_MAX 8 /* Tick per Second */ #define RT_TICK_PER_SECOND 100 /* SECTION: RT_DEBUG */ /* Thread Debug */ //#define RT_DEBUG //#define RT_USING_OVERFLOW_CHECK /* Using Hook */ //#define RT_USING_HOOK #define IDLE_THREAD_STACK_SIZE 256 /* Using Software Timer */ /* #define RT_USING_TIMER_SOFT */ #define RT_TIMER_THREAD_PRIO 4 #define RT_TIMER_THREAD_STACK_SIZE 512 #define RT_TIMER_TICK_PER_SECOND 10 /* SECTION: IPC */ /* Using Semaphore*/ #define RT_USING_SEMAPHORE /* Using Mutex */ #define RT_USING_MUTEX /* Using Event */ #define RT_USING_EVENT /* Using MailBox */ //#define RT_USING_MAILBOX /* Using Message Queue */ //#define RT_USING_MESSAGEQUEUE /* SECTION: Memory Management */ /* Using Memory Pool Management*/ //#define RT_USING_MEMPOOL /* Using Dynamic Heap Management */ //#define RT_USING_HEAP /* Using Small MM */ //#define RT_USING_SMALL_MEM /* SECTION: Device System */ /* Using Device System */ //#define RT_USING_DEVICE //#define RT_USING_SERIAL /* SECTION: Console options */ //#define RT_USING_CONSOLE /* the buffer size of console*/ #define RT_CONSOLEBUF_SIZE 128 /* console name */ #define RT_CONSOLE_DEVICE_NAME "uart3" //#define RT_USING_COMPONENTS_INIT /* SECTION: finsh, a C-Express shell */ //#define RT_USING_FINSH /* Using symbol table */ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION /* SECTION: device filesystem */ /* #define RT_USING_DFS */ //#define RT_USING_DFS_ELMFAT #define RT_DFS_ELM_WORD_ACCESS /* Reentrancy (thread safe) of the FatFs module. */ #define RT_DFS_ELM_REENTRANT /* Number of volumes (logical drives) to be used. */ #define RT_DFS_ELM_DRIVES 2 /* #define RT_DFS_ELM_USE_LFN 1 */ #define RT_DFS_ELM_MAX_LFN 255 /* Maximum sector size to be handled. */ #define RT_DFS_ELM_MAX_SECTOR_SIZE 512 /* the max number of mounted filesystem */ #define DFS_FILESYSTEMS_MAX 2 /* the max number of opened files */ #define DFS_FD_MAX 4 /* SECTION: lwip, a lighwight TCP/IP protocol stack */ //#define RT_USING_LWIP /* LwIP uses RT-Thread Memory Management */ #define RT_LWIP_USING_RT_MEM /* Enable ICMP protocol*/ #define RT_LWIP_ICMP /* Enable UDP protocol*/ #define RT_LWIP_UDP /* Enable TCP protocol*/ #define RT_LWIP_TCP /* Enable DNS */ #define RT_LWIP_DNS /* the number of simulatenously active TCP connections*/ #define RT_LWIP_TCP_PCB_NUM 5 /* ip address of target*/ #define RT_LWIP_IPADDR0 192 #define RT_LWIP_IPADDR1 168 #define RT_LWIP_IPADDR2 1 #define RT_LWIP_IPADDR3 30 /* gateway address of target*/ #define RT_LWIP_GWADDR0 192 #define RT_LWIP_GWADDR1 168 #define RT_LWIP_GWADDR2 1 #define RT_LWIP_GWADDR3 1 /* mask address of target*/ #define RT_LWIP_MSKADDR0 255 #define RT_LWIP_MSKADDR1 255 #define RT_LWIP_MSKADDR2 255 #define RT_LWIP_MSKADDR3 0 /* tcp thread options */ #define RT_LWIP_TCPTHREAD_PRIORITY 12 #define RT_LWIP_TCPTHREAD_MBOX_SIZE 4 #define RT_LWIP_TCPTHREAD_STACKSIZE 1024 /* ethernet if thread options */ #define RT_LWIP_ETHTHREAD_PRIORITY 15 #define RT_LWIP_ETHTHREAD_MBOX_SIZE 4 #define RT_LWIP_ETHTHREAD_STACKSIZE 512 /* TCP sender buffer space */ #define RT_LWIP_TCP_SND_BUF 8192 /* TCP receive window. */ #define RT_LWIP_TCP_WND 8192 #define CHECKSUM_CHECK_TCP 0 #define CHECKSUM_CHECK_IP 0 #define CHECKSUM_CHECK_UDP 0 #define CHECKSUM_GEN_TCP 0 #define CHECKSUM_GEN_IP 0 #define CHECKSUM_GEN_UDP 0 #endif``` 改完,如果你就急着编译的话,会很悲剧的出一系列错,因为我们在组织工程的时候仍旧加上了一些非必须的文件,另外在startup.c,platform.c,board.c中也有一些地方需要改动。 首先改动的是例程文件夹下drivers下的SConscript,将其中的usart.c彻底去掉。 startup.c中的rt_show_version()可以去掉,另外的话关于heap可以加上条件编译: ```#ifdef RT_USING_HEAP rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END); #endif``` 此外, ```#if RT_USING_DEVICE /* init all device */ rt_device_init_all(); #endif``` 在platform.c中, ```#ifdef RT_USING_DEVICE rt_device_init_all(); #endif``` 在board.c中,rt_hw_board_init()中相关初始化均可以注释掉,因为我们并未用到板上资源。 根据wiki文档上所说的,startup_stm32f4xx.s中的heap大小也可以作出调整。根据.map文件的分析,idle进程的stack大小也可以进一步缩小。 于是乎,我们可以看到: keil编译结果: ```Program Size: Code=4088 RO-data=756 RW-data=152 ZI-dara=1552``` gcc编译结果: ```text data bss dec hex filename 7140 92 728 7960 1f18 rtthread-stm32f4xx.axf``` 结果分析 通过裁剪,笔者通过mdk现在大概得到的flash大小约为6k,ram为1.7k。此外,在裁剪过程中我们可以通过生成的mdk观察相关资源占用情况, [attach]0[/attach] ![图片5.png](https://oss-club.rt-thread.org/uploads/3089_b2f6c9043ddb31f52e3754a4e78c2a0d.png) 下载附件 [实验_内核裁剪.pdf](https://oss-club.rt-thread.org/uploads/3089_5201f7784847a703e4b21759877537ef.pdf) 下载附件 [0_base_kernel.zip](https://oss-club.rt-thread.org/uploads/3089_bd4bd440c4caa35471880ddde85a28cb.zip)
查看更多
8
个回答
默认排序
按发布时间排序
aozima
2012-09-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
当16K FLASH / 8K RAM 时有参考价值。 不然基本功能全开加 finsh 64K都装不下就会让人以为只有512K FLASH的系统才适合RT-Thread。
bloom5
2012-09-25
这家伙很懒,什么也没写!
[attach]1357[/attach] [attach]1356[/attach]
shaolin
2012-09-25
这家伙很懒,什么也没写!
应该还可以进一步裁剪到 ROM 使用达 3K 左右。
xiao苦
2012-09-25
这家伙很懒,什么也没写!
这个确实没有多大的意义,对于微型操作系统来说,资源本来是不会很大,而一般选择跑系统的芯片要,资源肯定够了的,没多少人会想着把系统做到尽量小去适应芯片的,相比较下,稳定的性能反而是最重要的。
shaolin
2012-09-26
这家伙很懒,什么也没写!
>这个确实没有多大的意义,对于微型操作系统来说,资源本来是不会很大,而一般选择跑系统的芯片要,资源肯定够了的,没多少人会想着把系统做到尽量小去适应芯片的,相比较下,稳定的性能反而是最重要的。 --- 稳定性是毫无疑问最重要的,但是除此之外,在资源占用小这方面的需求也是存在的;, 给出最小的资源占用指标是有意义的,也这是系统的伸缩性,也是可裁剪性的一个体现。体积可大可小,需要强大的功能时可以很大,如果仅需要最简单的功能时,也可以达到非常非常小;这样在面对不同的应用时,可以灵活地进行配置,来达到资源的最优化利用。
lanxinyuchs
2013-06-17
这家伙很懒,什么也没写!
如果能有个每个组件(finsh,LwIP)占用资源的报告就好了,另外我在keil里没有找到怎么出现图5.png里查看各个文件资源占用的方法 好像没有文档对这些编译选项逐条做个说明,比如我需要用到finsh,但又觉得比较占资源,我不确定屏蔽掉 #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION 会带来什么影响
WenMingcai
2020-06-04
这家伙很懒,什么也没写!
能不能裁剪到最小内核,然后再叠加LwIP协议栈?
撰写答案
登录
注册新账号
关注者
0
被浏览
10.4k
关于作者
bloom5
这家伙很懒,什么也没写!
提问
4
回答
21
被采纳
0
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
TinyUSB Demo运行教程
2
RT-Thread学习大礼包一键带走!
3
freemodbus从机调试说明
4
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
5
基于 RT-Thread 星火一号开发板的俄罗斯方块
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
rv666
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部