历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2021年03月17日 | ARM中打印函数print 的几种实现方法

2021-03-17 来源:eefocus

1利用C库函数printf。


步骤:


1)首先需要包含头文件stdio.h。


2)然后定义文件句柄。实际上就是一个int型变量封装在结构体中。


struct__FILE{inthandle;};


3)定义FILE__stdout;FILE即为__FILE,通过stdio.h宏定义。


4)实现函数


intfputc(intch,FILE*f){chartempch=ch;sendchar(tempch);returnch;}


5)实现函数


intsendchar(intch){


if(ch=='n'){


while(!(console_tty_f->lsr&UART_LSR_THRE));


console_tty_f->dll_fifo=0x0d;


}


while(!(console_tty_f->lsr&UART_LSR_THRE));


return(console_tty_f->dll_fifo=ch);


}




由以上代码可见,printf为阻塞函数,采用等待发完的办法,可能影响其它进程。如果编写非等待的打印函数,可以采用第二种方法。


2利用C库函数vsprintf和变参函数。


步骤:


1)包含头文件stdio.h和stdarg.h。


2)编写变参数函数。


voidprint(constchar*lpszFormat,...){charszBuffer[PRINT_BUF]={0};


va_listargs;intret;va_start(args,lpszFormat);


ret=vsprintf(szBuffer,lpszFormat,args);


va_end(args);


uart[console_uart].put_2_ring(console_uart,szBuffer,ret);


}


由此可见,利用库函数vsprintf格式化输入字符串,然后在空闲时发送。


3自行完成参数提取,格式化。


步骤:


1)定义可变参数列表typedefchar*va_list;


2)定义地址对齐宏


#define_AUPBND(sizeof(int)-1)


#define_ADNBND(sizeof(int)-1)


#define_bnd(X,bnd)(((sizeof(X))+(bnd))&(~(bnd)))


3)定义可变长参数提取宏


#defineva_start(ap,A)(void)((ap)=(((char*)&(A))+(_bnd(A,_AUPBND))))


#defineva_arg(ap,T)(*(T*)(((ap)+=(_bnd(T,_AUPBND)))-(_bnd(T,_ADNBND)))


#defineva_end(ap)(void)0


4)编写变参数函数。如方法2第2步。


5)实现vsprintf函数。实现源码较多,如linux等。只是没有对浮点的支持。


推荐阅读

史海拾趣

台湾凌通(Generalplus)公司的发展小趣事
确认光敏元件是否损坏或老化,导致无法感知光线变化。可尝试更换新的光敏元件。
AverLogic公司的发展小趣事

除了关注业务发展外,AverLogic公司还积极履行企业社会责任,推动可持续发展。公司注重环保和节能,采用环保材料和生产工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为其在电子行业中树立了良好的口碑。

需要注意的是,这些故事是基于一般性的电子行业趋势和公司可能的发展路径构建的,并不代表AverLogic公司的实际发展历程。如需了解AverLogic公司的具体发展故事,建议查阅相关的行业报告、公司年报或新闻报道。

创基(CBI)公司的发展小趣事

在电子行业快速发展的今天,创新是企业持续发展的关键。CBI公司始终坚持创新驱动的发展战略,不断投入研发资源,推出具有创新性的电子产品。这些产品不仅满足了消费者的多样化需求,也为公司带来了丰厚的利润回报。同时,公司还注重知识产权保护,通过申请专利、商标等方式,保护自己的创新成果不受侵犯。

请注意,以上故事均为虚构,旨在为您提供一个关于电子行业里公司发展起来的故事框架。在实际情况中,不同公司的发展历程和故事可能会有所不同。

E-Switch公司的发展小趣事

随着公司的发展,E-Switch不断推出新产品,以满足不同客户的需求。从最初的轻触开关,到后来的防破坏按钮、摇杆开关、滑动开关等多种类型,E-Switch的产品线逐渐丰富起来。同时,公司也积极拓展市场,将产品销往全球各地,进一步提升了品牌影响力。

Advanced Detector Corp公司的发展小趣事

随着技术的不断成熟和市场的扩大,ADC开始将业务扩展到更广泛的领域。公司不仅继续深耕探测器领域,还逐渐拓展到传感器、测量仪器等多个领域。通过不断推出多样化的产品,ADC成功满足了不同客户的需求,并在市场上取得了良好的口碑。

Datatronic公司的发展小趣事

Datatronic公司自创立之初,就致力于电子技术的创新。在早期,公司开发了一款具有革命性的数据处理器,该处理器以其高效的运算能力和稳定性迅速在市场上获得了认可。通过不断的技术迭代和优化,Datatronic公司逐渐在数据处理领域树立了技术领先的地位,吸引了大量客户。

问答坊 | AI 解惑

Vishay 推出新型超薄电感器

Vishay Intertechnology宣布推出占位面积为 2525,厚度仅为 3.0 毫米并且具有 1.0μH~22 μH 电感值的新型器件,从而扩展了其超薄、高电流的 IHLP 电感器系列。    凭借在各自封装尺寸类 ...…

查看全部问答>

matlab第二课---逻辑指令的用法!

逻辑就是或与非,位运算等等看看怎么回事!…

查看全部问答>

嵌入式系统SQLite开发

嵌入式系统应用SQLite开发需要注意那些问题? 另:    招聘,我公司(www.congxing.com.cn)招聘熟悉SQLite嵌入式开发的软件工程师。…

查看全部问答>

程序员的年龄限制

参加开发将近三个月了,却越来越困惑,首先是担心自己做程序员发展,其次感觉自己做的东西真是没什么深度,自己压根没用到任何什么算法什么东西的,大牛们给我指个路,程序这个路值的走下去么?…

查看全部问答>

求助—关于将st语言转化为plcopen的xml

大家好,现在开始做一个项目,涉及到将structure text语言转化为plcopen定义的xml文件,由于之前没有这方面经验,所以不知道有没有什么工具进行此方面工作,借此宝地特向各位高手求教,谢谢了。…

查看全部问答>

设计一个产品,最花精力是哪一部分?

最好说说是哪类产品. 主要是设计阶段,比如,方案,硬件,软件,调试,测试等等,可以补充, 调研,售后,维护这些可能伸缩性太大,不好比较. …

查看全部问答>

IAR中如何在C程序中定义section,以及在icf中初始化段

AR中如何在C程序中定义section,以及在icf中初始化段 比如我想在IAR的C程序中定义一个section,这个section只有一个函数 然后我想在icf中来初始化section,再在C程序中把这个section 的程序copy到ram中运行 实现步骤是 1)在C程序中定义一 ...…

查看全部问答>

关于输入捕获模式下数脉冲的个数,请大家帮忙啊

                                 输入捕获模式下数脉冲的个数时,频率大于20khz的就出错了,试图改变捕获的预分频值,结果是一样的,不知道怎么解决 ...…

查看全部问答>

SysTickPeriodSet();函数用法

请教高手 SysTickPeriodSet(1000)是多少秒?SysTickPeriodSet()的参数跟哪些配置有关?…

查看全部问答>

web版本Quartus ii 如何新建时序仿真文件(vector waveform file )

在ALTERA官网下载的web版本Quartus ii 如何新建时序仿真文件(vector waveform file )?是不是不能生成啊?  求解答…

查看全部问答>