1.选上”Use MicroLIB”这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1

2.microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。

    这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。 

    microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。 

    microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。

   microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()

与缺省 C 库之间的差异

microlib 与缺省 C 库之间的主要差异是:

  • microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。

  • microlib 不符合 IEEE 754 二进制浮点算法标准。

  • microlib 进行了高度优化以使代码变得很小。

  • 无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。

  • 不能将 main() 声明为使用参数,并且不能返回内容。

  • 不支持 stdio,但未缓冲的 stdinstdout 和 stderr 除外。

  • microlib 对 C99 函数提供有限的支持。

  • microlib 不支持操作系统函数。

  • microlib 不支持与位置无关的代码。

  • microlib 不提供互斥锁来防止非线程安全的代码。

  • microlib 不支持宽字符或多字节字符串。

  • 与 stdlib 不同,microlib 不支持可选择的单或双区内存模型。 microlib 只提供双区内存模型,即单独的堆栈和堆区。

  • 可以合理地将 microlib 与 --fpmode=std 或 --fpmode=fast 配合使用。

microlib 中的函数负责:

  • 创建一个可在其中执行 C 程序的环境。 这包括:

    • 创建一个堆栈

    • 创建一个堆(如果需要)

    • 初始化程序所用的库的部分组成内容。

  • 调用 main() 以开始执行程序。

要使用 microlib 构建程序,必须使用命令行选项 ??library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项。

半主机是这么一种机制,它使得在ARM目标上跑的代码,如果主机电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备。 

  这点非常重要,因为开发初期,可能开发者根本不知道该 ARM 器件上有什么输入输出设备,而半主基机制使得你不用知道ARM器件的外设,利用主机电脑的外设就可以实现输入输出调试。 
  所以要利用目标 ARM器件的输入输出设备,首先要关掉半主机机制。然后再将输入输出重定向到 ARM 器件上,如 printf 和 scanf,你需要重写 fputc和 fgetc 函数。下面就是将 scanf 和 printf 重定向到 uart 的代码。
 

int fputc(int ch, FILE *f)
{ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } USART_SendData(USART1, (uint8_t) ch); return ch;
} int fgetc(FILE *f)
{ int ch; while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { } ch = USART_ReceiveData(USART1); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } USART_SendData(USART1, (uint8_t) ch); return ch;
}

printf() 之类的函数,使用了半主机模式。使用标准库会导致程序无法运行 ,以下是解决方法 :

方法 1.使用微库 ,因为使用微库的话 ,不会使用半主机模式 .
如果使用的是 MDK,请在工程属性的 “Target “- 》”Code Generation “中勾选 ”Use MicroLIB “这样以后就可以
使用 printf ,sprintf 函数了

方法 2.仍然使用标准库 ,在主程序添加下面代码 :
/*为确保没有从 C 库链接使用半主机的函数,因为不使用半主机,标准 C 库 stdio.h 中有些使用半主机的
函数要重新写 ,您必须为这些函数提供自己的实现 */

#pragma import(__use_no_semihosting)  // 确保没有从 C 库链接使用半主机的函数
_sys_exit(int  x) //定义 _sys_exit() 以避免使用半主机模式
{
x = x;
}
struct __FILE  // 标准库需要的支持函数
{
int handle;
};
/* FILE is typedef ’ d in stdio.h. */
FILE __stdout;

在独立应用程序中,您不太可能支持半主机操作。

因此,必须确保您的应用程序中没有链接 C 库半主机函数。

为确保没有从 C 库链接使用半主机的函数, 必须导入符号 __use_no_semihosting 。可在您工程的任何 C 或汇编语言源文件中执行此操作,如下所示:

在 C 模块中,使用 #pragma 指令:

#pragma import(__use_no_semihosting)

在汇编语言模块中,使用 IMPORT 指令:

IMPORT __use_no_semihosting

如果仍然链接了使用半主机的函数,则链接器会报告错误。

1.在嵌入式程序编译时如果出现printf、fopen、fclose等文件操作,因程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,

这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中:

//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)        //注释本行, 方法1
//标准库需要的支持函数
struct __FILE
{
int handle;  };  FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
} /***************************增加下面这个函数*****************************/
//__use_no_semihosting was requested, but _ttywrch was     // 增加此函数, 方法2
_ttywrch(int ch)
{ch = ch;
}
/***************************增加上面这个函数*****************************///重定义fputc函数
int fputc(int ch, FILE *f)
{
#ifdef COM_EX
com_snd(COM2, 1, (unsigned char*)&ch);
#else
com_snd(COM1, 1, (unsigned char*)&ch);
#endif
return ch;
}
#endif  /*使用microLib的方法,在keil里面要勾选“Use MicroLIB”*/
// 以便使用 printf 函数
// #define UTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
// UTCHAR_PROTOTYPE
// {
// #ifdef COM_EX
//  com_snd(COM2, 1, (unsigned char*)&ch);
// #else
//  com_snd(COM1, 1, (unsigned char*)&ch);
// #endif
//
//  return ch;
// }
我试了试确实是可以,不知道,如果不用Use MicroLIB,prinft 和sprintf  其他影响不

__use_no_semihosting_swi,即不使用半主机模式,防止程序进入软件中断。

         若出现如下编译错误:Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _ttywrch was referenced,

        此时你只需重写_ttywrch 函数即可         void _ttywrch(int ch){}。

