OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14341|回复: 14

mdk中printf函数使用的一点理解

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-19
在线时间
0 小时
发表于 2014-12-31 18:11:24 | 显示全部楼层 |阅读模式
看了原子哥的usart部分printf函数重定向的问题,自己动手试了试,单片机可以通过串口打印信息,printf函数重定向后使用十分方便。
起初我的困惑是什么是半主机,什么是重定向。
我的理解是半主机模式需借助仿真器连接电脑,我们要做的是去掉仿真器,使开发板独立运行,把printf函数的结果输出
单片机的外设外设如串口,lcd,sd卡。

标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 
因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法:   
方法1.使用微库,因为使用微库的话,不会使用半主机模式.   
方法2.仍然使用标准库,在主程序添加下面代码:
#pragma import(__use_no_semihosting) 
struct __FILE 

int handle; 
}; 
FILE __stdout;       
_sys_exit(int x) 

x = x; 

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//???··???,?±??·????ê±?   
    USART1->DR = (u8) ch;      
return ch;
}

下面是我做的几个测试,结果很让人费解。
num1、

[mw_shl_code=c,true] #include "stdio.h" int main(void) { while(1) { printf("OK"); printf("OK"); } }[/mw_shl_code]
没有使用微库,程序编译无误,连接仿真器仿真,程序一直停在swi中断处。如图


num2、
程序同上,启用微库,结果如图:


程序顺利执行,但不知道结果打印到哪里去了。
num3、
[mw_shl_code=c,true] #include "stdio.h" int main(void) { uart_init(9600); while(1) { printf("OK"); printf("OK"); } }[/mw_shl_code]
usart部分使用的是原子哥的程序,程序正常执行,串口软件接收正确。
num4、
在num3的基础上注释#pragma import(__use_no_semihosting)  
结果与上面一样。
num3和num4的对比结果表明只要重定义fputc函数,printf函数即可正常使用,与使用禁用半主机模式无关。           

下面写写我查的资料。
首先解释什么是半主机。
---参考   RealView 编译工具开发指南   8.1.1. 什么是半主机?
   RealView 编译工具开发指南我已上传,大家可以下载研究研究。
  
半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。

这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。

半主机是通过一组定义好的软件指令(如 SVC)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。 调试代理提供与主机之间的必需通信。

半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator® ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作。

标准库使用半主机模式,半主机是通过一组定义好的软件指令 (如 SVC)SVC 指令 (以前称为 SWI 指令)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。调试代理(这里的调试代理是仿真器)提供与主机之间的必需通信。也就是说使用半主机模式必须使用仿真器调试。

 ARMv7 之前的 ARM 处理器使用 SVC 指令 (以前称为 SWI 指令)进行半主机调

用。 但是,如果要为 ARMv6-M 或 ARMv7-M (如 Cortex?-M1 或 Cortex-M3 处

理器)进行编译,请使用 BKPT 指令来实现半主机。
简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。和半主机模式功能相同的是ITM调试机制。
有关ITM调试机制可以参考这里http://www.douban.com/note/248637026/
库函数的内容被屏蔽,这使得要彻底弄清楚一个问题很难。
我看到的资料没有人使用过半主机模式,几乎所有的程序都禁用了半主机模式,以至于我不知道半主机模式正确的使用方式,它的意义又在哪里,


网上可以找到的资料内容基本相同,只给出解决办法和很浅显的解释。
按着正确的步骤的确可以得出正确的结果,但如果加以改动,仍然得出正确的结果,这其中的原因是什么?
大部分人只满足于会使用,或者不会使用,然后查阅资料,按部就班,得出正确的结果,然后就沾沾自喜,
仔细想想,我们学会的到底是什么呢,不过是机械似的步骤,我们真的学到知识了吗?确切的说我们在盗用别人的
结果,并且乐此不疲的重复同一件事情,从来不思考为什么,我想这也就是为什么牛顿被苹果砸到后能提出万有
引力,其他人被砸后无动于衷。
最好的资料是官方给出的使用手册,手册太厚,看完不容易,看懂不容易,我自己尝试着看了一部分,很花时间。
官方的资料是最权威的,最具体的,但缺点是叙述的太繁琐,很难产生让人看下去的欲望,这也阻碍了相关知识
的普及。我想官方应该尝试着给出更易懂的资料和解决问题最快的路径以及更加有针对性的解决大家使用过程中
产生的问题。
做技术的不容易,能在技术路上走的很远的都是勇士!

