您好!
客户遇到内存访问顺序问题。
这是一个示例 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 命令之后的虚拟代码插入会进行正确的存储器访问。
他们想要知道的是什么;
应该添加多少个虚拟代码?
系统中有类似的代码、但并不总是出现相同的现象。 为什么?
是否有其他好方法可以避免该问题?
此致、