嵌入式技术william hill官网
直播中

百灵千岛酱

9年用户 528经验值
擅长:处理器/DSP
私信 关注
[问答]

RTThread的动态内存空间该如何去分配呢

关于rtt的动态内存空间分配,想问一下以下我的几点理解是对的吗

1、我看RTT NANO和MASTER版本的动态内存分配好像不太一样,我的理解是MASTER版本的动态内存位置是从ZI段结束地址到RAM结束地址划分作为动态内存,而NANO版本好像是开辟了一个静态数组,这时候的动态内存划分位置就是位于BSS段

2、使用malloc等系统函数分配到的内存是位于ZI段,也就是在启动文件中分配的Heap_Size,而使用rt_malloc申请到的则是RTT分配的空间

然后有以下几个问题

1、如果是动态创建线程,那线程中的局部变量是位于RTT分配的动态内存空间中还是位于栈空间中?

2、如果使用一些第三方库比如CJson,是否需要将库中使用的malloc函数换成rt_malloc

回帖(7)

丁冬芹

2022-8-31 14:34:39
函数调用中的局部变量是在线程栈上分配的。线程栈内存在哪儿,局部变量就在哪儿。动态创建的线程,线程栈是从堆上申请,局部变量也是在堆内存上(但是,我们还是称呼它们在线程栈内存,跟其它堆申请的内存区分开)。
尽量不用 malloc ,用一种堆管理器管理堆内存。
举报

百灵千岛酱

2022-8-31 14:34:46
那请问我的前两点理解是对的吗,如果线程栈内存是位于堆内存上的话,那局部变量使用完会自动释放吗?局部变量能开辟的最大空间是不是rt_thread_create函数里设置的stack_size参数,然后自线程创建开始一直占用着stack_size那段空间,直到线程被手动删除
举报

丁冬芹

2022-8-31 14:34:54
细品上面括号里那句话。局部变量在线程栈上会释放,但是在堆上不会释放,线程退出才会释放线程栈(从堆上释放)。
线程被创建后,内存就被占用了,直到它退出被销毁。
举报

王璐

2022-8-31 14:35:01
建议直接看对应的malloc、rt_malloc的实现。虽然malloc是libc的接口,但是也可以在自己的代码中用自己的实现覆盖。
举报

百灵千岛酱

2022-8-31 14:35:07
我直接把库里的malloc换成rt_malloc可以吗
举报

丁冬芹

2022-8-31 14:35:14
可以,但是需要注意的是rt_malloc的内存池大小是不是可以满足需求,同时free也要换成对应的rt_free。
举报

马占云

2022-8-31 14:35:22
建议使用 rt_malloc,rtt将单片机中未使用的RAM都定义为堆空间,然后 rt_malloc 就是从这部分空间中申请内存,使用的是 rtt 的内存管理。你也可以这样理解,rtt 将 RAM 中未使用的部分当做一个大数组,然后 rt_malloc 都是从这个大数组中进行内存的申请。
1.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分