开发板(CPU):DSP 6713
开发环境:CCS 3.3
配置:代码段分在L2SRAM,memory map里面是可读可写的。
问题描述:
预期的正确结果是:在程序执行过程中动态修改内存中指定(函数)地址的指令,然后执行修改后的新指令。
实验过程:向指定函数地址写入新的指令后,用内存窗口或汇编窗口查看,观察到的都是修改后的新指令。但是当实际执行到这段新指令时,却依然执行的是原先(修改前)的指令。采用软件仿真、硬件仿真都得到相同的错误结果。
而且,在mix mode里看到的汇编指令是修改后的新指令,但是执行起来却还是修改前的旧指令。
补充说明:在2812系列的DSP开发板上进行上述实验,结果正确。
实验用的示例程序:
#include <stdio.h>
#include <csl.h>
void main() {
int flags = 0;
unsigned int* ptr;
int result;
if(flags) {
TEMP1:
//程序执行到此处时是将result的值加1,此时可在mix mode下单步过,并观察相应寄存器的值,
//会发现没有任何寄存器的值改变,程序执行的还是原先的NOP指令。
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
goto TEMP2;
}
result = 0;
//定位上面那几条NOP指令的位置
ptr = (unsigned int*)main;
while(*ptr!=0)
ptr++;
//以下几行代码是直接修改内存中TEMP1处的代码(原先是NOP指令)
//修改后的指令的作用是将result的值加1
ptr[0] = 0x023c62e6;
ptr[1] = 0x00006000;
ptr[2] = 0x0210205A;
ptr[3] = 0x023C62F6;
ptr[4] = 0x00002000;
//在此处可下断点,程序执行到此处可以去查看内存窗口,会发现TEMP1处的二进制代码已经改变
goto TEMP1;
TEMP2:
//然而执行到此处result并没有加1,即被修改后的代码并没有执行。
if(result) {
printf("the code has been modified~");
}
else {
printf("error~");
}
return ;
}
Yu Liu:
您好!
不是很熟悉67系列的DSP,不过CCS的软件断点就是利用类似的机制完成的。建议查一下有cache导致的不一致。也看看论坛上其他大侠是否有更好的建议。
Tony Tang:
回复 Yu Liu:
建议通过CCS的memory view里看一下Cache的内容是否与物理内存的内容一致。如果不一致,在执行前做一下Cache invalidate操作。