完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在使用RT-Thread时发现,在不使能RT_USING_USER_MAIN时,在main函数中定义局部变量,该变量所在栈与线程所在栈存在重合情况。 复现步骤: 不使能RT_USING_USER_MAIN; 问: 在RT-Thread在不使能RT_USING_USER_MAIN时,main函数中定义的局部变量地址范围是多少? #include <rthw.h> NOTE: please initialize heap inside board initialization./ |
|
相关推荐
4个回答
|
|
不使能RT_USING_USER_MAIN时,main函数运行时,还不在线程中,此时使用startup.S中的栈。
像M3这类libcpu,后面中断ISR也是继续使用这个栈。 因这个main函数不会返回,所以部分libcpu,如m3/m3/m7等把这个栈做了回收,退回栈起始位置。 /* restore MSP */ LDR r0, =SCB_VTOR LDR r0, [r0] LDR r0, [r0] NOP MSR msp, r0 所以,你在main之后给这个位置下个写断点,会发现有ISR在使用它。 |
|
|
|
|
|
|
|
所以是main函数调用rt_system_scheduler_start()时,rt_system_scheduler_start里回收了栈,将MSP退回了栈的起始位置。
即main函数里定义的非static、非heap类的局部变量的生命周期与main函数的声明周期不相等。 现在有了新的疑问: 为什么要回收这部分栈?可以不回收吗? 您提到的“在main之后给这个位置写个断点”,不用在线debug的方式可以观测吗?具体怎么写?怎么看到是哪些ISR在使用它 |
|
|
|
回收当然是再利用啊!不回收当然没问题,浪费掉呗。可以去startup.S里面开大点,效果一样。
能通过寄存器访问到debug单元的芯片,可以自己给自己设置断点。要么你用MPU/PMP保护起来也可以看到。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AI模型部署边缘设备的奇妙之旅:边缘端设备的局域网视频流传输方案
1734 浏览 0 评论
1591 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
6885 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1914 浏览 0 评论
5219 浏览 0 评论
79772 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-24 08:56 , Processed in 0.427538 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191