搜索
bottom↓
回复: 51

请教如何在stm32f407的裸奔代码中动态管理内存?

[复制链接]

出0入0汤圆

发表于 2018-12-21 20:41:04 | 显示全部楼层 |阅读模式
有一个应用,需要在stm32f407中动态分配内存空间,
额,之前都是直接给静态空间的。

万能的坛友,有实现好的方案吗?可以在裸奔代码中实现动态管理内存的方案?
话说,直接像在pc端一样,使用C语言库中的malloc和free函数是不行的把?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-12-21 20:49:42 | 显示全部楼层
参考正点原子的代码,或者freeRTOS的代码,或者自己造轮子

出0入0汤圆

发表于 2018-12-21 20:58:50 来自手机 | 显示全部楼层
都要动态管理内存了,上个rtos吧,都带内存管理的

出0入0汤圆

 楼主| 发表于 2018-12-21 21:01:57 | 显示全部楼层
话说,keil arm中可以使用c自带的malloc和free函数么?需要在启动文件中修改heap的空间大小?不知道是不是可以这么实现了?

出0入0汤圆

 楼主| 发表于 2018-12-21 21:03:54 | 显示全部楼层
负西弱 发表于 2018-12-21 20:49
参考正点原子的代码,或者freeRTOS的代码,或者自己造轮子

哪个开发板中有这个管理部分了?

出30入54汤圆

发表于 2018-12-21 21:46:08 | 显示全部楼层
leicai05 发表于 2018-12-21 21:01
话说,keil arm中可以使用c自带的malloc和free函数么?需要在启动文件中修改heap的空间大小?不知道是不是 ...

可以用的,用着没有问题

出0入0汤圆

发表于 2018-12-21 21:52:35 | 显示全部楼层
leicai05 发表于 2018-12-21 21:01
话说,keil arm中可以使用c自带的malloc和free函数么?需要在启动文件中修改heap的空间大小?不知道是不是 ...

malloc和free需要在OS的语境下才有意义,不然malloc是向谁申请?free出来的空间又该还给谁?

想用动态内存就意味着你的功能在内存占用上存在竞争了,那么CPU时间片上必然也需要管理。而OS就是管理内存和CPU的,不上OS还想什么……

出0入0汤圆

发表于 2018-12-21 21:59:01 | 显示全部楼层
leicai05 发表于 2018-12-21 21:01
话说,keil arm中可以使用c自带的malloc和free函数么?需要在启动文件中修改heap的空间大小?不知道是不是 ...

反过来说,如果内存够用的情况下,就没必要用动态内存。自己搞个大点的数组当缓存就什么都解决了。

出615入1076汤圆

发表于 2018-12-21 22:40:52 | 显示全部楼层
用 gcc 編譯,malloc 和 free 是可以用的,不過一般不建議使用,因爲有碎片、缺管理等問題。

可以考慮用鏈表實現固定大小內存分配,簡單,適合實時應用,例如:

https://github.com/dukelec/cdnet/blob/master/utils/cd_debug.c


  1. typedef struct {
  2.     list_node_t node;
  3.     uint8_t data[DBG_STR_LEN]; /********************* 內存塊 *********************/
  4.     int len;
  5. } dbg_node_t;


  6. static dbg_node_t dbg_alloc[DBG_LEN]; /********************* 分配內存 *********************/

  7. static list_head_t dbg_free = {0};
  8. static list_head_t dbg_tx = {0};

  9. void debug_init(void)
  10. {
  11.     int i;
  12.     for (i = 0; i < DBG_LEN; i++)
  13.         list_put(&dbg_free, &dbg_alloc[i].node); /********************* 初始化內存 *********************/
  14. }

  15. void _dputs(char *str)
  16. {
  17.     dbg_node_t *buf = list_get_entry_it(&dbg_free, dbg_node_t); /********************* 申請內存 *********************/
  18.     if (buf) {
  19.         buf->len = strlen(str);
  20.         memcpy(buf->data, str, buf->len);
  21.         list_put_it(&dbg_tx, &buf->node);
  22.     } else {
  23.         ......
  24.     }
  25. }

  26. void debug_flush(void)
  27. {
  28.         ......
  29.         dbg_node_t *buf = list_get_entry_it(&dbg_tx, dbg_node_t);
  30.         ......
  31.         dbg_transmit(&debug_uart, buf->data, buf->len);
  32.         list_put_it(&dbg_free, &buf->node); /********************* 釋放內存 *********************/
  33.     }
  34. }
