分享一则案例:FPGA设备启动时间过长,导致POST后系统识别不到PCIe怎么办?

技术分享 · 08-23

方案背景

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

6af4b3b26561136512090c646e4a112

总结

通过上述步骤,你已经配置了一个 Systemd 服务,该服务将在系统启动时运行 check_fpga.sh 脚本。这将确保每次系统启动时都会检查 Xilinx PCIe 设备的存在情况,在重试三次(总计30秒)后依旧识别不到设备后重启操作系统。