Microchip 16位 32位单片机 malloc()函数的若干问题

C语言中的malloc()函数用于动态地在内存中分配一块空间来存储数据,对于在程序执行过程中需要动态分配内存的应用来说,这是十分有用的功能。

Microchip的编译器C30(16位单片机)以及C32(32位单片机)在较新的版本中也开始实现了这个函数,这为对RAM本来有些捉襟见肘的单片机编程添加了不少灵活性。不过在实际使用过程中有几个需要注意的地方(以MPLab v8.63为例)。

  1. 需要告知编译器程序中将会使用动态内存分配,不然编译会出错。选项位于 Project -> Build Option -> MPLab xx Link 这个界面里,找到 Heap Size这个框,在旁边输入动态分配可能需要的字节数即可。另外,实际使用中注意到一个现象,就是输入的字节数大小在实际程序的运行中并不能全部分配到, 实际最多只能得到的要比输入的字节数少8个byte的样子,不然malloc返回NULL,即分配空间失败。不知道这是编译器的bug,还是分配空间过程 中的自然损耗。
  2. 程序在第一次分配大空间之前需要“热身”,也就是预分配一次小空间,才能获得设置时设定的最大空间。比如设置时候输入了heap空间为16384 字节(byte),如果跑上来就用malloc函数请求分配这么大的空间,malloc返回NULL,即分配失败。通过反复尝试发现需要在分配大空间之前 先malloc哪怕一个byte的空间,然后在用free释放,再用malloc请求大空间,就不会有任何问题。另外,这里的“大”空间要大到heap空 间输入值的1/2。以上面的16384为例,如果程序一跑上来请求分配小于8192的空间,就不会有“预热身”的需要。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

%d 博主赞过: