各位好:
我在使用F5438的时候,想把RAM写一遍0XAA,但是for循环执行第二次的时候,指针运行不对,查看反汇编,原来第二次执行*ram_start++ = 0xAA;这句话PC跳转的字节由6字节变为8字节,本来*ram_start++ = 0xAA;对应的汇编指令应该是6个字节,而PC却跳转了8个字节,到底是编译器问题,还是芯片问题?
#include <msp430f5438.h>
__no_init unsigned char *ram_start@0x1c00;__no_init unsigned int i@0x1c04;//unsigned int num;
int main(void)
{
WDTCTL =WDTPW+WDTHOLD;
//num = sizeof(unsigned char *);
//num = sizeof(i);
ram_start = (unsigned char *)0x1C06; // 把ram的首地址给 ram_start
asm("incx.a &ram_start"); //这句话PC跳转了八个字节,
asm("NOP");//由于上一句指令多跳转了两个字节,所以此句话执行不到
asm("NOP");
for(i =0;i < 16378;i ++) // 0x5cff-0x1c04=3ffb=16379
{ *ram_start++ = 0xAA;
} while(1);
}
Evan Lee:
这个问题看起来像是编译器的问题,能够告知你使用的IDE是什么?建议可以使用CCS5.x尝试编译一下,看看反汇编是否还有同样的问题出现?
或者修改一下程序的写法,看看有何影响?
for(i =0;i < 16378;i ++) // 0x5cff-0x1c04=3ffb=16379{ *ram_start = 0xAA;
ram_start++;}
hongzhen zhang:
回复 Evan Lee:
您建议的
for(i =0;i < 16378;i ++) // 0x5cff-0x1c04=3ffb=16379{ *ram_start = 0xAA;
ram_start++;}
我试了,不可以,但是把 ram_start++; 改成 _NOP(); 可以了,可能是_NOP(); 指令2个字节,刚好跳过去他不执行把。
我用的开发环境是IAR 5.4