复制代码


出0入0汤圆

发表于 2018-12-21 22:47:03 来自手机 | 显示全部楼层
cloudboy 发表于 2018-12-21 21:46
可以用的,用着没有问题

高可靠性的设计是不允许使用动态分配内存的…虽然用没问题…但是有问题不容易发现…我以前碰到过…很长很长时间系统内存才会爆掉…后来全部静态分配了…

出0入0汤圆

发表于 2018-12-21 23:45:11 来自手机 | 显示全部楼层
本帖最后由 nanfang2000 于 2018-12-22 01:32 编辑
crtfor 发表于 2018-12-21 21:52
malloc和free需要在OS的语境下才有意义,不然malloc是向谁申请?free出来的空间又该还给谁?

想用动态内 ...


拜托先弄懂堆和栈的概念,malloc从堆里申请,还回去也是还给堆。用任意一块静态内存都可以做堆,和OS没啥关系。OS管理内存是为了保护进程之间的空间安全。
裸机上用malloc和free太常见了
编辑原因,笔误堆写成栈

出0入0汤圆

发表于 2018-12-21 23:48:02 来自手机 | 显示全部楼层
本帖最后由 nanfang2000 于 2018-12-22 01:31 编辑

回楼主,当然是行的,用库的话只要指定链接文件中堆的位置和大小即可。如果自己实现malloc 和free,可以更灵活,你可以显式的先定一个大数组作为堆都可以,反正就是指定一段内存作为堆空间即可
编辑原因,笔误堆写成栈

出0入0汤圆

发表于 2018-12-22 01:04:56 | 显示全部楼层
本帖最后由 crtfor 于 2018-12-22 01:11 编辑
nanfang2000 发表于 2018-12-21 23:45
拜托先弄懂堆和栈的概念,malloc从栈里申请,还回去也是还给栈。用任意一块静态内存都可以做栈,和OS没啥 ...


首先,纠正一下你错到姥姥家的错误:malloc申请的是“堆内存”!你听说过“调用栈”这个东西吗?栈内存根本就不是用来给你存数据的,而是用来执行代码时处理指令和暂存立即数据的,并且MCU自身的栈内存你根本干预不到!(OS中的栈内存才可以通过程序控制从而实现某些功能)……合着你连基本常识都没有就来教别人,尴尬不尴尬?

其次,注意看清我说的是“无意义”。没有OS进行内存管理,malloc时堆内存不足直接跑飞,没有完全free产生的内存碎片也没法处理。时刻想着这些问题还不如不用;内存足够大更无所谓用不用。或者你举个malloc&free可以实现但struct&array不行的例子。

出0入0汤圆

发表于 2018-12-22 01:24:12 来自手机 | 显示全部楼层
crtfor 发表于 2018-12-22 01:04
首先,纠正一下你错到姥姥家的错误:malloc申请的是“堆内存”!你听说过“调用栈”这个东西吗?栈内存根 ...

我的确糊涂了笔误把堆写成栈了,其它我说的都没错。但是你说的和OS有关是绝对错误的。
我用malloc情况很多的,当业务是无法预知的情况下你没办法用静态变量。比如我窗口有一千个按钮,每个按钮打开一个窗口你不能把一千个窗口全先静态申请了,因为内存不够大。但因为用户不会同时打开多个窗口,所以动态申请即可解决,需要的堆大小不需要很大。
如果你不需要用到动态申请内存,只能说明你的业务是单一而可以预估的