RealView编译工具开发指南.pdf

967.71 KB, 下载次数: 646

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
834
金钱
834
注册时间
2015-6-11
在线时间
119 小时
发表于 2015-6-24 10:26:35 | 显示全部楼层
"做技术的不容易,能在技术路上走的很远的都是勇士!"
“做技术的不容易,能在技术路上走的很远的都是勇士!”
“做技术的不容易,能在技术路上走的很远的都是勇士!”
——————————————————回响不断于耳a!
回复 支持 2 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-12-31 23:25:52 | 显示全部楼层
谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

190

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1184
金钱
1184
注册时间
2013-4-3
在线时间
222 小时
发表于 2014-12-31 23:39:23 | 显示全部楼层
赞一个............
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-19
在线时间
0 小时
 楼主| 发表于 2015-1-1 15:48:30 | 显示全部楼层
原子哥回复了,好激动。。。
回复 支持 反对

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-3
在线时间
26 小时
发表于 2015-5-27 13:06:03 | 显示全部楼层
赞一个。。。。。。。。。。。。。。。。。。
总有人是要赢的,那为什么不是我呢?
博客: http://mindthink.me
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-3-4
在线时间
36 小时
发表于 2016-3-18 10:23:26 | 显示全部楼层
赞赞赞·······
按着正确的步骤的确可以得出正确的结果,但如果加以改动,仍然得出正确的结果,这其中的原因是什么?
大部分人只满足于会使用,或者不会使用,然后查阅资料,按部就班,得出正确的结果,然后就沾沾自喜,
仔细想想,我们学会的到底是什么呢,不过是机械似的步骤,我们真的学到知识了吗?确切的说我们在盗用别人的
结果,并且乐此不疲的重复同一件事情,从来不思考为什么,我想这也就是为什么牛顿被苹果砸到后能提出万有
引力,其他人被砸后无动于衷。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-3-18
在线时间
8 小时
发表于 2016-3-18 11:04:01 | 显示全部楼层
学习到很多东西,很喜欢这种求根问底的态度
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-4-10
在线时间
26 小时
发表于 2016-5-9 23:10:28 | 显示全部楼层
虽然 没看懂 但是稍微知道了一点半主机模式  加油楼主
“做技术的不容易,能在技术路上走的很远的都是勇士!”看到一篇帖子这样说
回复 支持 反对

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-7-13
在线时间
14 小时
发表于 2017-8-4 17:32:28 | 显示全部楼层
我怎么按照你这个 解决不了的 你是怎么弄的
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-20
在线时间
20 小时
发表于 2017-9-6 13:47:17 | 显示全部楼层
MDK help. Indirect semihosting C library function dependencies
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-20
在线时间
20 小时
发表于 2017-9-6 13:47:49 | 显示全部楼层
有关ITM调试机制可以参考这里http://www.douban.com/note/248637026/
库函数的内容被屏蔽,这使得要彻底弄清楚一个问题很难。
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-20
在线时间
20 小时
发表于 2017-9-6 13:48:57 | 显示全部楼层
为什么
3. 综合版本使用scanf和printf
3.1 添加retarget文件
将如下代码保存成retarget.c,然后加入到工程中。
编译不通
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-20
在线时间
20 小时
发表于 2017-9-6 13:49:50 | 显示全部楼层
为什么
3. 综合版本使用scanf和printf
3.1 添加retarget文件
将如下代码保存成retarget.c,然后加入到工程中。
编译不通
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-11-9
在线时间
18 小时
发表于 2019-11-5 14:11:36 | 显示全部楼层
真的勇士 ,点赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 03:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表