This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的工程师:
我正在测试 IPC 的 EtherCAT。 Controlword0x6040定义为无符号短整型、位于 IPC 消息 RAM (0x20082400)中。 但是、在存储器浏览器中、其大小与我想象的不同。 它是32位。 您能告诉我原因吗?
CM 的景色
CPU1视图
此致、
Jeong (jjeon@glentek.com)
[引用用户="Jeong Jote">但是,内存浏览器中的大小与我想象的不同。 它是32位的。我认为问题是 TargetVelocity0x60FF 的 int 类型:
在 Cortex-M CM 上 、TargetVelocity0x60FF 的起始地址为32位对齐、这会使 CM 上的存储器浏览器产生一种印象、即前面的 Controlword0x6040为32位。
尊敬的 Chester Gillon:
感谢您的回复!
如何在 Cortex-M CM 上分配8位或16位的数据类型?
此致、
Jeong (jjeon@glentek.com)
尊敬的 Chester Gillon:
感谢您的建议。 我尝试使用 int16_t 分配"Controlword0x6040"、但"Controlword0x6040"的存储器分配了32位、而不是下图中的16位。 我想分配具有16位的存储器。 如果您有其他建议、请告诉我。
此致、
Jeong (jjeon@glentek.com)
[引用 user="Jeong Jeon ]]我尝试使用 int16_t 分配"Controlword0x6040"、但"Controlword0x6040"的存储器分配了32位、而不是下图中的16位。[/引用]表达式视图显示 Controlword0x6040是 Cortex-M 上的16位短整型 存储器浏览器未显式给出变量的大小。
TargetVelocity0x60FF 的类型是什么、您希望它是16位还是32位?
此外、您能否展示如何在 IPC 消息 RAM 中定义变量?
[引用用户="Jeong Jote">我在回答您的问题时只附上了几个捕获的数字。 [/引号]OK、Controlword0x6040和 TargetVelocity0x60FF 的定义方式、它们在 Cortex-M CM 和 C28 CPU 上应该具有相同的大小和对齐方式。
您是否还可以为 Controlword0x6040、TargetVelocity0x60FF、Statuswors0x6041和 PositionActualValue0x6064变量的 ARM 和 C2800编译器发布链接器映射文件的输出?
您好!
我们将邀请 IPC 软件专家对此进行审核并返回。
谢谢、
尊敬的 Jong Jeon:
从您共享的快照中、我看到您已将 Controlword0x6040定义为 Int16_t、它应该是 C28x 和 ARM 内核中的16位。
在表达式窗口中 、Controlword0x6040被列为16位变量。 在存储器浏览器中、我看到您已搜索地址并将该视图设置为32nit Hex、因此您会看到32位值。 您可以将其更改为16位十六进制。
此致、
Veena
您好、Veena、
感谢你的答复。
我有另一个问题。 我在 CM 上的 Controlword0x6040中输入"1"、从 CPU1的 Controlword0x6040中获取"1"。 没错。 然后、我在 CM 将"1"放置到 TargetVelocity0x60FF、并从 CPU1的 TargetVelocity0x60FF 获取"0x46C0"。 这与我预期的不同。 因此、我认为 CM 上的 Controlword0x6040被分配了32位。 请告诉我您的意见。
此致、
Jeong (jjeon@glentek.com)
您好、Jeong、
您能否详细介绍如何确保 CPU1应用程序中定义的 TargetVelocity0x60FF 和 CM 中具有相同名称的变量使用相同的物理位置。 由于 C28x 和 CM 具有不同的地址空间、 因此 CM 内核上的0x20086000与 CPU1中的0x00038000相同。
如果在两个应用中以相同的顺序定义变量、很可能、它们应该得到相同的位置。 但是、在启动期间将地址从一个内核共享到另一个内核可能是更好的方法。 另一个选项是使用#pragma 位置对要为变量分配的地址进行硬编码
查看映射文件、我看到 TargetVelocity0x60FF 位于 CPU1中的0x20086404和 实际上是相同物理位置的0x00038202。 偏移量(404与202)的差异是由于 C28x 和 ARM 内核中的寻址不同。 但在您的原始帖子中、我看到 TargetVelocity0x60FF 位于偏移201处、这是错误的。 您能否确认两个内核上这些变量的地址?
此致、
Veena
您好、Jeong、
为了避免混乱、我建议您在 C28x 和 CM 应用中使用 int16_t、uint16_t、int32_t、uint32_t 类型、而不是 int、short 等
此致、
Veena
您好、Jeong、
如果选中"Expressions"视图、 则 Controlword0x6040 标识为16位整数。 由于您已将 TargetVelocity0x60FF 定义 为32位整数、因此它需要一个具有32位边界的地址、并被分配给偏移202 而不是201。 它给人的印象是 Controlword0x6040的长度是32位。 内存浏览器视图仅在 变量地址处添加变量名称。 它可能没有大小信息。 就像您在 TargetVelocity0x60FF 下看到超过4字节的值一样。
为了进行测试、您可以在 Controlword0x6040 和 TargetVelocity0x60FF 之间声明虚拟16位整数。 这将在地址201处分配。
此致、
Veena
我对您的建议进行了测试。 是的、你是对的。 我将显示如下结果。
查看 CM
在 CPU 上查看
您好、Jeong、
感谢您的确认。
只是想添加它、在使用共享变量时需要小心。 如前所述、如果在 两个内核中以相同的顺序声明变量、它们很可能 会获得相同的地址。 确保选中地图文件以确认它们使用 的位置相同。
推荐的方法是在具有写入访问权限的内核中声明变量、并在启动时将地址共享给另一个内核。 您可以查看 C2000ware driverlib 中的 IPC 示例以了解更多详细信息。
此致、
Veena