0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread 学习笔记:memheap 死机问题的分析与解决

RTThread物联网操作系统 来源:未知 2023-05-29 18:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

验证环境
  • NUCLEO-L476RG 开发板,板载 STM32L476RGT6(96K SARM1 + 32K SRAM2)
  • Win10 64 位
  • Keil MDK 5.36
  • RT-Thread 5.0.1 版本(2023-05-28 master 主线)
  • bsp : bspstm32stm32l476-st-nucleo
功能描述
  • 最近在研究 RT-Thread 内存的管理,熟悉了一下 memheap 的功能实现,并且了解到 memheap 支持多块内存(物理地址不连续)的管理,当开启 memheap 后,rt_malloc 可以遍历所有注册过的 memheap 内存块,并且进行 内存的申请与释放。
  • 当前 STM32L476RGT6 支持两块 SRAM,其中 SRAM1 96KB,还有一块 SRAM2 32KB,SRAM2 默认没有使用,尝试开启 SRAM2
环境搭建
  • stm32l476-st-nucleo 开启 memheap 的方法
7f046d84-fe06-11ed-90ce-dac502259ad0.png
  • stm32l476-st-nucleo 开启 SRAM2 的方法

						1#defineHEAP_SRAM2_BEGIN(0x10000000) 2#defineHEAP_SRAM2_SIZE(32*1024) 3staticstructrt_memheapmemheap_sram2; 4intsystem_sram2_init(void) 5{ 6returnrt_memheap_init(&memheap_sram2,"sram2",(void*)HEAP_SRAM2_BEGIN,(rt_size_t)HEAP_SRAM2_SIZE); 7} 8INIT_BOARD_EXPORT(system_sram2_init);
							
												功能测试
												
  • 写两个测试命令:一直申请内存直到无法申请内存,一直释放所以申请的内存,确认 rt_malloc 会自动到新增加的 memheap SRAM2 中申请内存
  • 功能验证通过,但是遇到死机问题
  • 测试的函数

							1void*user_alloc(rt_size_tsize)  2{  3returnrt_memheap_alloc(&memheap_sram2,size);  4}  5voiduser_free(void*ptr)  6{  7rt_memheap_free(ptr);  8}  9voiduser_alloc_test(void) 10{ 11for(inti=0;i< MEMHEAP_BLOCK_NUM; i++) 12{ 13user_ptr[i]=user_alloc(500); 14if(!user_ptr[i]) 15{ 16rt_kprintf("mallocfailed,index=%d ",i); 17return; 18} 19else 20{ 21rt_kprintf("[%d]:0x%08x ",i,user_ptr[i]); 22} 23} 24} 25MSH_CMD_EXPORT(user_alloc_test,user_alloc_test); 26voiduser_free_test(void) 27{ 28for(inti=0;i< MEMHEAP_BLOCK_NUM; i++) 29{ 30if(user_ptr[i]) 31{ 32rt_kprintf("[%d]:0x%08x ",i,user_ptr[i]); 33user_free(user_ptr[i]); 34} 35} 36} 37MSH_CMD_EXPORT(user_free_test,user_free_test);
  • 死机的信息
7f0e1e56-fe06-11ed-90ce-dac502259ad0.png
  • 死机后,打印线程,发现 idle 线程栈异常7f1a5dec-fe06-11ed-90ce-dac502259ad0.png
  • 开启CmBacktrace 组件后,发现死机的问题不是固定的,申请申请一个小内存,都会触发异常
问题分析
  • idle 线程的结构数据被破坏了,这就说明,内存越界了,但是测试例程只调用了 RT-Thread memheap 的 内存申请与释放 API,并没有其他的操作
  • 手动申请一块内存,没有触发死机, list thread 发现,idle 线程的栈数据,依旧是异常的!
7f224bb0-fe06-11ed-90ce-dac502259ad0.png
  • 由于 开发板可以 单步调试,所以经过单步调试,加上分析,确认内存的范围,各个线程栈的内存范围,发现了一个奇怪的问题:申请的内存偶尔会与线程栈的【静态内存】重叠
  • 由于死机问题并不是必现,但是 idle 线程栈数据异常是必现的。当前怀疑 memheap 的内存范围设置存在问题,通过对比其他开发板的 bsp,发现了问题所在。
  • 原来 bsp stm32l476-st-nucleo 系统的内存 HEAP_BEGIN 设置有问题,直接设置的 第一块内存的起始地址:

										1#defineSTM32_SRAM1_START(0x20000000) 2#defineHEAP_BEGINSTM32_SRAM1_START
  • 初步看上去好像没有问题,其实RT-Thread 开机后,静态的内存数据、线程栈,依旧会占用一些内存,也就是其实内存地址,不能设置为 STM32_SRAM1_START,而是 【剩余内存】
  • 【剩余内存】或者叫【空闲内存】的获取方法如下:

										1#ifdefined(__ARMCC_VERSION)  2externintImage$$RW_IRAM1$$ZI$$Limit;  3#defineHEAP_BEGIN((void*)&Image$$RW_IRAM1$$ZI$$Limit)  4#elif__ICCARM__  5#pragmasection="CSTACK"  6#defineHEAP_BEGIN(__segment_end("CSTACK"))  7#else  8externint__bss_end;  9#defineHEAP_BEGIN((void*)&__bss_end) 10#endif
  • 如在 Keil MDK5 上,是 #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit), 也就是 SRAM1 的 剩余内存作为系统 堆内存使用,而不是 SRAM1 的全部内存作为 堆内存使用
