小弟新手不懂汇编,请大家帮忙看看下面这段代码是否有问题,它没有正常跳转到main去。
问题似乎在于开IRQ中断那句,我把它注释掉后放到main中去做,main被执行了,但是在它之后main中的其他语句并没有被执行。。。
也就是说程序开IRQ中断之后就进入了另一个不知道是什么的循环。
另外还有一个全局变量问题,我在main.c中声明一个全局变量,但好像不能用它,问题描述在代码注释中。
程序编译好后大小1.7k,我把它下到内部的4kRAM中运行,不知道这段汇编中的一些堆栈设置是否有问题,对这些一直很模糊。
程序功能方面,所有中断响应都正常。
Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
msr cpsr_c, #0xd2 @ 进入中断模式
ldr sp, =3072 @ 设置中断模式栈指针
msr cpsr_c, #0xdf @ 进入系统模式
ldr sp, =4096 @ 设置系统模式栈指针,
@ 其实复位之后,CPU就处于系统模式,
@ 前面的“ldr sp, =4096”完成同样的功能,此句可省略
bl clk_init @ 初始化时钟
bl irq_init @ 调用中断初始化函数,在init.c中
bl uart0_init
bl led_beep_init
bl btn_init
bl timer0_init
@msr cpsr_c, #0x5f @ 设置I-bit=0,开IRQ中断 ----注释掉之后能跳转到main
ldr lr, =halt_loop @ 设置返回地址
ldr pc, =main @ 调用main函数
//main.c
unsigned int stopped; //这里声明一个全局变量,但似乎不能用,编译能通过。。。
int main(void)
{
stopped =49;
sendChar(stopped); //发出的值非49
__asm__(
"msr cpsr_c, #0x50"
); //它之后的其他语句没有被执行
sendChar(stopped);
while(1);
return 0;
}