本帖最后由 guguli 于 2023-11-28 22:55 编辑
事情的起因是在调试程序时,发现串口助手打印结果有问题,最初以为是程序问题,经过仔细检查发现,程序没问题,就是跑不出想要的结果,最后询问朋友才发现是忘记在target-option选项卡中忘记勾选USE MicroLIB。 通过查阅资料得知,MicroLIB库是针对C语言编写的基于ARM嵌入式应用程序的高度优化的库,与ARMCompiler工具链附带的标准C库函数相比,MicroLIB具有明显的大小优势。使用MicroLIB,简化嵌入式开发操作,例如你用printf()函数的时候,就会从串口1输出字符串,当然也可以重定义到其他串口;使用MicroLIB会优化代码空间,但会降低某些程序的执行效率,效率换空间;Microlib不支持C++。 在启动文件中找到了关于MicroLIB的内容。如果勾选MicroLIB就将声明__initial_sp、__heap_base、__heap_limit为全局文件如果没定义MicroLIB就会启用双段存储器模式,执行__user_initial_stackheap。是否使用MicroLIB库会导致启动过程差异。启动文件里的__main函数,这个就是MicroLIB的入口地址,他会完成创建栈空间,创建堆空间,初始化用户可能用到的系统库等初始化动作,最后跳转到我们熟悉的main,当使用MicroLIB时,__main链接的是MicroLIB,当不使用MicroLIB时,__main链接的是标准库的C/C++;一旦在程序中调用printf等函数时,会让MCU进入半主机模式,进而程序会在__main位置卡死。使用C标准库(stdio.h)中的函数,例如printf()之类的函数,会进入半主机模式,发生软件异常,会导致程序无法运行。 若不使用MicLIB微库,则需添加代码退出半主机模式并重定向printf()函数。 前面说到,使用MicLIB微库优化代码空间,通过对比发现优化空间并不大。
使用MicLIB微库:
不使用MicLIB微库:
|