OpenEdv-开源电子网

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

关于usart.c里对printf的支持部分

[复制链接]

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
发表于 2013-2-20 23:41:27 | 显示全部楼层 |阅读模式
在这一段程序里
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                
struct __FILE
{
    int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
    x = x;
}
_ttywrch(int ch)
{
    ch=ch;
}

//重定义fputc函数
int fputc(int ch, FILE *f)
{     
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  
    USART1->DR = (u8) ch;     
    return ch;
}
#endif
以上红色部分是我自己加的不知道对不对,反正编译是通过了。如果不加的话编译出现如下错误提示,
..\OBJ\main.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

而错误出现是在向工程添加fatfs并在主函数中调用其中的函数后出现(之前没遇到过),去掉fatfs相关函数调用后不加上面的红字部分编译也没问题,于是请教一下,红字部分有没有问题,需不需要加上。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-2-27
在线时间
0 小时
发表于 2014-10-31 10:00:28 | 显示全部楼层
这个是因为原子程序为了实现ARM能调用输出函数,把fputc重新定向到ARM的串口了(在标准C库里,printf 和scanf是被默认定向到显示器的),禁止使用半主机模式,就是在link的时候不调用标准C库的函数,但是可能由于在自己的子C文件中用到了某个函数,由于自己没有重定义,它就会去标准库里调用,这样就造成了矛盾,一边禁止使用半主机模式,一遍去C库里调用函数。所以会报错,这是我自己的理解,可能局部有说的不合适的地方,但是大概原理就是这个样子的。回复【3楼】正点原子:
---------------------------------
文可提笔控萝莉,武能床头定人妻,进可欺身压正太,退能提臀迎众基
回复 支持 1 反对 0

使用道具 举报

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
 楼主| 发表于 2013-2-20 23:44:57 | 显示全部楼层
今天被这个问题纠结了一晚上额。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
 楼主| 发表于 2013-2-21 00:05:03 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
之前也从没遇到过,这次不知道怎么就奇葩了。。
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-2-21 15:29:11 | 显示全部楼层
你可以把 Retarget.c 添加到你的工程里, 就可以了。

D:\Program Files\Keil\ARM\Startup\

然后只重载
extern int  sendchar(int ch);  /* in Serial.c */
extern int  getkey(void);      /* in Serial.c */
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
发表于 2013-7-15 17:20:32 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
发表于 2013-9-27 17:19:10 | 显示全部楼层
回复【楼主位】xijiele:
---------------------------------
楼主 你这个问题是怎么解决的呢  我现在一直的freemodbus也遇到了这种情况 和你的错误是一模一样 

我的freemodbus不能使用MicLib  所以不能重载隔天 getkey()之类的 所以只能用这种方法 
你加上这个函数后 printf好用吗?
谢谢。
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-28 14:06:35 | 显示全部楼层
#program为什么在IAR里会报警告?
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-4
在线时间
13 小时
发表于 2014-9-29 20:49:35 | 显示全部楼层
回复【5楼】aleda303:
---------------------------------
好像有戏  谢谢
回复 支持 反对

使用道具 举报

8

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-2-27
在线时间
0 小时
发表于 2014-10-31 10:00:48 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我觉得应该就是这个样子,原子哥。
文可提笔控萝莉,武能床头定人妻,进可欺身压正太,退能提臀迎众基
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-1-21
在线时间
20 小时
发表于 2016-6-2 10:37:44 | 显示全部楼层
mark一下
回复 支持 反对

使用道具 举报

19

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2016-6-8
在线时间
47 小时
发表于 2016-7-25 10:32:12 | 显示全部楼层
aleda303 发表于 2013-2-21 15:29
你可以把 Retarget.c 添加到你的工程里, 就可以了。

D:\Program Files\Keil\ARM\S ...

我的工程里添加Retarget.c后,又报了一些错误,还得再找找
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-8-10
在线时间
5 小时
发表于 2019-11-7 09:57:34 | 显示全部楼层
正点原子 发表于 2013-2-20 23:59
没遇到过
我的不加也没出问题.

原子哥,要是不使用usart.c为何不能正常运行,需要调状态下,多次run才能进入主函数
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-8-4
在线时间
24 小时
发表于 2020-5-10 23:11:37 | 显示全部楼层
liucongwoshi 发表于 2014-10-31 10:00
这个是因为原子程序为了实现ARM能调用输出函数,把fputc重新定向到ARM的串口了(在标准C库里,printf  ...

这个解释应该是正确的,我是因为调用了<stdlib.h>中的malloc函数,编译后导致了此错误。感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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