出0入0汤圆

发表于 2018-12-22 01:39:39 | 显示全部楼层
nanfang2000 发表于 2018-12-22 01:24
我的确糊涂了笔误把堆写成栈了,其它我说的都没错。但是你说的和OS有关是绝对错误的。
我用malloc情况很 ...


你需要同时打开所有1000个窗口吗?或者用了动态内存你就可以不限制打开窗口个数?如果固定窗口个数,那么打开的窗口是不是可以跟固定个数的struct绑定一下?

而且有多少情况值得你频繁的动用malloc分配大片内存?不都是传个参数写几个局部变量然后返归一下,这些操作栈里解决都绰绰有余。

出0入0汤圆

发表于 2018-12-22 01:40:22 | 显示全部楼层
如果malloc都内存不足那么你静态定义肯定更不足,要么就是设计有问题。malloc的标准用法是要检查申请成功与否的,所以不会跑飞。另外,内存碎片导致申请失败的可能性非常低,而且和你的设计有极大关系,通常良好的设计不会发生这样的事情。
malloc是对程序员有更高的要求,但这不是不用它的理由

出0入0汤圆

发表于 2018-12-22 01:46:45 | 显示全部楼层
nanfang2000 发表于 2018-12-22 01:40
如果malloc都内存不足那么你静态定义肯定更不足,要么就是设计有问题。malloc的标准用法是要检查申请成功与 ...

注意题主问的是在没有OS的情况下使用。裸跑能把内存用完的应用还敢用malloc或者还不用OS,这才真叫设计有问题。

出0入0汤圆

发表于 2018-12-22 01:51:00 来自手机 | 显示全部楼层
crtfor 发表于 2018-12-22 01:39
你需要同时打开所有1000个窗口吗?或者用了动态内存你就可以不限制打开窗口个数?如果固定窗口个数,那么 ...

理论上你这样也不是不能做,但是这样程序复杂到极点,很多限制,bug更多。
简单的逻辑当然用栈和局部变量就够了,这种情况下当然不用malloc。但是复杂的业务,比如用到了gui,用到了网络协议栈。这些情况下数据的大小,时间,生命周期都是不确定的,没办法在编译时确定,所以需要动态申请。
malloc是有开销的所以我从来没说过要频繁的调用,而是需要的时候调用。

出0入0汤圆

发表于 2018-12-22 01:59:38 来自手机 | 显示全部楼层
本帖最后由 nanfang2000 于 2018-12-22 02:05 编辑
crtfor 发表于 2018-12-22 01:46
注意题主问的是在没有OS的情况下使用。裸跑能把内存用完的应用还敢用malloc或者还不用OS,这才真叫设计有 ...


裸跑用malloc很正常,设计得当的话会比静态省内存。比如a模块需要用8k内存,b模块也需要8k内存。如果静态分配的话,需要16k内存。但是恰好两个模块是不同时调用的,生命周期不重叠,那么就可以弄个8k的堆来共享就够了。
当然你也可以用分时使用一个共享buffer的方式实现,但是如果不是两个模块而是几十个模块呢?它们共享内存的组合有无数种可能,所以malloc就是专门帮你管理这种共享内存的
编辑:增加说明

出0入0汤圆

发表于 2018-12-22 02:08:49 | 显示全部楼层
nanfang2000 发表于 2018-12-22 01:59
落跑用malloc很正常,设计得当的话会比静态省内存。比如a模块需要用8k内存,b模块也需要8k内存。如果静态 ...

既然不存在竞争那么用malloc又有什么优势?静态8k内存放着也一样的用。

出0入0汤圆

发表于 2018-12-22 02:12:28 | 显示全部楼层
nanfang2000 发表于 2018-12-22 01:51
理论上你这样也不是不能做,但是这样程序复杂到极点,很多限制,bug更多。
简单的逻辑当然用栈和局部变量 ...

GUI和网络协议不是更得用固定缓冲区么。

