你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L051片子使用重定向printf函数时总是报错

[复制链接]
challenge 提问时间:2018-6-14 16:11 /
STM8L051片子使用重定向printf函数时总是报错,没办法引用printf函数,不知道是什么原因,使用的是IAR编译器,总是报内存不足的错误,,求大神指导。。QQ  1564135284


1528963718.png
收藏 评论10 发布时间:2018-6-14 16:11

举报

10个回答
黑皮男 回答时间:2018-6-14 16:27:16
rom太小了,才8K,太勉强了,还是自己简单搞个字符串输出吧

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

七哥 回答时间:2018-6-14 16:50:47
本帖最后由 toofree 于 2018-6-14 16:51 编辑

FLash太小了,需要 0x3142字节空间,而你的片片只有0x009fff-0x008000=0x2000字节。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

challenge 回答时间:2018-6-14 17:21:59
toofree 发表于 2018-6-14 16:50
FLash太小了,需要 0x3142字节空间,而你的片片只有0x009fff-0x008000=0x2000字节。

是的,但是我不引用printf函数就不会报错,我的代码量并不大,只有几行,但是一调用printf就报这个错
challenge 回答时间:2018-6-14 17:25:04
toofree 发表于 2018-6-14 16:50
FLash太小了,需要 0x3142字节空间,而你的片片只有0x009fff-0x008000=0x2000字节。

我觉得是引用printf函数造成的
#ifdef _RAISONANCE_
#define PUTCHAR_PROTOTYPE int putchar(char c)
#define GETCHAR_PROTOTYPE int getchar(void)
#elif defined (_COSMIC_)
#define PUTCHAR_PROTOTYPE char putchar(char c)
#define GETCHAR_PROTOTYPE char getchar(void)
#else /* _IAR_ */
#define PUTCHAR_PROTOTYPE int putchar(int c)
#define GETCHAR_PROTOTYPE int getchar(void)
#endif /* _RAISONANCE_ */


//重定向printf和getchar函数

PUTCHAR_PROTOTYPE
{
/* Write a character to the USART */
USART_SendData8(USART1, c);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)== RESET);
return(c);
}
GETCHAR_PROTOTYPE
{
int c = 0;
/* Loop until the Read data register flag is SET */
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)== RESET);
c = USART_ReceiveData8(USART1);
return(c);
}
但是我重定向了啊,不知道是什么原因造成不能引用
challenge 回答时间:2018-6-14 17:26:47
我觉得是引用printf函数造成的
#ifdef _RAISONANCE_
#define PUTCHAR_PROTOTYPE int putchar(char c)
#define GETCHAR_PROTOTYPE int getchar(void)
#elif defined (_COSMIC_)
#define PUTCHAR_PROTOTYPE char putchar(char c)
#define GETCHAR_PROTOTYPE char getchar(void)
#else /* _IAR_ */
#define PUTCHAR_PROTOTYPE int putchar(int c)
#define GETCHAR_PROTOTYPE int getchar(void)
#endif /* _RAISONANCE_ */


//重定向printf和getchar函数

PUTCHAR_PROTOTYPE
{
/* Write a character to the USART */
USART_SendData8(USART1, c);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)== RESET);
return(c);
}
GETCHAR_PROTOTYPE
{
int c = 0;
/* Loop until the Read data register flag is SET */
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)== RESET);
c = USART_ReceiveData8(USART1);
return(c);
}
但是我重定向了啊,不知道是什么原因造成不能引用
七哥 回答时间:2018-6-14 17:32:33
本帖最后由 toofree 于 2018-6-14 17:33 编辑
vainest 发表于 2018-6-14 17:25
我觉得是引用printf函数造成的
#ifdef _RAISONANCE_
#define PUTCHAR_PROTOTYPE int putchar(char c)

重定向,不会减小printf的开销,因为printf功能比较多,那怕你用一条printf,它的原函数也一样要全部编译进来。
要想减小空间占用,只能自己写个简单的类似printf的函数。
根本原因是MCU的程序空间太小,你换个大一点的,就能成功。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

challenge 回答时间:2018-6-14 17:35:13
toofree 发表于 2018-6-14 17:32
重定向,不会减小printf的开销,因为printf功能比较多,那怕你用一条printf,它的原函数也一样要全部编译 ...

http://mp.weixin.qq.com/s?__biz= ... =21#wechat_redirect

但是我是按照这个来实现的,为什么他是可以的呢
challenge 回答时间:2018-6-14 17:38:46
toofree 发表于 2018-6-14 17:32
重定向,不会减小printf的开销,因为printf功能比较多,那怕你用一条printf,它的原函数也一样要全部编译 ...

https://www.stmcu.org.cn/module/forum/thread-615996-1-1.html
但是我是参照这个例程实现的,为什么他这个可以呢
feixiang20 回答时间:2018-6-15 01:02:52
看来你已经参考了【STM8L151在STVD/IAR下重定向printf函数】
还是要检查头文件
另外可参考【STM8S单片机printf函数重定向到串口】【IAR for STM8重定向printf 】
需要配置USART并使能它
challenge 回答时间:2018-6-15 11:18:14
feixiang20 发表于 2018-6-15 01:02
看来你已经参考了【STM8L151在STVD/IAR下重定向printf函数】
还是要检查头文件
另外可参考【STM8S单片机pri ...

我认为是IAR设置的问题,但是我不知道如何能够设置正确
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版