|
/* -----------------------------------------------------------------------
* 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周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|