出0入0汤圆

发表于 2018-12-22 02:20:30 | 显示全部楼层
nanfang2000 发表于 2018-12-22 01:59
裸跑用malloc很正常,设计得当的话会比静态省内存。比如a模块需要用8k内存,b模块也需要8k内存。如果静态 ...

总之绝大部分落跑的程序都不会对内存有多高的使用率。而很占用内存的地方通常就固定的几个。它们占用的总内存大于MCU的内存,又不同时出现,同时还可以通过动态内存来解决的情况更是少之又少。

出0入0汤圆

发表于 2018-12-22 02:21:20 | 显示全部楼层
crtfor 发表于 2018-12-22 02:08
既然不存在竞争那么用malloc又有什么优势?静态8k内存放着也一样的用。

多了就不一样,50个模块都需要8k内存,而需要内存的时间有些重合有些不重合,这有无数种情况。但是如果事先分析出最坏情况最多同时有40k的内存就够了。而静态定义的话,要么不管三七二十一定义400k的静态变量,要么就自己写个共用内存的分配算法,这时候等于你自己实现了一遍malloc函数

出0入0汤圆

发表于 2018-12-22 02:43:36 | 显示全部楼层
nanfang2000 发表于 2018-12-22 02:21
多了就不一样,50个模块都需要8k内存,而需要内存的时间有些重合有些不重合,这有无数种情况。但是如果事 ...

你这是想象中的情况。
可以看下我上个回复,裸跑的应用搞这么复杂还恰好只能用malloc解决问题的情况基本上等于不存在。
还没开始讨论malloc带来的副作用呢。

这么着吧,反正用不用malloc也就那回事,又谁也说服不了谁,咱们就不要再在这儿做无用功了。
当然我承认用malloc是会方便一点随意一点,仅此而已吧。

出615入1076汤圆

发表于 2018-12-22 03:46:34 | 显示全部楼层
本帖最后由 dukelec 于 2018-12-22 03:55 编辑
nanfang2000 发表于 2018-12-22 02:21
多了就不一样,50个模块都需要8k内存,而需要内存的时间有些重合有些不重合,这有无数种情况。但是如果事 ...


火藥味很濃。。。

你這個場景挺適合用 9 樓鏈表的方式(相當於你說的 等于自己实现了一遍 malloc, 但固定大小的內存分配簡單安全很多,不用擔心碎片等問題)。

另外提一下,哪怕是 Linux 用戶空間程序,如果使用到 RT PREEMPT(實時 Linux 補丁),是不允許動態申請內存的,所以 malloc 不是萬能的。。。

出0入93汤圆

发表于 2018-12-22 07:07:55 | 显示全部楼层
crtfor 发表于 2018-12-21 21:52
malloc和free需要在OS的语境下才有意义,不然malloc是向谁申请?free出来的空间又该还给谁?

想用动态内 ...


不要误人子弟。
malloc和free是C标准库的内容,跟OS没有任何关系。动态内存当然是分配在heap中了。只是动态分配内存就免不了内存碎片,在某些情况下可能是致命的,而且性能远远比不上静态分配,所以可能的话尽量不用或少用动态分配。

出0入0汤圆

发表于 2018-12-22 07:44:27 | 显示全部楼层
bg6agf 发表于 2018-12-21 22:47
高可靠性的设计是不允许使用动态分配内存的…虽然用没问题…但是有问题不容易发现…我以前碰到过…很长很 ...

限制成本的话,你就不会那么土豪了。  就像你无法想象一个贴片电容(现在电容贵,改贴片电阻吧!)也要节省还要保证稳定的设计。  

出0入0汤圆

发表于 2018-12-22 08:32:20 | 显示全部楼层
crtfor 发表于 2018-12-21 21:52
malloc和free需要在OS的语境下才有意义,不然malloc是向谁申请?free出来的空间又该还给谁?

想用动态内 ...

malloc和free是库函数,不是系统调用吧?

