主题 : #新手#关于中断 和 全局变量 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 21881
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-05-23
最后登录: 2010-11-19
楼主  发表于: 2010-08-27 13:34

 #新手#关于中断 和 全局变量

小弟新手不懂汇编,请大家帮忙看看下面这段代码是否有问题,它没有正常跳转到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;
}
级别: 新手上路
UID: 21881
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-05-23
最后登录: 2010-11-19
1楼  发表于: 2010-08-29 14:31
好冷清...
级别: 新手上路
UID: 21881
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-05-23
最后登录: 2010-11-19
2楼  发表于: 2010-08-30 21:00
唉 全局变量的问题解决了  在MAKEFILE里指定了数据段的位置就行了

中断的问题还在...