搜索
bottom↓
回复: 1

统一的中断处理函数设计问题

[复制链接]

出0入0汤圆

发表于 2009-7-3 11:31:30 | 显示全部楼层 |阅读模式
/* -----------------------------------------------------------------------
*                              EOSIrqHandle( void )
* 功能: 统一的中断处理句柄
* 参数: 无
* 返回值:无
* 说明: 无
* ----------------------------------------------------------------------- */
void    EOSIrqHandle( uint8 vect ) __attribute__((naked))
{
    IRQ_ENTRY  entry;
    uint8   vect;
    OS_ARCH_VAR;

    ARCH_IRQ_DISABLE_ALL();                                         /* 关中断               */
    ARCH_SAVE_CONTEXT();                                            /* 保存上下文           */

    if( irq_cnt < 255 )                                             /* 中断计数增1           */
    {
        irq_cnt++;
        if( irq_cnt == 1 )
        {
            OSTCBCur->stk_top = ARCH_GET_SP();                      /* 保存堆栈指针          */
            ARCH_SET_SP( &irq_stk[ EOS_IRQ_STK_LEN - 1 ] );         /* 使用专用的堆栈区      */
        }
    }

//    vect = ARCH_GET_VECT();                                         /* 取发生的中断向量号    */
    entry = irq_tbl[vect].irq;

    ARCH_IRQ_ENABLE_ALL();

    if( entry != ( IRQ_ENTRY  )0 )                                 /* 调用相应的中断处理函数 */
        ( * entry )( );

    if( --irq_cnt == 0 )                                            /* 如果是在中断最外层,调度 */
    {
        OSScheduler();
    }
}

  如上面的代码所示,我想让ATMEGA32的所有中断由统一的处理函数EOSIrqHandle处理.
  我的问题主要在于如何让EOSIrqHandle能获取发生的中断的向量号.像S3c44box这样的芯片,可以都过查询某些寄存器来确定.
但atmega32可供查询的寄存器较多,我想如果通过检测这些寄存器的标志位来判定中断是否发生,显然效率太低.另一种方面是再为
每个中断写一个简单的ISR处理程序,在该ISR里,可直接将向量号通过参数传递给EOSIrqHandle,再调用EOSIrqHandle.但这样
做的话,EOSIrqHandle的结构需要重写,并且上下文保存,堆栈指针保存的C代码,必须放到小的ISR中去了.

  我只看过ucos的中断管理方法,比较烦琐.有没有人能提供一种更好点的中断管理方式?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-7-6 22:50:47 | 显示全部楼层
有,你得自己改
除了时钟节拍中断需要每次都保护所有的现场
其余中断先让编译器保护现场
关中断
nesting+1
开中断
然后根据中断处理函数里面是否有高优先级任务触发来置一个标志位,例如missedScheduler
nesting-1
if(missedScheduler)
{ARCH_SAVE_CONTEXT();                                            /* 保存上下文           */
OSScheduler();
}
这样就可以了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 14:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表