出0入0汤圆

发表于 2018-12-22 08:42:25 | 显示全部楼层
crtfor 发表于 2018-12-22 02:43
你这是想象中的情况。
可以看下我上个回复,裸跑的应用搞这么复杂还恰好只能用malloc解决问题的情况基本 ...

假如单片机有3K的内存,如果有两个函数都需要2K的局部变量做算法,但这两个函数不会同时运行,你用静态怎么办?不够分的。用动态的就可以,谁用完了释放,就可以够另一个用的。这跟OS没啥关系。

出0入0汤圆

 楼主| 发表于 2018-12-22 08:45:39 | 显示全部楼层
crtfor 发表于 2018-12-22 02:43
你这是想象中的情况。
可以看下我上个回复,裸跑的应用搞这么复杂还恰好只能用malloc解决问题的情况基本 ...

谢谢你的答复,其实我也是倾向于直接定义静态空间的,主要是省事,动态分配在单片机中没有用过,不知道又没有bug,(同事就是使用的freeRTOS系统,两个简单的任务,工作的时候,通讯间隔1s都运行几分钟就死机了!!)
后来,我来处理这个项目,直接改裸机(因为过程不是很复杂),申请的是静态空间,通讯间隔100ms通讯一天了都没有错误。我也知道在一些安全较高的系统中是不允许使用动态内存分配的,
但是有一个必须使用动态分配空间的地方就是,核心的算法是老板自己开发的,老板是做pc端算法研究的
他的算法就是要动态申请空间,然后函数返回这个申请的空间地址,后面的程序需要我来操作这个内存。你知道,给你发工资的人的要求是必须完成的


我看到有人在裸机的情况下说可以直接使用c语言库中的malloc和free函数,也有人是自己写的heap管理系统,包括正源点子的407开关板中,也有自己显示内存管理的方法,我就是不知道这样有什么区别和各自有什么缺点。

出0入0汤圆

 楼主| 发表于 2018-12-22 08:49:27 | 显示全部楼层
nanfang2000 发表于 2018-12-22 02:21
多了就不一样,50个模块都需要8k内存,而需要内存的时间有些重合有些不重合,这有无数种情况。但是如果事 ...

谢谢你的解答,让我又懂了很多,我准备了两套方案heap.c的方案(都是简单的对heap的管理来实现动态分配)包括了正点原子的heap的操作。
我都拿来试试,并且还试试系统自带的malloc和free。

然后比较一下这三个方案有什么不同。有结果后向大家汇报。

出0入8汤圆

发表于 2018-12-22 08:52:11 | 显示全部楼层
prince2010 发表于 2018-12-22 08:32
malloc和free是库函数,不是系统调用吧?

反正内存管理,跟用不用 OS 无关就是了。

出0入0汤圆

 楼主| 发表于 2018-12-22 08:56:42 | 显示全部楼层
统一谢谢大家的回复,给了我很多启发。
那么我觉得我的实际应用应该是可以使用malloc和free的,因为大家都说主要是怕malloc会产生内存碎片,而我的是在裸机的情况下使用动态分配,我的分配有一个特点就是分配一次,然后处理完成后就释放了,最多也就连续两次申请,然后肯定两次都释放了以后才会继续申请空间的操作。这样是不是我就不会怕产生内存碎片了(因为基本不会有许多任务都在申请空间,或者一直占用,导致其他的申请空间不连续的情况出现)?

出0入8汤圆

发表于 2018-12-22 09:12:17 | 显示全部楼层
leicai05 发表于 2018-12-22 08:56
统一谢谢大家的回复,给了我很多启发。
那么我觉得我的实际应用应该是可以使用malloc和free的,因为大家都 ...

有规律的操作,不会。

出0入0汤圆

发表于 2018-12-22 09:41:24 来自手机 | 显示全部楼层
dukelec 发表于 2018-12-22 03:46
火藥味很濃。。。

