ZYNQ中PS端打印函数print、printf、xil_printf的差别

本文比较了C标准库的printf、Xilinx自定义的print和xil_printf在FPGA设计中的差异,指出xil_printf去除了浮点数功能以节省内存。通过实验,作者发现多次打印语句对内存影响不大,推荐根据需求选择合适的函数来控制内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考 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 的相关信息 #### 1. **ZYNQ 架构概述** ZYNQ 是一种集成了 ARM 处理器 (PS, Processing System) 和 FPGA 可编程逻辑 (PL, Programmable Logic) 的 SoC 芯片。其架构设计使得 PS 部分可以控制 PL 部分的功能实现,从而实现了硬件加速和软件灵活性的结合[^3]。 #### 2. **ZYNQ 开发流程** 在开发过程中,通常会涉及两个主要部分: - **PS **: 主要负责运行操作系统以及高级别的应用层功能。 - **PL **: 提供灵活的硬件资源用于定制化算法或接口的设计。 通过工具链如 Vivado 或 LabVIEW 进行开发时,开发者可以在 PS 上编写驱动程序并配置 PL 中的具体电路结构。当完成设计后,可以通过特定方式将生成的比特流文件 (.bit 文件) 加载至 PL 区域以激活相应的硬件功能[^1]。 #### 3. **FPGA 程序固化技术** 对于实际产品而言,“掉电即失”的特性显然不适合长期部署需求。为此,《LabVIEW ZYNQ FPGA 开发宝典》提到可通过外部存储介质(例如 QSPI Flash 或 TF 卡)来保存编译后的可执行镜像,在设备重启期间由 PS 自动重新加载这些数据到内部 RAM 并初始化整个系统状态——这一操作被称为“FPGA 程序固化”[^2]。 以下是基于上述描述的一个简单示例代码片段展示如何利用 Python 实现基本通信机制: ```python import serial def send_command(ser_port, cmd_str): ser_port.write((cmd_str + '\n').encode()) if __name__ == "__main__": port = '/dev/ttyUSB0' baudrate = 9600 with serial.Serial(port, baudrate=baudrate, timeout=1) as ser: if not ser.is_open: raise Exception('Failed to open serial port.') try: while True: user_input = input("Enter command: ") send_command(ser, user_input) response = ser.readline().decode().strip() print(f'Response from device: {response}') except KeyboardInterrupt: pass finally: print("\nExiting program...") ``` 此脚本允许用户向连接有串口调试桥接模块的目标板发送命令字符串,并接收返回消息作为反馈显示出来。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值