您的位置:首页 > 其它

《小谈DJYOS中断线的配置方法》

2015-05-18 14:03 99 查看
中断是嵌入式系统中一个魅力十足亮点, 关于DJYOS对中断的内部巧妙的处理机制,各位看官可阅读《都江堰操作系统与嵌入式系统设计》中第六章节“中断”相关内容以及DJYOS源码中int.c/int.h中相关内容。本文探讨两点:DJYOS中中断处理流程以及如何将自己板子上的中断快速地挂接到DJYOS的中断系统。

DJYOS中断控制块的结构示意图如图1所示:



图1 DJYOS中断控制块结构示意图
在图1所示中中断线可以理解为中断向量表中的某个中断向量,一个中断向量可对应一个或者多个中断源,也就说某个中断线有可能被多个中断源触发而接通,在中断ISR内部可判断具体是哪个中断源触发。DJYOS将中断类型分为实时中断和异步信号。实时中断对应紧急程度非常高的中断信号,异步信号对应紧急程度不是很高的中断信号,实时中断可打断异步信号,实时中断中又可实现嵌套,实时中断ISR中不可使用系统的调度功能。关于实时中断和异步信号的详细区别参考《都江堰操作系统与嵌入式系统设计》中第六章节“中断”相关内容。每个中断可自由配置为实时中断或者异步信号。当某个中断源产生中断请求即可使能某个特定中断线使能开关,如果是异步信号,还需使能异步信号总开关,最后接通中断总开关即可使CPU处理中断请求。

DJYOS中中断执行流程如下:中断源产生中断请求IRQ-->跳转至中断向量表中查询相应ISR及中断号-->保存现场-->调用DJYOS的中断入口函数int_engine_all-->判断中断类别(real或sync)-->调用用户注册的中断服务函数——返回至ISR并恢复现场——中断返回。

OK,了解了DJYOS的中断处理流程,如何将中断源挂接到图1所示DJYOS的中断控制块上呢?归纳以下,需要以下3个步骤,

Step1:在cpu_peri_int_line.h中定义中断号,每款CPU都定义自己的中断源及中断号,发生中断号后,硬件会根据这个中断号跳转到中断向量表中相应的位置执行中断ISR,这里需要确保定义的中断号与该款CPU datasheet中定义中断号保持一致。

Step2:在critical.c中配置当前工程使用到的中断号,具体配置方法为在全局数组tg_IntUsed添加相应的中断号,如MCB1700工程中配置的

const
ufast_t tg_IntUsed[] =
{
CN_INT_LINE_UART0,
CN_INT_LINE_UART1,
CN_INT_LINE_RTC,
CN_INT_LINE_WDT,
CN_INT_LINE_ENET,
CN_INT_LINE_TIMER0,
CN_INT_LINE_TIMER1,
CN_INT_LINE_TIMER2,
CN_INT_LINE_TIMER3,
CN_INT_LINE_SSP0,
CN_INT_LINE_SSP1
};

Step3:对于使用具体中断时,需要依次调用以下5个函数:

1.bool_t Int_SetClearType(ufast_t ufl_line,ufast_t clear_type) //设置某中断线的应答方式

2.void Int_IsrConnect(ufast_t ufl_line, u32 (*isr)(ufast_t)) //关联中断线与ISR

3.bool_t Int_SettoAsynSignal(ufast_t ufl_line)/ bool_t Int_SettoReal(ufast_t ufl_line) //设置中断为异步信号or实时中断

4.bool_t Int_ClearLine(ufast_t ufl_line) //清除相应中断线的中断挂起状态

5.bool_t Int_RestoreAsynLine(ufast_t ufl_line)/ bool_t Int_RestoreRealLine(ufast_t ufl_line) //恢复保存的异步信号或实时中断中断线状态(与第3个函数保持一致)

完成了以上3个步骤,你就可将自己的中断ISR函数在DJYOS中运转起来了。当然这里还有一个前提就是你手头上的板子关于DJYOS的中断移植部分(即bsp目录下int_hard.c/int_hard.h)已经完成,关于这部分下次再唠叨唠叨。

上文如有不当之处,敬请指正,欢迎拍砖~~~

欢迎访问个人主页:www.djyos.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: