打印
[ZLG-ARM]

中断问题求助

[复制链接]
1180|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fdy2007|  楼主 | 2007-4-16 18:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在smartarm上写了一个简单的实验,主要实现以下功能:ucos只建立一个任务,向PC发送字母w,当pc机连续向arm发送8个字节后,arm中断向pc机发送h
在实验过程中,w字母是收到了,但是不管我连续向arm发送多少数字字母,都没有受到中断,我已经在strtup.s中开了中断
      ;设置系统模式堆栈
        MSR     CPSR_c, #0x5f
程序如下:
#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh    64            //定义用户任务0的堆栈长度 
OS_STK    TaskStk [TaskStkLengh];        //定义用户任务0的堆栈

void     Task0(void *pdata);            //Task0 任务0
void VICIn();
/*********************************************************************************************************
**                           主程序
********************************************************************************************************/
int main (void)
{
    VICIn();  
    OSInit ();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);        
    OSStart ();    
    return(0);                                                    
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

void Task0    (void *pdata)
{
    pdata = pdata;
    TargetInit ();
    VICIn();
    while (1)
    {
        U0THR='w';
        while((U0LSR&0x40)==0);
        OSTimeDly(10);
    }
}
  /*********************************************************************************************************
**                            VIC初始化
********************************************************************************************************/  
void VICIn(void)
{
  extern void IRQ_UART0(void);
  VICIntSelect = 0x00000000;//均为向量中断
  VICVectCntl0 = 0x26;//UART0分配为向量0号中断
  VICVectAddr0 = (int)IRQ_UART0;//UART0中断服务子程序入口
  VICIntEnable = 1<<7;//允许UART0中断
  
   U0FCR = 0x81;                            // 使能FIFO,并设置触发点为8字节
   U0IER = 0x01;                            // 允许RBR中断,即接收中断
}
/*********************************************************************************************************
**                            中断服务子程序
********************************************************************************************************/  
void   __irq IRQ_UART0(void)
{
    if(0x04==(U0IIR & 0x0F))
    {
      U0THR='h';
    }
    VICVectAddr = 0;//中断处理结束
}
  
   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

相关帖子

沙发
zlgARM| | 2007-4-16 19:36 | 只看该作者

fdy2007

要考虑一下为什么会出现这样的情况。
在ISR中设置一个断点,观察是否能进入ISR。这样就能判断,中断是否有初始化好。
没进ISR你就要仔细调试那些你认为能触发ISR的程序部分乐。

使用特权

评论回复
板凳
fdy2007|  楼主 | 2007-4-16 19:42 | 只看该作者

你好

我刚才把target.c中的

        void  IRQ_Exception(void)
{
    while(1);  //  change it to your code 这一句替换为自己的代码
   
}
while(1)屏蔽了,之后中断就能发生,但是进入中断后,一直发送h不停止,不知道什么原因

使用特权

评论回复
地板
fdy2007|  楼主 | 2007-4-16 19:46 | 只看该作者

你好

刚才我又把uart0中断改成了外部中断,并且增加了一个任务,向pc发s,并且同样屏蔽了 void  IRQ_Exception(void)中的while(1),这时的情况是:两个任务之发生一次,即pc机收到ws,之后pc机就收不到字符,直到外部中断发生收到h。中断正常,但是每个任务只运行一次,我真的不知道这是什么错误了

使用特权

评论回复
5
fdy2007|  楼主 | 2007-4-16 19:51 | 只看该作者

你好!

我现在不太明白target.c中的void  IRQ_Exception(void)和 void FIQ_Exception(void)到底起什么作用,是说IRQ中断和FIQ中断处理程序可以在这两个函数里实现吗?那在main函数中 VICVectAddr0 = (int)IRQ_UART0;以及void IRQ_UART0()还有什么意义,我看教程上的例子都是直接重新声明中断处理程序的,越看越糊涂了!给我解释解释把

使用特权

评论回复
6
fdy2007|  楼主 | 2007-4-16 19:56 | 只看该作者

你好!

我调试时,发现就是在 void FIQ_Exception(void)的while(1)中陷入死循环的。

使用特权

评论回复
7
zlgARM| | 2007-4-16 21:49 | 只看该作者

fdy2007

uc/OS里的ISR声明有些特殊。
找个uc/OS的中断例程,看看怎么初始化的吧。必须把初始化中断的过程搞清楚。
先看一下基础教程里是怎么说ISR初始化的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