如何在MDK环境下使用printf以及使用vsprintf
来源:互联网 发布:淘宝淘抢购有小二吗 编辑:程序博客网 时间:2024/05/21 14:47
原文地址::http://blog.csdn.net/vincent_fang/article/details/41348781
相关文章
1、STM32+Keil 如何使用printf函数?----STM32+Keil 如何使用printf函数? STM32+Keil 如何使用printf函数?
2、mdk中printf函数使用的一点理解----http://www.openedv.com/posts/list/44609.htm
3、STM32 MDK工程中使用printf----http://www.cnblogs.com/zyqgold/archive/2013/05/20/3088416.html
这一年来一直在用STM32以及LPC17XX系列,自然而然也一直在使用MDK环境。在使用串口调试过程中,越发觉得下位机的串口输出函数没有C语言库中的printf好用。于是就去查找学习了下如何将printf函数给引进过来。此文目的于此-----总结记录。
首先使用printf函数,代码如下:
#include "stdio.h"
解释下:
想要在MDK中使用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式),标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数。所以需要将printf需要调用的fput里面的输出指向串口(重定向)。
另外printf之类的函数,使用了半主机模式。使员工标准库会导致程序无法运行,解决方法有2个:
方法1.使用微库,因为使用微库的话,不会使用半主机模式。
方法2.添加一段代码
semihosting的作用,介绍如下
Semihosting is a mechanism for ARM targets to communicate input/outputrequests from application code to a host computer running a debugger. This mechanismcould be used, for example, to allow functions in the C library, such as printf() andscanf(), to use the screen and keyboard of the host rather than having a screenand keyboard on the target system.
This is useful because development hardware often does not have all the inputand output facilities of the final system. Semihosting allows the host computer toprovide these facilities.
Semihosting is implemented by a set of defined software interrupt (SWI)operations.
The application invokes the appropriate SWI and the debug agent then handlesthe SWI exception. The debug agent provides the required communication with thehost.
In many cases, the semihosting SWI will be invoked by code within libraryfunctions. The application can also invoke the semihosting SWI directly. Referto the C library descriptions in the ADS Compilers and Libraries Guide for moreinformation on support for semihosting in the ARM C library.
按我的理解,这个模式是用来调试的,通过仿真器,使用主机的输入输出代替单片机自己的,也就是说即便单片机没有输出口也能printf到电脑上。反过来,由于这个模式更改了printf()等的实现方式,输入输出就不走单片机的外设了,所以只重定义fputc不起作用。
用代码关闭此模式后,需要同时更新一下__stdout 和__stdin 的定义,所以有后面的语句。
以上仅为个人理解,如有错误请指正。
另外,勾选microlib之后,也许编译的时候就不把开启semihosting的文件包进去了,所以没事。
以上方法就成功的将printf引进过来直接调用了,但是个人觉得还是比较麻烦,比如在STM32和LPC环境下就必须更改底层串口接口寄存器。如此就引来了另外一个C标准库函数vsprintf()。
函数名: vsprintf
功 能: 送格式化输出到串中
用 法: int vsprintf(char *string, char *format, va_list param);
代码如下:
VA_LIST的用法( VA_LIST 是在C语言中解决变参问题的一组宏):
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。(如在运行VA_START(ap,v)以后,ap指向第一个可变参数在堆栈的地址。)
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。
如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
vsprintf的功能就是将为止大小的输入进行重组,之后使用串口输出,底层还是运用单片机的串口输出函数。
综上所诉,个人更倾向于使用vsprintf进行修改,方便快捷。
- 如何在MDK环境下使用printf以及使用vsprintf
- 如何在MDK环境下使用printf以及使用vsprintf
- Keil MDK环境下使用printf函数的解决方法
- 在MDK中使用printf及串口
- 在MDK环境下使用分散加载描述文件
- 在Keil MDK编译环境下使用UEstudio编写程序
- printf、sprintf、vsprintf的使用取舍
- printf、sprintf、vsprintf和wvsprintf的使用
- STM32 DAC调试及在mdk中使用printf
- MDK环境下stm32实现printf函数
- stm32在keil编译环境下使用printf函数
- 在MDK下使用C++进不去中断
- 如何在MAC环境下(Xcode)使用svn,以及新手在团队使用svn注意事项
- 如何在MAC环境下(Xcode)使用svn,以及新手在团队使用svn注意事项
- 转:在Keil MDK环境下使用STM32 V3.4库“小”教程
- 在MDK环境下使用STM32F10x_StdPeriph_Lib_V3.5.0库创建工程教程
- STM32 MDK工程中使用printf
- 如何使用vsprintf, vsnprintf等函数
- dom4j对xml字符串的操作
- localStorage和sessionStorage使用总结
- 1058. A+B in Hogwarts (20)-PAT甲级
- Maven项目中使用本地JAR包
- 逆向工程核心原理学习笔记(一):寻找程序的主函数(Main)
- 如何在MDK环境下使用printf以及使用vsprintf
- (31):用实力域代替序数
- Ubuntu 搭建gitlab服务器之二
- gmic 2017北京大会嘉宾信息提前看 明星科学家都在这里
- 浅谈MVC、MVP、 MVVM
- oracle查询表空间大小很缓慢
- 从马尔科夫链到吉布斯采样与PageRank
- Aneka:从企业网格到面向市场的云计算
- 如何给Activity设置成透明Style