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.

[参考译文] TMS320F28375D:存储器访问顺序不正确

Guru**** 2422640 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/764224/tms320f28375d-incorrect-memory-access-ordering

器件型号:TMS320F28375D

您好!

客户遇到内存访问顺序问题。

这是一个示例 C 代码。

[代码]
#define SYSRAMPG      ((volatile Int16 *)(0x2017))/* Page switch 寄存器*/
#define DPRAM_PSM_STATUS ((volatile Int16 *)(0x2801))/*状态信息*

 int16 save_ram_page;//备份的 SYSRAMPG 临时*/

 SAVE_RAM_PAGE =* SYSRAMPG;              /*(1)保存页面设置*/
 * SYSRAMPG = 1;                    /*(2)设置为第1页*/
 PWR_srvlp.U16_STATUS =(uint16)(* DPRAM_PSM_STATUS);/* 3)状态信息采集*
 * SYSRAMPG = SAVE_RAM_PAGE;              /*(4)恢复页面设置*/


以下是汇编器代码、与选项"-O3 -opt_for_speed = 5"一致。

[汇编器代码]
 MOVB AH,#1;[CPU_]|1353(2001)的一部分
 MOV AL、*(0:0x2017)        ;[CPU_]|1352|(1)
 MOV *(0:0x2017)、AH        ;[CPU_]|1353 |(2)
 MOV @电源_srvlp+20、*(0:0x2801);[CPU_]|1354|(3)
 MOV *(0:0x2017)、AL        ;[CPU_]|1355|(4)


他们期望执行顺序为(1)->(2)->(3)->(4)。
但是、订单是(1)->(3)->(2)->(4)。
因此、由于内存读取不正确、程序出现故障。

客户已经确认了一个暂时的权变措施、即 MOVB 命令之后的虚拟代码插入会进行正确的存储器访问。

他们想要知道的是什么;
应该添加多少个虚拟代码?
系统中有类似的代码、但并不总是出现相同的现象。 为什么?
是否有其他好方法可以避免该问题?


此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yoshita、

    这不是错。 如果访问区域不受流水线保护、则在 WR 操作之前可能会对不同的存储器位置进行读取。 在这种情况下、代码正在访问不受保护的 EMIF2规范(外部存储器)(与任何其他存储器一样)。 这就是 CPU 流水线的工作方式。 请参阅 CPU 用户参考指南中的"4.2.2示例4-3:流水线活动简化图"部分

    但这不应导致程序故障、因为两者都是独立运行的。 您能解释 一下这是如何导致故障的?

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果您仍对此有疑问、请告知我们。

    Vivek Singh