你這個場景挺適合用 9 樓鏈表的方式(相當於你說的 等于自己实现了一遍 malloc, 但固 ...

你说得对,嵌入式系统中用特殊的malloc,也就是你说的每次申请固定大小,会不容易产生碎片,但这是简单的情况,必须人工分析最大可能用多大的分配块。我们公司还用过内存池的方法来共享内存,某种情况下好用,不过也有局限。不管用静态还是什么malloc,永远都需要得当的设计,根据需求来,所以我想说,不存在说哪个是个坏东西千万别用这种说法。
事实上,随着嵌入式系统越来越复杂,资源越来越多,语言越来越高级,任务越来越复杂,malloc是会用的越来越多。像嵌入式里用的micropython里面全是malloc。像我们公司用的高级CPU跑算法跑多任务,更是无法避免。

出0入0汤圆

发表于 2018-12-22 12:53:20 | 显示全部楼层
本帖最后由 crtfor 于 2018-12-22 13:38 编辑
prince2010 发表于 2018-12-22 08:32
malloc和free是库函数,不是系统调用吧?


没有意义。而且怎么会跟OS没关系呢?你觉得没关系是因为几乎所有的malloc和free都是基于特定OS实现的。
反到是在MCU上裸跑malloc的情况以前不多,以后也会不多。以前是性能经不起折腾,不必多说。以后随着嵌入式领域的发展,跑OS或者继承更高级的内存管理几乎是必然的事,裸跑这个事情本身就会越来越少。

当然我从来没说过用malloc是错的,只是权衡得失觉得malloc并没有优势,没必要用。

另外,说我误人子弟的那个我就不单独回复了。只能说如果挖坑不用自己填是挺爽的。

出0入0汤圆

发表于 2018-12-22 13:10:26 | 显示全部楼层
wuha 发表于 2018-12-22 08:42
假如单片机有3K的内存,如果有两个函数都需要2K的局部变量做算法,但这两个函数不会同时运行,你用静态怎 ...

两个函数都操作2K的静态内存有什么不好呢?反正他们没可能同时执行。

出0入0汤圆

发表于 2018-12-22 13:16:53 | 显示全部楼层
crtfor 发表于 2018-12-22 13:10
两个函数都操作2K的静态内存有什么不好呢?反正他们没可能同时执行。

晕,同时申请静态内存,编译时就已经超出单片机内存了,编译都无法通过!

出0入0汤圆

发表于 2018-12-22 13:22:22 | 显示全部楼层
wuha 发表于 2018-12-22 13:16
晕,同时申请静态内存,编译时就已经超出单片机内存了,编译都无法通过! ...

既然3K内存2K都要干特定的事了,为什么不写个全局变量?

出0入0汤圆

发表于 2018-12-22 16:58:19 | 显示全部楼层
裸奔用malloc和free我觉得没必要,还不如自己定一个大BUFF以长度相同的块分配。用OS的话有专门的内存管理效率高点。

出0入0汤圆

发表于 2018-12-22 17:51:35 来自手机 | 显示全部楼层
crtfor 发表于 2018-12-22 13:22
既然3K内存2K都要干特定的事了,为什么不写个全局变量?

我竟无然以对,我再想想有没别的例子。

出0入0汤圆

发表于 2018-12-22 23:58:36 | 显示全部楼层
不是RTOS,动态的好处还是挺实际的,比如我通信的数据结构,静态分配几个对象每个配一个,动态分配就支持几级缓冲,划算。

出0入0汤圆

发表于 2018-12-23 01:08:22 | 显示全部楼层
keil的基础库中已经定义好了malloc和free的实现方式,只要在启动代码中修改heap大小就可以实现操作
另外要注意要去实现多线程锁(最简单的就是锁中断),以及堆扩容,这些都可以在keil的help手册中找到相应的接口和使用说明
可能的话要尽量使用C++标准容器或者智能指针来对动态内存进行管理,以及不要在中断中使用任何动态内存操作

出0入0汤圆

发表于 2018-12-23 12:10:24 来自手机 | 显示全部楼层
不是只要用了malloc/free就一定会有内存碎片的,只有分配出去的内存尺寸很分散,生存期也很分散,才会有因为碎片分不到内存的问题。malloc/free的最大问题是运行时间不确定,这是实时系统的大忌,我通常在初始化的时候用malloc分一大块,然后根据应用特点来搞个简单的内存管理器来管。

出0入59汤圆

发表于 2018-12-23 14:16:42 | 显示全部楼层
高可靠设计不允许使用动态分配内存?, 那么C++ 中的NEW 不是也用不了?

出0入0汤圆

 楼主| 发表于 2018-12-23 17:01:29 | 显示全部楼层
polarbear 发表于 2018-12-23 14:16
高可靠设计不允许使用动态分配内存?, 那么C++ 中的NEW 不是也用不了? ...

确实有些安全性比较高的场合下,是不允许使用动态分配内存的。

出30入54汤圆

发表于 2018-12-23 19:09:42 | 显示全部楼层
我有一个解析FreeRTOS的heap4的博文在CSDN上,使用了很长时间除了它没有实现realloc以外没有发现它设计本身的问题,碎片问题基本上也不凸显因为会尝试合并碎片,
用库的malloc的好处在于代码集成起来简单,有时候你用了一个代码栈用到了动态内存管理手头又没有合适的算法也比较尴尬,这个时候直接用库的我觉得没毛病,如果不合适,那只能说这个应用环境太过特别,重点要做的是去分析应用使用malloc的特点然后来考虑采用哪种实现。简单的自己拿一个链表来做也是很简单的,一般也就是遍历效率的问题。
用有源码的这种malloc的好处在于代码好追溯,出现一些底层内存问题容易查找原因,用系统的库你没有源码确实不好分析(并不是说就不能分析,逆向和汇编调试这个事嘛,也不难)
我自己集成工程的时候别人提交的代码测试的时候有时候内存使用不当经常跑挂,这个时候看内存现场有时候是很奔溃的,因为申请的内存都是动态的,每次申请打日志又很麻烦,所以当时我就做了一个heap4的分析工具,同样放在CSDN那个博文里面了,有个github的链接
听着很像是给我的博文打广告哈哈,不过我觉得写得一般,只是一些总结,纯当交流
https://blog.csdn.net/jtd9009001/article/details/84500680

出0入8汤圆

发表于 2018-12-23 22:35:26 来自手机 | 显示全部楼层
合理使用malloc free,不要一刀切。cjson库就是需要动态内存的,那还不能用了吗

出0入0汤圆

 楼主| 发表于 2018-12-24 08:40:27 | 显示全部楼层
cloudboy 发表于 2018-12-23 19:09
我有一个解析FreeRTOS的heap4的博文在CSDN上,使用了很长时间除了它没有实现realloc以外没有发现它设计本身 ...

顶你,你的博客不错!

出0入0汤圆

发表于 2018-12-24 08:50:50 | 显示全部楼层
crtfor 发表于 2018-12-21 21:52
malloc和free需要在OS的语境下才有意义,不然malloc是向谁申请?free出来的空间又该还给谁?

想用动态内 ...

因果关系不严谨吧

出870入263汤圆

发表于 2018-12-24 09:23:51 | 显示全部楼层
crtfor 发表于 2018-12-22 02:43
你这是想象中的情况。
可以看下我上个回复,裸跑的应用搞这么复杂还恰好只能用malloc解决问题的情况基本 ...

说句实话,你的观点太极端。堆和栈都是编程中不可缺少的内存管理方式!
emWin这样的中间件,它需要你指定一块内存给它作为堆使用;而后所有结构对象都从这个堆中获取。
如果没有堆这种方式,emWin不可能实现的。

出0入0汤圆

发表于 2018-12-24 12:53:20 | 显示全部楼层
参考ucGUI,可以在裸奔的条件下动态分配释放内存
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-24 16:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表