解决方法
  • 如上,重新设置 HEAP_BEGIN 即可
  • 编译发现 RW_IRAM1 不存在,需要修改链接文件:bspstm32stm32l476-st-nucleooardlinker_scriptslink.sct,增加 RW_IRAM1 的定义
7f27c4be-fe06-11ed-90ce-dac502259ad0.png

									1RW_IRAM10x200000000x00018000{;RWdata 2.ANY(+RW+ZI) 3}
  • 以上修改后,memheap 内存测试通过,不再触发死机
小结
  • memheap 使用起来还是比较的简单,可以通过设置 开启 RT_USING_MEMHEAP_AUTO_BINDING,也就是 勾选 [*] Use all of memheap objects as heap,决定新增加的 memheap 的内存是否参与系统常规的内存管理,如 rt_malloc、rt_free
  • 用户可以单独的实现自己的 memheap 内存块 alloc、free 函数,这样只操作特定的 memheap。
  • 当前的一个小缺点:如果 memheap 内存块较多,超过2个,如 RAM1、RAM2、RAM3,并且开启了 [*] Use all of memheap objects as heap,想实现 RAM1与 RAM2 作为系统通用内存管理,RAM3 用户专用内存管理,那么当前的 memheap 机制做不到,因为 rt_malloc 依旧会在 RAM1、RAM2 不能申请内存时,去 RAM3 申请内存

原文:https://club.rt-thread.org/ask/article/736c78aba1dcd82e.html

———————End———————

RT-Thread线下入门培训

6月 - 郑州、杭州、深圳

1.免费2.动手实验+理论3.主办方免费提供开发板4.自行携带电脑,及插线板用于笔记本电脑充电5.参与者需要有C语言单片机(ARM Cortex-M核)基础,请提前安装好RT-Thread Studio 开发环境

7f32e204-fe06-11ed-90ce-dac502259ad0.png

立即扫码报名

报名链接

https://jinshuju.net/f/UYxS2k

巡回城市:青岛、北京、西安、成都、武汉、郑州、杭州、深圳、上海、南京

你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

点击阅读原文,进入RT-Thread 官网


原文标题:RT-Thread 学习笔记:memheap 死机问题的分析与解决

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1636

    浏览量

    45190

原文标题:RT-Thread 学习笔记:memheap 死机问题的分析与解决

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    恩智浦亮相RT-Thread 20周年开发者大会

    日前,“开源向实·生产力进化启示录”全球峰会暨RT-Thread 20周年开发者大会在上海成功举办,恩智浦作为RT-Thread的紧密合作伙伴,在活动中重磅亮相,展示双方在共建RT-Thread OS开发生态方面的新成果、新方案
    的头像 发表于 01-26 09:07 726次阅读

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 1242次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    rt-thread studio 导入BSP 失败怎么解决?

    rt-thread studio 手动导入bsp 失败。 版本: 2.2.8 构建ID: 202405200930 导入的bsp 是直接从rt-thread 代码仓库下载的 .log
    发表于 10-11 11:07

    学习强国深度报道 RT-Thread“1+X+N”战略,国产操作系统赋能高端制造引关注|媒体视角

    近日,国产嵌入式操作系统领军企业RT-Thread睿赛德在工博会发布的“1+X+N”战略体系,获得了国家级权威媒体平台“学习强国”的重点报道。该报道从产业高度深入剖析了RT-Thread睿赛德以自主
    的头像 发表于 09-29 17:37 1340次阅读
    <b class='flag-5'>学习</b>强国深度报道 <b class='flag-5'>RT-Thread</b>“1+X+N”战略,国产操作系统赋能高端制造引关注|媒体视角

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 2337次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig
    的头像 发表于 08-29 12:22 2080次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 1239次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3699次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2802次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1936次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发中实时性、安全性与灵活性的平衡问题。通过分层安全内核(rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 3410次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    玄铁加入RT-Thread 高级会员合作伙伴 | 战略新篇

    今天起,玄铁XuanTie正式成为RT-Thread高级会员合作伙伴。此次合作标志着双方将在嵌入式操作系统创新、RISC-V生态构建及行业应用落地等领域展开深度协同,加速推动开源技术的产业化进程
    的头像 发表于 06-23 20:22 1331次阅读
    玄铁加入<b class='flag-5'>RT-Thread</b> 高级会员合作伙伴 | 战略新篇

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1524次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1416次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进