2.__use_no_semihosting_swi     也常用于对printf的重定向,通常是重定向到串口输出,这时只需在1中的重写函数中加入:

int fputc(int ch, FILE *f)
{
uart_send_char(ch);//你的串口发送字符函数  
return ch;
}

这样即可。

你这个代码明显是从控制台程序直接搬过来的,显然你并不知道PC程序和单片机程序在开发上的区别.
不过没关系,我给你说怎么改,很简单.
首先,为了你的scanf,去定义FILE __stdin;在你的usart.c中
然后自己实现C库的文件系统函数,有以下几个:fopen,fclose,exit,fread,fwrite,fseek,fprintf,你自己的函数不能和C库函数重名.
我给你定义了宏,带替对应的C库函数,就可以编译通过了
#define my_fopen(a,b)                 0
#define my_fclose(a)                0
#define my_exit(a)                        while(1)
#define my_fprintf(a,b,...)        0
#define my_fread(a,b,c,d)        0
#define my_fwrite(a,b,c,d)        0
#define my_fseek(a,b,c)                0

KeilMDK配置项中Use MicroLIB相关推荐

  1. Vue中的methods配置项中的箭头函数this指向及相关源码分析

    之前在使用Vue时遇到一个问题,我们知道在Vue的methods中定义函数时,要想使用到Vue实例或者组件实例的this时,我们就不能使用箭头函数定义方法,因为箭头函数中的this是在函数定义时生成的 ...

  2. ajax请求type种类,ajax配置项中的type与method

    1. jQuery中ajax配置项中的使用type与method的区别 本质上两个配置项是没有区别的,区别在于两者出现的时间不同,type对于目前jQuery的版本全部兼容,也就是说 $.ajax({ ...

  3. Spring cloud系列之Zuul配置项中sensitiveHeaders和ignoredHeaders

    sensitiveHeaders:会过滤客户端请求中的和该配置项匹配的headers 比如: zuul: sensitiveHeaders: X-ABC 如果客户端在发请求是带了X-ABC,那么X-A ...

  4. KEIL中USB Microlib作用

    1.选上"Use MicroLIB"这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1 2.microlib 是缺省 C ...

  5. 如何在KEIL中使用MicroLIB

    MicroLIB 在keil 建立ARM的工程时其中有一项是选 use MicroLIB microlib 是缺省 C 库的备选库. 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用. 这些 ...

  6. SpringCloud工作笔记034---Zuul配置项中sensitiveHeaders和ignoredHeaders的不同

    记录一下: JAVA技术交流QQ群:170933152 sensitiveHeaders会过滤客户端附带的headers 例如: sensitiveHeaders: X-ABC 如果客户端在发请求是带 ...

  7. 2、redis.conf基本配置项说明

    Redis的配置项看起来比较复杂,分析之下,其实可以分为几大类(以redis v2.6.14版本的redis.conf为例):          1) 基本配置项          2) 持久化(Pe ...

  8. 图文解说nginx中server的匹配顺序

    在开始处理一个http请求时,nginx会取出header头中的host,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求. ...

  9. php stortime,文件存储 - Laravel 5.8 中文文档手册 - php中文网手册

    文件存储 简介 Laravel 提供了一个强大的文件系统抽象,这得益于 Frank de Jonge 强大的 Flysystem 扩展包.Laravel 文件系统集成为使用本地文件系统.Amazon ...

最新文章

  1. HDU 1426(数独)
  2. 基于Redis的单点登录
  3. 剖析入侵技术 嗅探软件了解
  4. 一个致命的 Redis 命令,导致公司损失 400 万
  5. js 日期星期 带农历
  6. java判断long 大于0_JAVA的一道习题:找出五个大于Long.MAX_VALUE的素数
  7. 前端性能优化—回流与重绘
  8. android开发标签栏应该设置多少,Android开发笔记(十九)底部标签栏TabBar
  9. 解析小型机、大型机和PC服务器间的差别
  10. http 错误 404 - 文件或目录未找到.php,IIS不支持ASP,HTTP 错误 404 – 文件或目录未找到的解决办法...
  11. 前台中文传参后台乱码解决方案
  12. win10微软图标点击无反应_win10系统任务栏开始菜单等系统图标点击无反应的解决方法...
  13. 线性代数(2)行列式6种运算性质
  14. tableau高级绘图(四)-tableau绘制蜡烛图
  15. Android中EditText控件的Ime Options属性
  16. 修改 Tomcat 默认首页
  17. 内推 | 数据开发——江小白
  18. @Value中#和$的用法
  19. Matlab: 修改编码方式, 如GBK->UTF-8
  20. 应届毕业生找工作的心路历程

热门文章

  1. 惠普计算机为什么有时无法引导,教你惠普无法开机重装win10
  2. 实用的JS正则表达式 (正数正则、IP正则、邮编正则等)
  3. Win11任务栏隐藏显示后怎么重新显示操作教学
  4. apache模块载入命令_Apache动态加载模块实例讲解
  5. VMware View(五)——添加并配置虚拟桌面资源池
  6. django 浅谈索引
  7. PLMN各种类型的含义及说明
  8. stm32主从定时器pwm脉冲频率数量精确输出
  9. 微模块动环检测(动环监控模块)
  10. stm32—洋桃一号开发板U盘测试相关问题