如图,为什么申请了64K大小的堆,heapitem会跑到FLASH的空间里了(该0x900XXXX的地址为rt_thread_create的entry入口函数地址)?0x24XXXXXXX是RAM地址,0x90XXXXXXX是FLASH地址
查看更多
看截图应该是线程入口函数在flash的地址。
多半是有地方数据读写越界了吧
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
调试之后发现是在rt_printf里面被改写了_heap和rt_heap的数据,为啥这里会数据越界了?而且va_list args的局部变量地址还和rt_heap数组的地址发生重叠了。请问有什么头绪吗?
线程堆栈溢出了呗
@红枫 是的。设置的堆栈空间不够。😂
@红枫 专家,还是有问题,我已经把main任务的栈空间设置到4000字节了,实际上也没干啥工作,也没有定义成局部变量大数组,现在还是有问题。
基本情况如下,RT-THREAD版本v3.1.5,STM32CUBEIDE+GCC编译,芯片STM32H750(512KB RAM)。
初始化阶段创建了64KB的堆,main任务分配4000字节的栈空间,断点通过观察该64K RAM数据可以看到,任务未启用调度前,一些对象和线程的初始化都能调用rt_malloc正常创建数据内存块。
一旦开启了任务调度,MAIN任务执行rt_kprintf函数时,却把MAIN任务后面部分(大概在4000字节末端)的内存数据块数据(struct heap_mem)打乱(反编译调试发现是进入函数时的压栈指令导致)了,所以为啥我的MAIN任务执行时,数据不是从4000字节的前面开始入栈而是而是从4000字节后入栈了?。。。
define RT_USING_HEAP
define RT_USING_SMALL_MEM
define RT_USING_CONSOLE
define RT_CONSOLEBUF_SIZE 1024
堆栈生长方向的问题算是搞懂了,原来还有个ARCH_CPU_STACK_GROWS_UPWARD的宏。😰
不过无论向上还是向下,rt_kprintf执行还是会把内存堆的内存块控制数据打乱。。。。。。ORZ
再试了一下,main任务里任何函数都会打乱临近的内存控制块的数据,奇怪了,如果设置成向上生长,它是从任务栈的开始位置向低地址使用栈空间,如果设置成向下生长,它是从任务栈的结束位置向高地址使用栈空间,为啥是反了的?。。。。。。
进一步发现,问题是出在bsp的context_gcc.s文件调用switch_to_thread设置堆栈指针之后(这里还是正常的,刚好是该线程内存块的最后第一个字节的地址),但问题是返到main线程的入口时sp指针发生了偏移(此时指针比正常值向后偏移了一些,比如+20)。暂不确定是编译器问题还是context_gcc.s的代码跟H750不匹配。