打印
[应用方案]

在EmBITZ中使用printf()函数解决方案

[复制链接]
2321|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lbsonggz|  楼主 | 2016-12-30 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
printf()是C语言中的一个标准输出函数,原形在stdio.h中。在一般屏幕输出时,printf()是一个非常好用的函数,但在嵌入式系统中,需要使用retarget重新定向到输出的串口完成特定字符和字符串的输出。这在Keil中不是问题,在EmBITZ中使用就碰到问题了,作者就为这个问题浪费了前后一个月的时间,包括查阅大量emIDE官方网站和EmBITZ网站。EmBITZ网站中提到了这个问题,说可能是EmBITZ 1.0和1.I中使用的5.4版本的GCC的原因,有人在编译STM32程序时碰到了这个问题,求助后也解决了,但没有给出最终的解决方案。结合作者实验,现在给出一个采用寄存器方式的解决方案。
新唐官方的Register-Direct-Access例程中需要使用串口的场合都提供了一个retarget.c重定向函数,这个函数中在Keil中使用是没有任何问题的。但在EmBITZ和emIDE可以编译通过,但在芯片中是无法运行的。解决这个问题的方法是就是,使用emIDE提供的syscall.c函数替换retarget.c函数,syscall.c函数位于emIDE下的\arm\Templates\Start_CortexM\Src目录中,把这个函数导入你的EmBITZ项目文件中(位于项目文件的Src目录),其余不需要做任何修改,就可看到数据从UART0输出了。
不直接调用syscall函数的另一个解决方法就是,修改UART.h和UART.c函数。在UART.h中增加一个字符串输出函数声明:
    void Send_String_To_PC (char *s); //add in 20161109 to prevent use of printf
在UART.c中增加一个实现函数(位于Send_Data_To_PC函数下面):
void Send_String_To_PC (char *s)
{
   while (*s)
     {
      Send_Data_To_PC(*s);   //反复调用字符输出函数输出字符串
      s++;
     }
}
然后,就可以在main.c主函数中使用printf()函数或Send_String_To_PC ()函数实现字符串的输出了。祝好运。
沙发
598330983| | 2016-12-30 16:52 | 只看该作者
Send_Data_To_PC(*s); 这个函数替代print?

使用特权

评论回复
板凳
Lbsonggz|  楼主 | 2016-12-30 17:00 | 只看该作者
加入syscalls.c(syscall是误写)后,Send_Data_To_PC(*s)可以替换printf(),也可以直接输出字符串。使用Send_Data_To_PC(*s)时,hex体积较小,但无法直接使用%d,%s等格式输出。需要输出%d,%s格式时,需要使用两个或更多个Send_Data_To_PC(*s)替代。

使用特权

评论回复
地板
墙上的咖啡| | 2016-12-30 19:14 | 只看该作者
一般自己写串口打印函数,不用这个重定向的,麻烦。

使用特权

评论回复
5
爱潜泳的鱼| | 2016-12-31 10:43 | 只看该作者
重定向的好处就是延续了c的流程,该有规律的代码的时候比较方便。自己写也是不错的

使用特权

评论回复
6
Lbsonggz|  楼主 | 2016-12-31 22:32 | 只看该作者
补充一句,在1.0和1.1版本下测试结果: 不导入syscalls文件,串口是没有输出的,即使初始化再正确都不行,上面的 字符串输出函数如果加上字符数控制也就是可以控制输出字符字数就更好了。网络上程序很多,自己加上就好。

使用特权

评论回复
7
mintspring| | 2017-1-2 15:06 | 只看该作者
没用过这些,直接是用系统的液晶屏显示。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

240

帖子

7

粉丝