打印

在单片机程序中调用库函数是否很占用单片机资源啊?

[复制链接]
4658|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
winsunhy|  楼主 | 2009-12-24 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
znmcu| | 2009-12-24 14:25 | 只看该作者
建议慎重用printf,占资源不说,用不好,会出现一些怪的现象
自己写一个串口函数就好

使用特权

评论回复
板凳
leolle| | 2009-12-24 16:48 | 只看该作者
为何要用PRINTF这个函数?

使用特权

评论回复
地板
winsunhy|  楼主 | 2009-12-24 17:10 | 只看该作者
为何要用PRINTF这个函数?
leolle 发表于 2009-12-24 16:48

简单啊,直接包含个头文件,然后就跟以前使用C语言一样,可以在串口终端输出字符了。否则,还得自己配置串口,编写输出函数。

使用特权

评论回复
5
znmcu| | 2009-12-24 17:15 | 只看该作者
用了printf以后,你将不能再用串口中断了

使用特权

评论回复
6
mohanwei| | 2009-12-24 17:30 | 只看该作者
用printf一样可以用串口中断的,只需自己改一下putchar即可:
以前发的:
第一步,改造putchar函数,把TI简单替换成Uart0_Send_Ready:
unsigned char Uart0_Send_Ready;//这个是中断方式使用printf的关键
/*
* putchar (basic version): expands '\n' into CR LF
*/
char putchar (char c)
{
    LED_TXD = light;//点亮发送指示灯
    if (c == '\n')
    {
        while (!Uart0_Send_Ready)
            ;
        Uart0_Send_Ready = 0;
        SBUF0 = 0x0d;                         /* output CR  */
    }
    while (!Uart0_Send_Ready)
        ;
    Uart0_Send_Ready = 0;
    return (SBUF0 = c);
}

第二步,在串口中断里,把TI的值传递给Uart0_Send_Ready:
void Uart0_Int(void) interrupt 4
{
    char ch;
    if(TI)
    {
        Uart0_Send_Ready=1;//把TI的值传递给Uart0_Send_Ready
        TI=0;//清TI
    }
    if(RI)
    {
        RI=0;
        ch = SBUF0;
        LED_RXD = light;//点亮接收LED
        //干该干的事……
    }
}

这样,printf就工作在中断方式下了,跟串行接收中断没有冲突。
实际项目中我还用了单工的RS485总线(那样还要继续改造putchar,主要是485的换向)……
适当改造一下putchar,还可以把printf的输出重定向到某个I/O口,LCD……编程就跟上位机一样方便。

记得printf和sprintf共用了解析模块,对于51,大概1K字节Flash,20多Byte的RAM。不管调用多少次,基本都要增加这些资源。

使用特权

评论回复
7
mcu_lover| | 2009-12-24 17:58 | 只看该作者
学习了。

使用特权

评论回复
8
因特网用户| | 2009-12-24 18:11 | 只看该作者
printf占用资源太多了吧

使用特权

评论回复
9
hotpower| | 2009-12-24 19:19 | 只看该作者
51最好别搞这个,自己做puts也是不错的

使用特权

评论回复
10
lxyppc| | 2009-12-24 20:10 | 只看该作者
printf对于单片机来说太奢侈了
或许一个itoa就够了

使用特权

评论回复
11
mohanwei| | 2009-12-24 21:04 | 只看该作者
用少不划算,用多就划算了。如果是IAR,还可以选则库……

使用特权

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

本版积分规则

32

主题

248

帖子

0

粉丝