ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别

  • 前言
  • 两个串口到底是谁在打印?
  • print 和 printf 和 xil_printf

前言

在最初的helloworld工程中,我们实现了通过串口每个1秒钟打印一次Hello World。

这里我们就来搞清楚以下几个问题,从简单到复杂问题依次为:
1、 我们有两个串口,那怎么区分是从哪个串口打印的
2、 为什么是print函数,一般C标准打印函数是printf呢
3、 如果我两个串口都想打印东西怎么弄
4、 串口的波特率如何修改,最大能支持多少
后面2点放到另一篇文章讲。

两个串口到底是谁在打印?

一开始我们就定义了两个串口,在xparameter.h中的描述如下# 二、使用步骤

那怎么知道以及设置是要从UART_0打印还是UART_1打印呢?
我们进入print.c文件,找到outbyte函数,里面内容为
XUartPs_SendByte(STDOUT_BASEADDRESS, c);
这个STDOUT_BASEADDRESS的定义为:

这个就正好和XPAR_PS7_UART_0_BASEADDR吻合了,也即是说,我们当前使用的哪个串口,与这两个宏定义设置有关。
因此我们如果想换成UART_1打印,只要将STDOUT_BASEADDRESS 改成0xE0001000即可,同时STDIN_BASEADDRESS这个也应同步修改。

还有一种方式是,直接在mss文件中修改

因此如果我们要修改要打印的串口,我觉得最好还是通过第二种方式修改(修改mss文件中的配置),因为第一种方式修改后会和mss中显示的stdin和stdout不一致。

print 和 printf 和 xil_printf

参考 https://www.youtube.com/watch?v=f2pPIRHc0bM

我们阐述下三种打印的差别
差别1:
1、printf 是调用C标准库,使用printf的时候需要加头文件 #include <stdio.h>
2、print 和 xil_printf是使用xilinx自己的库 #include “xil_printf.h”
差别2:
1、 print只能打印字符串
2、 xil_printf和printf,可以带参量打印,但是xil_printf不支持打印浮点数

xilinx的SDK工具支持标准的c库,比如我们最日常使用的printf函数,就是标准c库里的一个重要函数。但是标准c库所谓的标准性,或者所谓的通用性带来的问题就是它必须面对所有的情况,而一些情况在fpga设计中是普通情况下是极少碰到的,比如正常情况下,浮点处理是很少用的。如此之后,这个函数必然会变得体态臃肿。比如这里的printf函数。不知道大家有没有这样的经验,使用printf函数,你的程序最后编译出来变的很大~其实xil_printf和printf的功能是一样的,只是xil_printf除去了浮点的所有功能,如此之后,一下子程序就变得很小了。
如果用专业一点的术语描述,就是使用printf链接过程是静态链接,静态链接的时候他进行链接的是一整个<stdio.h>,而且静态链接的特点在于他是直接把这个对象文件加入到了可执行文件当中,极大的浪费了内存空间。而另外两个函数是动态链接,其链接过程是动态的在可执行程序执行的时候进行链接的。

既然提到使用print 和 printf 和 xil_printf的内存问题,那么,我们就来做个实验看看,到底怎么节省内存法。

实验可查看原链接……

结论:无论是printf 还是xil_printf 多个打印语句不会显著增加内存

总之,需要打印字符串就使用print函数,需要打印浮点数就使用printf,需要打印整点数就使用xil_printf就没错了。可能的话最好所有打印都不要出现printf,只要有一个都会使内存增加不少。

