当前位置:首页 > 公众号精选 > 21ic电子网
[导读]最近在忙活搞别的事情(太难受了),严重影响了硪那一颗自由飞翔的芯~~所以今天打算分享一个麻省理工小伙写的printf家族的函数~说是号称目前网上嵌入式最好的printf喔.在嵌入式中printf这种功能强大的函数可谓是c语言库函数的中的一股清流!也就是太好用了吧!网上最好的pri...

最近在忙活搞别的事情(太难受了),严重影响了硪那一颗自由飞翔的芯~~ 所以今天打算分享一个麻省理工小伙写的printf家族的函数~说是号称目前网上嵌入式最好的printf喔.

嵌入式中printf 这种功能强大的函数可谓是c语言库函数的中的一股清流!也就是太好用了吧!

网上最好的printf?

今天分享的例程有stm32f4ZG和cc2530f256,这个两款芯片的移植例程和移植教程!相信你看完后也可以移植到别的芯片去!

  • 使用的keil版本为:5.21a

  • IAR for 8051 version 为 10.10.1

可能会因为有些版本不同配置就略有所不同!这个和我前边的博客printf的方式原理会有所区别!先来看看结果。

(f4)串口1:

号称目前网上嵌入式最好的printf,用起来!


(f4)串口2:

号称目前网上嵌入式最好的printf,用起来!


下面这个是TI 的cc2530(就先跑着寄存器版本的吧,协议栈里头配置差不太多!):

号称目前网上嵌入式最好的printf,用起来!


为啥要移植呢!相信学过实时操作系统的都有所了解有个叫信号互斥量的东西!就是为了防止同一时间内有两个寄存器(那十来个寄存器,不是指外设!)在访问同一块内存!

这个很严重的,可能会导致程序死机,或者卡在了某个死循环里面!

我们所使用的printf就是过首先vsprinf 通过对我们传进来的参数进行格式化,我们传进去多少数据他按照我们传进来的格式,格式化就统统存放在一个buf里,如果我们定义了重定向,它就会把这个buf发送至你要发送的地方!

想象一下如果在某个系统中有一个线程在vsprintf里面运行,突然有一个任务级别比他高的任务把它运行的时间抢了过去!而任务优先级高的任务也在printf里面使用了那个buf,那就会产生上述的问题!

那就意味着我们所使用的printf不安全问题!当然我们在系统中可以通过临界保护区来处理,也可以通过信号量等等处理!

但是目前有一个线程安全的函数,摆在你面前,就问你用不用?

咳咳,那我们的上边printf_u1它是怎么处理的呢?毫无疑问的看代码就能知道,它是直接发送的,也就是说你传进来的每一个参数它都会顺手就发送出去(当然要看你配置),它的数据将不会存放在一个buf里边,在发送。这就是他给力的地方了!

keil移植printf

首先我们到文章的末尾获取到源代码后,打开keil软件, 点击 project > Options for…就能打开一下页面:

号称目前网上嵌入式最好的printf,用起来!


点击 C/C ,选择c99标准。到此为止编译器配置完毕!

下面来配置代码部分,打开头文件为printf.h:

号称目前网上嵌入式最好的printf,用起来!


代码可在文末获取。

1,添加这个两个文件的路径还有头文件,如果不懂可以搜搜!

2,点击图片上面的printf_ 去它定义的地方,我们要做出一定的修改。

号称目前网上嵌入式最好的printf,用起来!


来到这里之后我们可以看到_vsprintf 这个代码里面最复杂的就是这一串函数了!

//我们只需要关心第一个参数即可!它是一个函数指针
static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va)
//指向了一个参数为下图的函数,返回值为void
typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen);

putchar 里面的内容即可。参数二是我加上去的为了区分不同的串口类型,有多少个串口就的写多少个_out_char 这样的函数(这个是我的方法):

static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
  (void)buffer; (void)idx; (void)maxlen;
  if (character) 
  {
    _putchar(character,1);
  }
}
上图是串口1的。

再来看看串口2的:

int printf_u2(const char* format, ...)
{
  va_list va;
  va_start(va, format);
  char buffer[1];
  const int ret = _vsnprintf(u2_out_char, buffer, (size_t)-1, format, va);
  va_end(va);
  return ret;
}
//注意vsprintf第一参数
static inline void u2_out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
  (void)buffer; (void)idx; (void)maxlen;
  if (character) {
    _putchar(character,2);
  }
}

而_putchar 就是我们数据最终流向的地方了!我是这样写的。

void _putchar(char character,char sw)
{
  // send char to console etc.
  if(sw == 1)
  {
    while((USART1->SR
21ic电子网

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