一、简介
microlib中是用C写的时候相比,包括ARM编译器工具链的标准C库的基于ARM的嵌入式应用提供了高度优化的库,microlib中提供所需的许多嵌入式系统显著代码大小的优点。
二 、
microlib中和标准C库之间的主要区别是:
microlib中是专为深度嵌入式应用。
microlib中被优化使用比使用ARM标准库更少的代码和数据存储器。
microlib中已经设计没有操作系统的工作,但是这并不妨碍它被与任何操作系统或RTOS如Keil RTX一起使用。
microlib中不包含任何文件I/ O或宽字符支持。
由于microlib中进行了优化,以尽量减少代码大小,一些功能将会比ARM编译工具提供了标准C库函数更慢执行。
microlib中双方和ARM标准库都包含在Keil MDK-ARM。
三、 存在问题
本人有过经历在做串口 接收大量数据时,选择微型库,接收到几百K的数据,就会出现问题,仿真时发现,程序跑飞了,但是一样的代码 ,在不选择微型库时,又完好,能接收7,8百K 的字节数据,所以个人感觉,这个库因为是进行了优化,而引发的错误。
四 、编译出现问题。
首先
use microlib, 使用printf的时候不需要重映像使用。不选 use microlib 时,需要重映射
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
如果在
不选
use microlib 时,出现了某个错误时,
首先添加 #include <stdlib.h> 和 include "string.h",如果还不能解决 ,把下面的注销掉就好,这在 原子 历程里面经常用(如红色字体部分)
#if 1
// #pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
// #pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif