env_setup.sh 主要用于解析命令行参数,并基于这些参数设置某些环境变量和执行一些操作。
以下是每一段的简要解释:
-
ARGS=$(getopt -o '' --long noumc,emu -n "" -- "$@"): 使用getopt命令解析命令行参数。它查找长选项--noumc和--emu。结果保存在ARGS变量中。 -
if [ $? != 0 ]; then echo "Terminating..." exit 1 fi如果
getopt命令执行失败(返回非零值),则输出"Terminating..."并退出脚本。 -
eval set -- "${ARGS}": 使用eval和set命令来重新设置位置参数($1, $2,...)为getopt解析后的参数。 -
while true do ... done一个
while循环用于迭代处理每个参数。基于参数的类型,执行相应的操作或设置相应的环境变量。--noumc:设置NOUMC为true并输出提示。--emu:设置环境变量IS_EMU为1并输出提示。--:表示参数列表的结束,退出循环。*:捕获任何未知的参数,并输出错误消息。
-
if [[ $NOUMC == 'true' ]]; then cd - export NO_UMC=1 python ./IPTest/sem/used_agp_addr.py fi如果
NOUMC被设置为true,则更改当前目录到之前的目录(cd -),设置环境变量NO_UMC为1,并执行Python脚本used_agp_addr.py。 -
python $work/IPTest/nbio/pcie_atomic_config.py: 无论上面的条件是否满足,都会执行这个Python脚本。
总之,这个脚本的主要目的是基于命令行参数来设置某些环境变量,并执行相应的Python脚本。
为PCIe(Peripheral Component Interconnect Express)设备开启原子操作功能的Python脚本出错了:
首先,我们回顾一下报错信息:
unable to parse filter -s Invalid function number .\nTry 'setpci --help' for more information
这个错误是由于setpci命令在执行时无法解析传递的bus_id参数。这意味着传递给setpci的bus_id参数值可能是无效的或格式不正确。
为了解决这个问题,首先,我们需要检查每次调用setpci命令时的bus_id参数的值。
在脚本中,bus_id的值是通过以下函数获得的:
FindPciDevice()FindPciSwDn()FindPciSwUp()FindHostPort()
您应该确保这些函数返回有效的PCI设备ID。
以下是您可以采取的步骤:
-
Debugging输出: 在调用每一个函数后立即打印它的返回值。这样,您可以查看是否所有函数都返回了有效的
bus_id。ep_busid = FindPciDevice() logger.debug(f"Endpoint bus ID: {ep_busid}") ds_busid = FindPciSwDn() logger.debug(f"Downstream bus ID: {ds_busid}") up_busid = FindPciSwUp() logger.debug(f"Upstream bus ID: {up_busid}") rc_busid = FindHostPort() logger.debug(f"Root Complex bus ID: {rc_busid}") -
查看setpci命令: 您可以手动执行
setpci命令,使用从上述函数返回的bus_id,以验证其有效性。例如:sudo setpci -s <bus_id> <address>.<type> -
检查函数定义: 检查
FindPciDevice(),FindPciSwDn(),FindPciSwUp(), 和FindHostPort()这些函数的实现(可能在其他模块或文件中),确保它们返回正确的PCI设备ID。
最后,请确保您在运行脚本时具有适当的权限,因为setpci命令需要root权限来执行。如果您在一个没有sudo权限的环境中运行,这可能会导致上述的错误。