zynq中linux应用的远程调试配置
Vitis +TCF
适合规模小,依赖轻的简单测试
Window -> Show View ->target Connections
Clion +GdbServer
适合规模大,依赖重的工程
- windows 和 ubuntu 的clion都可以,但是windows的clion要用wsl里的交叉编译工具
- 程序直接放在 NFS 共享目录,编译后无需任何上传
开发板本地 GDB
将gdb编译进 Petalinux 根文件系统
PC上
# 进入petalinux工程petalinux-config-crootfs# 菜单路径Filesystem Packages → misc → gdb 勾选 gdb(板载完整本地调试器)、gdbserver(用于CLion远程调试)# 保存后重新编译根文件系统petalinux-build-crootfs# 重新打包系统镜像更新SD卡petalinux-package--boot...开发板上
# 临时开启core转储,重启失效ulimit-cunlimited# 运行程序,段错误/崩溃自动生成core转储文件./hello# 用本地gdb加载core看崩溃位置gdb ./hello core.1234(gdb)btlinux中PL寄存器读写脚本
- PS通过AXI 转 SMMR,APB,AXI 等访问到PL
- 数据和地址统一32位
- 根据寄存器序号读写
root@ant:~/soft# ./rw.shUsage:# single write./rw.sh w<idx(dec)><value(dec|0xhex|0bbin)># single read./rw.sh r<idx(dec)># batch from file./rw.sh-fcmds.txt Examples(cmds.txt lines): w1111w320b110 w320x1110 r32r30rw.sh
#!/bin/bashset-euopipefail# ===== Config =====BASE=0x43c00000# AXI-Lite base addressDEVMEM=${DEVMEM:-devmem}# override if needed: DEVMEM="busybox devmem"# ===== Helpers =====parse_u32_any(){locals="$1"if[[-z"$s"]];thenecho"ERR: empty value">&2;return3;fi# 0b... binary (allow underscores)if[["$s"=~^0[bB][01_]+$]];thenlocalbits="${s:2}"bits="${bits//_/}"[["$bits"=~^[01]+$]]||{echo"ERR: invalid binary:$s">&2;return3;}echo$((2#$bits))return0fi# hex or decimalif[["$s"=~^0[xX][0-9a-fA-F]+$]];thenecho$((s));return0fiif[["$s"=~^[0-9]+$]];thenecho$((10#$s));return0fiecho"ERR: bad value:$s">&2return3}rd32_dec(){localidx="$1"localaddr=$((BASE+4*idx))localhex="$($DEVMEM"$addr"32)"localdec=$((hex))printf"R [%u] @0x%08X : %u (0x%08X)\n""$idx""$addr""$dec""$dec"}wr32_dec(){localidx="$1"val_dec="$2"localaddr=$((BASE+4*idx))localval_hexprintf-vval_hex"0x%08X""$val_dec"$DEVMEM"$addr"32"$val_hex">/dev/null}do_write(){localidx_str="$1"val_str="$2"[["$idx_str"=~^[0-9]+$]]||{echo"ERR: bad index:$idx_str">&2;return2;}localidx=$((10#$idx_str))localval_dec;val_dec="$(parse_u32_any"$val_str")"||return$?wr32_dec"$idx""$val_dec"localrb_dec;rb_dec="$($DEVMEM$((BASE +4* idx))32)"rb_dec=$((rb_dec))printf"W [%u] @0x%08X <= %u (0x%08X); Rb=%u (0x%08X)%s\n"\"$idx"$((BASE+4*idx))"$val_dec""$val_dec""$rb_dec""$rb_dec"\"$([[$rb_dec-eq$val_dec]]&&echo""||echo" [WARN: mismatch]")"}usage(){cat>&2<<EOF Usage: # single write$0w <idx(dec)> <value(dec|0xhex|0bbin)> # single read$0r <idx(dec)> # batch from file$0-f cmds.txt Examples (cmds.txt lines): w 1 111 w 32 0b110 w 32 0x1110 r 32 r 30 EOFexit2}# ===== Dispatch =====[[$#-eq0]]&&usageif[["$1"=="-f"&&$#-eq2]];thenwhileIFS=read-rline||[[-n"$line"]];doline="${line%%#*}"[[-z"${line//[[:space:]]/}"]]&&continueread-rcmd idx val<<<"$line"case"${cmd,,}"inw)do_write"$idx""$val";;r)rd32_dec"$idx";;*)echo"ERR: unknown cmd:$cmd">&2;;esacdone<"$2"exit0fiif[[$#-eq3&&"${1,,}"=="w"]];thendo_write"$2""$3"exit0fiif[[$#-eq2&&"${1,,}"=="r"]];thenrd32_dec"$2"exit0fiusage