|
我的程序在执行
void TargetBusInit(void)
{
#ifdef __Release
int i = 0;
volatile uint32 *cp1;
// 总线设置,初始化SDRAM控制器
cp1 = (void *)BWSCON_ADDR;
for(i=0; i<13; i++)
{
*cp1++ = __BUS_INIT;
}
#endif
}
代码中__BUS_INIT[]是一个数组,存储的是BWSCON地址开始连续十三个寄存器的值。
这段代码时会把0x30000000开始的地址全部置为0xFFFFFFFF,而这个地址是程序各个异常堆栈的所在,直接导致存在栈中的LR值被改为0xFFFFFFFF。
各堆栈对应的地址是:
StackUsr [0x300001e0] dcd 0x300001e0 ...0
StackSvc [0x30000220] dcd 0x30000220 ..0
StackIrq [0x30000320] dcd 0x30000320 ..0
StackFiq [0x30000360] dcd 0x30000360 ~..0
StackAbt [0x30000360] dcd 0x30000360 ~..0
StackUnd [0x30000360] dcd 0x30000360 ~..0
奇怪的是,我是在程序的下面两个函数中加入内容后才发生上述情况
void Beep_Start(void){
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/20;
rTCMPB0 = rTCNTB0>>2;
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit*/
}
void Beep_Stop( void ){
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
如果上面函数体中内容都注释掉的话则能正常运行,请教各位大侠这有可能是什么原因?
我用的开发板是s3c2440,仿真器是Jlink v6,调试软件是AXD。
本贴被 kildare 编辑过,最后修改时间:2008-12-04,23:08:38. |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|