ZYNQ开发中SDK输出串口选择以及打印函数print、printf、xil_printf的差别相关推荐

  1. ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--SDK输出串口选择以及打印函数print.printf.xil_printf的差别 前言 两个串口到底是谁在打印? ...

  2. Android之---项目开发中网络框架的选择

    项目开发中网络框架的选择 Android常用的网路框架: 大多数应用程序基本都需要连接网络,发送一些数据给服务端,或者从服务端获取一些数据.通常在 Android 中进行网络连接一般使用 Scoket ...

  3. zynq开发中的设备树

    在zynq开发中经常会修改设备树,每次遇到这种情况都有点发愁,今天把设备树相关的知识点总结一下,希望以后遇到设备树时,能够自如应对. 什么是设备树 设备树时描述硬件的数据结构,Linux系统可以通过设 ...

  4. iOS开发中SDK是什么?

    在学习iOS开发的过程中,我一直疑问什么是SDK? 从3个方面去了解SDK,SDK是什么?它做什么用?如何使用SDK? 1.SDK是什么? SDK全称为Softwa Development Kit(软 ...

  5. matlab中输出不换行,matlab打印函数disp如何不换行

    matlab常用的打印函数一个是: (1)fprintf('num=%d', num); 这个和C语言的基本一样,区别在于格式化字符串用的是单引号. 而且,这个函数也直接支持矩阵打印,也即,上例的nu ...

  6. STM32 在PC端串口助手上打印中文字符----printf()函数重定向

    前言 本博文基于STM32F103ZET6和MDK5.2.6和库函数V3.5.0开发: 本博文采用七星虫德飞莱开发板,USB-TTL电路,USART1和串口调试助手: 如有不足,多指教: 针对STM3 ...

  7. DIY单片机串口打印函数print

    原始的单片机串口只能发送单字节数据,再加个封装也就能发送个字符串,但是无法发送数字变量,要发送数字变量那基本要引入C语言的库函数printf,但是这个pintf函数 好用确实是好用但是有个很大的缺点相 ...

  8. 实际开发中运费模板区域选择

    // 区域不可重复,并且互斥,仅仅在当前的配送区域进行,则将两外已选择的区域设置disabledhandleCityScopeChange(opt, checkedIds) {opt.areaDisb ...

  9. Android 使用NDK开发中,遇到memset,memcpy, malloc函数错误

    遇到在使用NDK进行底层开发的时候,会遇到一些奇怪的问题,如下:   错误一: Invalid arguments ' Candidates are: void * memcpy(void *, co ...

最新文章

  1. 学生管理系统(C语言版)
  2. 2021下半年,我只想用Python搞钱!
  3. 分享丨国外20个机器学习相关博客推荐
  4. HP-UX B.11.31从安装到VG配置
  5. mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据
  6. python rsa_python rsa加解密
  7. spoj1026 favorite dice
  8. 天池 在线编程 求和查找
  9. java-log入门【目的把日志写入socket】
  10. Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt
  11. 3.07 检测两个表中是否有相同的数据
  12. C++ new和delete 堆和栈
  13. mysql用foreach遍历,ForEach-Object循环遍历MySql DataTable第一行空白
  14. 性能分析26-tomcat优化P61
  15. 什么软件可以测试皮肤色号,肤色测试卡怎么用?肤色测试卡的使用方法
  16. 有关PS中图片不能解锁问题
  17. 试题 算法训练 单词翻转 文章翻转 JAVA
  18. Docker入门到部署
  19. 安卓巴士Android开发者门户
  20. 深度学习backbone是什么意思_什么是深度学习,深度学习是热门词

热门文章

  1. 第3关:字符串的连接
  2. win10* 64 专业版云盘分享
  3. 什么是 MetaTrader 4(MT4) 以及如何使用它?
  4. BATM公司为什么宁愿花25K招聘应届生,也不愿涨薪5K留住老员工?
  5. 【原创】关于职业发展
  6. 专访九州云CEO张淳:边缘计算助力5G应用百花齐放
  7. ubuntu 16.04无线网卡安装BCM43142 802.11b/g/n Linux 驱动
  8. 鸿合一体机触屏没反应怎么办_鸿合电子白板无法触屏,是什么原因啊,怎么解决?...
  9. 高德mesh添加纹理渐变颜色
  10. Windows10中添加或删除开机自启动项目