C语言中的malloc()函数用于动态地在内存中分配一块空间来存储数据,对于在程序执行过程中需要动态分配内存的应用来说,这是十分有用的功能。
Microchip的编译器C30(16位单片机)以及C32(32位单片机)在较新的版本中也开始实现了这个函数,这为对RAM本来有些捉襟见肘的单片机编程添加了不少灵活性。不过在实际使用过程中有几个需要注意的地方(以MPLab v8.63为例)。
1、需要告知编译器程序中将会使用动态内存分配,不然在16位的单片机中编译会出错,在32位的单片机中编译不会出错,但是在程序运行的时候,会出现malloc分配失败。
选项位于 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的空间,就不会有“预热身”的需要。