3744|7

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

keil uc/os 中断 [复制链接]

本人移植uc/0s其它一切都好,只是中断这一块有问题,想大侠们来帮我解决一下问题是这样的
我想把串口0的中断程序指定到 UART0_Exception上去。我做了以下操作。
在IRQ.s 添加了
UART0_Handler  HANDLER UART0_Exception
这一行;
我还做以下
void VICInit(void)
{
    extern void IRQ_Handler(void);
    extern void Timer0_Handler(void);
    extern void UART0_Handler(void);

    VICIntEnClr = 0xffffffff;
    VICVectAddr = 0;
    VICIntSelect = 0;
    VICDefVectAddr = (uint32)IRQ_Handler;

    VICVectAddr0 = (uint32)Timer0_Handler;
    VICVectCntl0 = (0x20 | 0x04);
    VICIntEnable = 1 << 4;

    VICVectAddr6 = (uint32)UART0_Handler;
    VICVectCntl6 = (0x20 | 0x06);
    VICIntEnable = 1 << 6;                                        // 使能UART0的VIC中断
}
请问怎么程序都跳到
Undefined错误里,我用的是lpc22xx。弄了两天,也跟踪了程序,不知道哪错了,希望高手来帮我解决

最新回复

想要知道为什么,加我为好友哦!  详情 回复 发表于 2009-12-21 21:49
点赞 关注

回复
举报

61

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
单从这边看是没错的,应该在其他地方有问题
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 kelibin 的回复:
单从这边看是没错的,应该在其他地方有问题

但我去掉这段对串口0代码就行了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
看看你串口的实现程序,有没有加__irq,里面的数组有没有越界。。如果,定时器的中断可以使用,那么串口中断按理也不错。。你贴出串口中断处理程序看看哪。。。另外,一般irq中断模式下的stack是256B,如果你串口中断里面函数调用很复杂的话,可能越界。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 mxm1986 的回复:
看看你串口的实现程序,有没有加__irq,里面的数组有没有越界。。如果,定时器的中断可以使用,那么串口中断按理也不错。。你贴出串口中断处理程序看看哪。。。另外,一般irq中断模式下的stack是256B,如果你串口中断里面函数调用很复杂的话,可能越界。

楼上的讲得很有道理,我没有加_irp,
void UART0_Exception(void)
{
    uint8 IIR, temp, i;
   
    OS_ENTER_CRITICAL();

    while(((IIR = U0IIR) & 0x01) == 0)
    {                                                   /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                                  /* THRE中断    */
                for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */
                {
                    if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)
                    {
                        U0THR = temp;
                    }
                    else
                    {
                        U0IER = U0IER & (~0x02);        /* 队列空,则禁止发送中断 */
                    }
                }
                break;
            case 0x04:                                  /* 接收数据可用 */
            case 0x0c:                                  /* 字符超时指示 */
                do                                      /* 读取FIFO全部数据 */
                {
                        QueueWrite((void *)UART0_ReceiveBuf,U0RBR);
                }while((U0LSR & 0x00000001) != 0);
                break;
            case 0x06:
                    temp = U0LSR;
                    break;
            default :
                break;
        }
    }
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}


中断模式下
IRQ_Stack_Size  EQU     0x00000080
USR_Stack_Size  EQU     0x00000400
 
 
 

回复

97

帖子

7

TA的资源

一粒金砂(初级)

6
 
应该是我中断里面出错了。谢谢3楼。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
因为你的是移植了ucos-ii,所以ISR不要那个__irq.....
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 
想要知道为什么,加我为好友哦!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表