syntax - Tcl 传递变量的值
问题描述
我有一个从指定地址读取寄存器的程序:“rd_addr $jtag_master 0x00”
我想删除“$jtag_master”输入,而是使用在脚本开头声明的全局变量,然后我可以在其他过程中使用它。初始声明当前是通过使用另一个过程“set_dev”来实现的。
global device_path
# Establish the device_path as specified by "device"
proc set_dev {device} {
set jtag_master [lindex [get_service_paths master] $device];
set device_path $jtag_master
}
proc rd_addr {address {size 1}} {
set read_data [master_read_32 $device_path $address $size];
puts "$read_data"
}
# Init
set_dev 0
puts "jtag: $jtag_master"; # Returns proper path
puts "device_path: $device_path"; # Returns proper path
rd_addr 0x00
我当前的 rd_addr 实现返回:
error: can't read "device_path": no such variable
我也尝试过实现默认值,尝试默认值,这会导致它们自己的错误:
proc rd_addr {address {size 1} {device_path $device_path}} {
-> error: master_read_32: Error: The given path is not valid - $device_path
proc rd_addr { {device_path $device_path} address {size 1} } {
-> error: wrong # args: should be "rd_addr ?device_path? address ?size?"
提前致谢!
解决方案
除非在 proc 主体的上下文中执行,否则此命令无效。如果 global 命令在 proc 主体的上下文中执行,它会创建链接到相应全局变量的局部变量
基本上,global variable_name
需要在每个想要引用该名称的全局变量的过程中使用。
proc set_dev {device} {
global device_path
set jtag_master [lindex [get_service_paths master] $device];
set device_path $jtag_master
}
proc rd_addr {address {size 1}} {
global device_path
set read_data [master_read_32 $device_path $address $size];
puts "$read_data"
}
没有它,set_dev
使用该名称为 proc 设置一个本地变量,并且如您所见rd_addr
,找不到任何具有该名称的变量。tcl 中的全局变量在 proc 范围内不可见,如果没有这种方法或其他一些方法($::device_path
例如完全限定的)