如何让keil 支持malloc()、calloc()、free() —— MicroLIB 简介和使用

        在keil中使用malloc()函数来动态分配内存,返回了分配内存的首地址,但是却无法给内存赋值。同样的程序使用linux GCC编译器编译并运行没有任何问题。因此求助万能的网。经过一番查阅,原来keil中如果需要使用malloc()calloc()free()等函数,需要开启MicroLIB


1、什么是MicroLIB

       MicroLIB是高度优化的C标准库,主要用于采用C语言的ARM嵌入式系统的开发。和AMR编译器中的C标准库进行对比,MicroLIB库的代码量更小。

如何让keil 支持malloc()、calloc()、free() —— MicroLIB 简介和使用_第1张图片

       MicroLIBC标准库的主要区别在于:

       (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

如何让keil 支持malloc()、calloc()、free() —— MicroLIB 简介和使用_第2张图片

       (2) 使用命令行选项?? library_type=microlib 据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。比如:

        编译器使用MicroLIBarmcc ?? library_type=microlib  

        汇编程序使用MicroLIBarmasm ??library_type=microlib more.s

       链接器使用MicroLIBarmlink ??library_type=microlib ?oimage.axfmain.o extra.o


3、注意事项

       (1)MicroLIBC标准库互斥,两者不能同时使用,只能21

       (2) 使用MicroLIB后就可以直接使用printf()往串口终端打印信息了,默认使用串口1

       (3) MicroLIB提供了一个有限的 stdio子系统,它仅支持未缓冲的 stdinstdoutstderr。要使用高级 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



你可能感兴趣的:(【STM32】)