我实在无意引起新一波讨论:
关于在单片机上使用malloc/free的问题。
我之前写了一个基于 malloc/free的 CStyleString.作为一个做单片机为主的我来说,我当然是希望它们可以用于单片机。是的,也许String功能对于单片机意义不大,但是类似于的vector意义可就大了。而它们同样涉及这对 堆内存管理 的需求。
我知道你们随便跑出一个人都会告诉我
"在单片机上用动态分配是找死。"
——或者类似的话。
然而,我还是决定继续往下走。此前,我翻阅了包括 PJP的C标准库,C和指针 在内的好几本 C经典,但发现它们只是提到怎么使用这些函数。却完全没有我想要的答案
“在单片机上动态分配内存,需要注意什么?”
这里面一个关键是,单片机这种资源稀缺型系统,内存非常有限。而且他不比PC机,随随便便就有一个操作系统——几乎所有的操作系统都提供了 内存管理功能。我知道一些嵌入式操作系统的大致方案,就是一点都不动态,是使用静态内存。
其实C标准库本身,与任何操作系统的实现无关,也不依赖操作系统,因此它本身是非常独立的。而且阅读C标准库你会发现,其实C的实现者并不只知道PC机和windows或者linux。他们同样知道其他各类包括我们的单片机在内的各种 计算机硬件。
因此它们已经考虑得够多了。
而很多时候我只希望,我可以,“妥善的使用,正确的使用 已经有的成熟技术”,然后免除许多麻烦。
一直忘了今天是2013年最后一天,所幸,花了几个晚上考虑的一个问题,总算找到一个更贴切的 路标:
内存管理
本帖最后由 辛昕 于 2013-12-31 21:03 编辑
在单片机或者嵌入式系统里用动态分配其实没什么。堆只是传说中的概念,从本质上讲,堆只是一个静态全局数组,操作它的外部接口函数只有malloc和free。很多小型嵌入式系统都提供了动态申请内存的方法,只不过,出于空间效率和时间效率的考虑,更多的时候可能会考虑使用所谓不动态的固定块的方式,很少的时候,也会有使用按字节分配的方式。“动态申请内存”,不过就是一个拥有“巨大”内存空间(数组)的模块而已,我们只是调它的接口,向它借用空间,并适时归还。所谓动态的机制,无非就是这个模块的实现手段罢了。
在我眼里,变量没有谭老师书里讲的那么复杂,而是只有两种:局部的变量,在调用栈里临时保存;全局的变量,在内存中长久保存。
再进一步,其实栈也不过就是一个全局的数组而已。
用c++的string或者vector干
然后封装一个 c接口即可。
这是我后来想到的最好的办法。
我是说,在单片机上用。
1941
String和Vector也是通过动态申请来实现的,so,你用他们一点意义都没有,还不如直接调用malloc/free