在keil中使用malloc()函数来动态分配内存,返回了分配内存的首地址,但是却无法给内存赋值。同样的程序使用linux GCC编译器编译并运行没有任何问题。因此求助万能的网。经过一番查阅,原来keil中如果需要使用malloc()、calloc()、free()等函数,需要开启MicroLIB。
1、什么是MicroLIB
MicroLIB是高度优化的C标准库,主要用于采用C语言的ARM嵌入式系统的开发。和AMR编译器中的C标准库进行对比,MicroLIB库的代码量更小。
MicroLIB和C标准库的主要区别在于:
(1) MicroLIB不符合ISO C库标准,不支持某些ISO特性;
(2) MicroLIB主要为深度嵌入式系统(超小型嵌入式系统)开发的;
(3) MicroLIB进行了深度优化以压缩代码和数据量,是一个简化版的ISO C库,可能不具备ISO C库的一些功能;
(4) 无法对区域设置进行配置。缺省C区域设置是唯一可用的区域设置;
(5) 不能将main()声明为使用参数,并且不能返回内容;
(6) 虽然MicroLIB设计时是为了可以在没有嵌入式系统的环境下使用,但是也可以在任何嵌入式系统中使用;
(7) MicroLIB不支持文件I/O函数,也不支持处理宽字符或多字节的函数;
(8) 由于MicroLIB代码已经被优化到最小,部分函数的执行速度将会比ARM编译器中的C标准库更慢(MicroLIB优化主要针对的是代码量而不是执行速度);
(9) Keil MDK-ARM中即包含MicroLIB也包含C标准库。
MicroLIB函数可以执行以下操作:
(1) 创建一个可在其中执行C程序的环境。包括:
A创建一个堆栈;
B创建一个堆(如果有需要);
C初始化程序所用的库的部分组成内容。
(2)调用main()开始执行程序。
2、如何开启MicroLIB
那么如何使用MicroLIB呢?有两种方法。
(1) 在Keil MDK-ARM上进行设置。如下图所示,直接勾选“Use MicroLIB”,则在程序编译时,编译器自动加载 MicroLIB:
(2) 使用命令行选项?? library_type=microlib 据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。比如:
编译器使用MicroLIB:armcc ?? library_type=microlib
汇编程序使用MicroLIB:armasm ??library_type=microlib more.s
链接器使用MicroLIB:armlink ??library_type=microlib ?oimage.axfmain.o extra.o
3、注意事项
(1)MicroLIB和C标准库互斥,两者不能同时使用,只能2选1;
(2) 使用MicroLIB后就可以直接使用printf()往串口终端打印信息了,默认使用串口1;
(3) MicroLIB提供了一个有限的 stdio子系统,它仅支持未缓冲的 stdin、stdout和stderr。要使用高级 I/O 函数,必须自己对fputc()、fgetc()和__backspace()基本函数进行修改;
(4)MicroLIB中不支持的转换为 %lc、%ls和 %a;
(5) MicroLIB不支持与操作系统交互的所有函数,例如:abort()、exit()、atexit()、clock()、time()、system()和getenv();
参考: http://www.keil.com/arm/microlib.asp
http://blog.csdn.net/woshi_ziyu/article/details/12145473