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

[复制链接]
5706|10
 楼主| winsunhy 发表于 2009-12-24 14:17 | 显示全部楼层 |阅读模式
在单片机程序中调用库函数是否很占用单片机资源啊?
   比如调用库函数stdio.h中的printf来实现串口数据的输出?具体占用多少资源怎么看?
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语言一样,可以在串口终端输出字符了。否则,还得自己配置串口,编写输出函数。
znmcu 发表于 2009-12-24 17:15 | 显示全部楼层
用了printf以后,你将不能再用串口中断了
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。不管调用多少次,基本都要增加这些资源。
mcu_lover 发表于 2009-12-24 17:58 | 显示全部楼层
学习了。
因特网用户 发表于 2009-12-24 18:11 | 显示全部楼层
printf占用资源太多了吧
hotpower 发表于 2009-12-24 19:19 | 显示全部楼层
51最好别搞这个,自己做puts也是不错的
lxyppc 发表于 2009-12-24 20:10 | 显示全部楼层
printf对于单片机来说太奢侈了
或许一个itoa就够了
mohanwei 发表于 2009-12-24 21:04 | 显示全部楼层
用少不划算,用多就划算了。如果是IAR,还可以选则库……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

249

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部