首页 > 解决方案 > 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?"

提前致谢!

标签: syntaxglobal-variablestcl

解决方案


文档global

除非在 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例如完全限定的)


推荐阅读