方案背景
FPGA设备启动时间过长,主板POST已经走完还没有等到光纤采集卡的信号,这样POST已经走完,已经确定了PCIe的设备列表,导致第一次启动机器时系统识别不到设备。第一次启动后,再次重启,此时FPGA不会断电,持续工作中,所以第二次POST可以识别到。
通常情况下的解决方案为,在 FPGA 预编程的时候,针对POST时间进行优化,但是可能在一些场景没有条件这样操作。
这样设计一个脚本,实现在开机的时候检测是否存在该PCIe设备,如果不存在就重启系统,如果存在则不重启。
以目前手头的一个英飞凌设备为例。
方案内容
以Ubuntu系统为例,不同的操作系统可能针对开机启动脚本有不同的设置方式。
1. 创建脚本文件
首先,创建并编辑脚本文件,比如 /usr/local/bin/check_fpga.sh
:
sudo nano /usr/local/bin/check_fpga.sh
将一下脚本内容复制到其中:
#!/bin/bash
LOGFILE="/var/log/check_fpga.log"
if [ "$EUID" -ne 0 ]; then
echo "[$(date)] This script must be run as root." | tee -a $LOGFILE
exit 1
fi
check_fpga() {
lspci | grep -i xilinx
}
MAX_RETRIES=3
RETRY_COUNT=0
{
echo "[$(date)] Script started."
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
if check_fpga; then
echo "[$(date)] Xilinx PCIe device found. No need to reboot."
exit 0
else
echo "[$(date)] Xilinx PCIe device not found. Retrying..."
RETRY_COUNT=$((RETRY_COUNT+1))
sleep 10
fi
done
echo "[$(date)] Xilinx PCIe device not found after $MAX_RETRIES attempts. Rebooting system..."
/sbin/reboot
} | tee -a $LOGFILE
保存并退出编辑器。
2. 确保脚本具有可执行权限
sudo chmod +x /usr/local/bin/check_fpga.sh
3. 创建 Systemd 服务单元文件
创建一个 Systemd 服务单元文件,比如 /etc/systemd/system/check_fpga.service
:
sudo nano /etc/systemd/system/check_fpga.service
添加以下内容:
[Unit]
Description=Check for Xilinx PCIe device at startup
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/check_fpga.sh
StandardOutput=journal+console
StandardError=journal+console
Restart=on-failure
[Install]
WantedBy=multi-user.target
保存并退出编辑器。
4. 重新加载 Systemd 配置并启用服务
sudo systemctl daemon-reload
sudo systemctl enable check_fpga.service
5. 启动服务以测试配置
sudo systemctl start check_fpga.service
你可以检查服务状态以确保它运行正常:
sudo systemctl status check_fpga.service
6. 检查日志文件
重启系统后,服务会在启动时自动运行,并将输出打印到控制台,同时保存到指定的日志文件 /var/log/check_fpga.log
。
总结
通过上述步骤,你已经配置了一个 Systemd 服务,该服务将在系统启动时运行 check_fpga.sh
脚本。这将确保每次系统启动时都会检查 Xilinx PCIe 设备的存在情况,在重试三次(总计30秒)后依旧识别不到设备后重启操作系统。