7.9.1.22.定义共享存储器

单个处理器上的多个内核可以分享同一个存储器块。GEL 函数 GEL_MapAddStr() 用于将一系列共享存储器添加到存储器映射。共享存储器的属性指定为函数的参数。例如,对共享存储器的访问可以是 RAM 或 ROM。

各选项可用于在调试共享存储器时控制调试器功能。

指定共享存储器属性

共享存储器属性在 GEL_MapAddStr() 函数中指定。

GEL_MapAddStr(address, page, length, attribute, waitstate);

按照 GEL_MapAddStr() 中的说明指定函数参数 addresspagelengthwaitstate。但是,attribute 参数接受用于指定共享存储器的附加属性。例如:

RAM|SHnC|CACHE

ROM|SHnC|CACHE

字符串 描述
RAM 指定对存储器的访问为读和写。
ROM 指定对存储器的访问为只读。
SHnC

字符串 SH 指定共享存储器。

数字 n 标识所共享的存储器块。该数字不能为零或负数。

如果共享存储器块在内核 A 上指定为“RAM|SH2”,然后在内核 B 上指定为“ROM|SH2”,则该块在内核 A 和 B 之间共享,在 A 上具有读写访问权限,在 B 上具有只读访问权限。

不同内核的块可能位于不同的可寻址区域。换而言之,在内核 A 上,块可能开始于 0x8000,在内核 B 上,同一个块可能开始于 0x4000。

字符串 C 会导致调试器:

  1. 写入包含可执行代码的共享存储器时停止所有内核
  2. 单步执行共享存储器中设定的断点时停止所有内核

当写入共享存储器块时,驱动器必须在短时间内清除该块中的断点。此外,如果处理器正在执行操作,该位置的数据可能不正确。当指定“C”时,在该块上有可执行代码的所有内核均会停止,以确保不会错过任何断点,也不会执行无效代码。

当单步执行在共享存储器块中设定的软件断点时,先清除断点,然后单步执行代码,最后为断点复位。如果其他内核在此期间执行该存储器块中的代码,则它们将会错过断点。当指定“C”时,在该块上有可执行代码的所有内核均会停止,直至已单步执行断点。

C 是可选的,但应始终作为默认设置附加。通过设置共享存储器选项可覆盖这些操作的默认设置。

高速缓存

当任何处理器写入共享存储器块时,会导致驱动器使缓存无效。

此操作是必要的,因为内核 A 可以写入块 2,而内核 B 可以将块 2 存储在缓存中。需要在内核 B 上使缓存无效,以使内核 B 拥有最新数据。

第一个属性必须确定访问类型:RAM 或 ROM。其余属性可以按任何顺序指定。竖线“|”字符用于分隔多个属性。例如,RAM|SH4C|CACHERAM|CACHE|SH4C 都是有效的。

访问类型(RAM 与 ROM)是从调试探针,而不是从 CPU 的角度来看。

调试共享存储器

在调试共享存储器时,您应该记住两个基本的调试器操作。

写入到共享存储器或从共享存储器读取时,调试器知晓每个不同的处理器具备何种读取/写入访问权限,并将选择正确的处理器来执行写入或读取操作。例如,如果内核 A 具有对共享存储器的读取和写入访问权限,内核 B 拥有只读访问权限,用户仍可以使用内核 B 写入到共享存储器。调试器会自动切换至内核 A 来执行实际的写入操作。

在共享存储器中设定的任何软件断点将在每个可访问的处理器上设置。软件断点甚至可在具有只读访问权限的处理器上设置,前提是至少有一个处理器具有对共享存储器的读取和写入访问权限。例如,如果在源文件中设置了一个断点,该断点也将在其他处理器上设置。唯一已知的限制是,断点只能连接到一个处理器上的一个源。如果断点还必须连接到第二个处理器上的某个源,则必须添加第二个断点(在同一地址)。然后,这第二个断点可连接到第二个处理器。

___

另请参阅:

GEL_MapAddStr() GEL 函数:按字母顺序排列的列表