中断原理
ISR中断服务程序
中断配置的过程
配置gpio寄存器(略)
配置好gpio后,需要根据与触发gpio寄存器相对应的EXT_INT_?_CON,将其配置为相应的触发方式(上升触发等),
清除中断挂起标志,禁止中断屏蔽位
清除中断向量地址寄存器的数据,将中断服务函数的入口地址放入中断向量地址寄存器(复数)中
中断执行的过程
当一个中断触发时,cpu会读取向量地址寄存器,从中读出中断服务程序入口地址,
拿到中断服务程序入口地址后,cpu就会去执行中断服务函数,而这个中断服务函数的入口地址就存放在向量地址寄存器(复数)中。
(也就是说,中断一旦发生,存放于中断向量地址寄存器(复数)中的中断服务函数的入口地址就会被放在中断向量寄存器中)
*** 问题出来了,中断向量地址寄存器(复数)约有130个,基本与gpio寄存器数量相对应,那么二者是如何对应的呢?(GPH2_3对应v0_16)
内核中的中断其实都是假中断,仅仅是利用真正的中断去调用一个函数,然后立即结束中断而已,当假中断到来时,
内核中的进程调度被终止直到中断函数返回固定的返回宏,因此,当中断里出现问题时,内核会打印出大量的堆栈
信息,而不是直接crash
也就是说,内核会做这么一件事:
当我们在内核中注册一个中断时,内核会利用真实的中断去执行当前已经注册的中断选择,找出需要调用的中断服务函数(假),
因此,一个引脚可以注册多个中断服务函数(假)
若我们在内核环境下,或裸机环境下,不使用内核提供的中断注册流程,而是自己实现一个中断,那才是真正意义上的中断
s5pv210中除了GPH族寄存器以外,还有能够配置成中断的引脚吗?
内核中断实际流程:
注册一个真实中断,给其一个中断服务函数入口(真),然后当中断触发时,调用这个中断服务函数(真),在此函数内部,会开启一个内核线程,
然后让线程的入口函数为我们实际注册的中断入口函数,并且启动它,然后真中断结束,返回。而我们想要实现的中断实际运行在一个
暂停了所有进程调度的进程上下文中(笑),当线程函数结束后(其实就是我们的中断服务函数(假)),进程调度就会再次开始。
这样,有一个中断标志位的问题也可以解释清楚了
其他gpio的中断配置 见GPA0_INT
*** 中断源与引脚的对应关系
当使用EINT16-31号中断时,中断向量地址寄存器(复数)都使用0-16号寄存器,也就是说,gph族寄存器的中断基本都只对应中断向量地址寄存器(复数)0-16
那么,比如,当gph2-3被触发时,本应该调用EINT19中断,但cpu将中断向量地址寄存器(复数)0-16中中断服务函数地址搬运到中断向量地址寄存器中,
类似的,gph2-4,5,6等gpio引脚都是使用中断向量地址寄存器(复数)0-16寄存器,而前面的中断号则各自对应自己的中断向量地址寄存器(复数)
具体中断源对应关系 见芯片手册此关键字VECTORED INTERRUPT CONTROLLER
举例子,当使用一号定时器触发中断时,需要调用中断向量地址寄存器(复数)22中存放的中断服务函数地址。
其他gpio寄存器的中断则均使用GPIOINT,也就是第0组中断向量地址寄存器(复数)的30号
ISR中断服务程序
中断配置的过程
配置gpio寄存器(略)
配置好gpio后,需要根据与触发gpio寄存器相对应的EXT_INT_?_CON,将其配置为相应的触发方式(上升触发等),
清除中断挂起标志,禁止中断屏蔽位
清除中断向量地址寄存器的数据,将中断服务函数的入口地址放入中断向量地址寄存器(复数)中
中断执行的过程
当一个中断触发时,cpu会读取向量地址寄存器,从中读出中断服务程序入口地址,
拿到中断服务程序入口地址后,cpu就会去执行中断服务函数,而这个中断服务函数的入口地址就存放在向量地址寄存器(复数)中。
(也就是说,中断一旦发生,存放于中断向量地址寄存器(复数)中的中断服务函数的入口地址就会被放在中断向量寄存器中)
*** 问题出来了,中断向量地址寄存器(复数)约有130个,基本与gpio寄存器数量相对应,那么二者是如何对应的呢?(GPH2_3对应v0_16)
内核中的中断其实都是假中断,仅仅是利用真正的中断去调用一个函数,然后立即结束中断而已,当假中断到来时,
内核中的进程调度被终止直到中断函数返回固定的返回宏,因此,当中断里出现问题时,内核会打印出大量的堆栈
信息,而不是直接crash
也就是说,内核会做这么一件事:
当我们在内核中注册一个中断时,内核会利用真实的中断去执行当前已经注册的中断选择,找出需要调用的中断服务函数(假),
因此,一个引脚可以注册多个中断服务函数(假)
若我们在内核环境下,或裸机环境下,不使用内核提供的中断注册流程,而是自己实现一个中断,那才是真正意义上的中断
s5pv210中除了GPH族寄存器以外,还有能够配置成中断的引脚吗?
内核中断实际流程:
注册一个真实中断,给其一个中断服务函数入口(真),然后当中断触发时,调用这个中断服务函数(真),在此函数内部,会开启一个内核线程,
然后让线程的入口函数为我们实际注册的中断入口函数,并且启动它,然后真中断结束,返回。而我们想要实现的中断实际运行在一个
暂停了所有进程调度的进程上下文中(笑),当线程函数结束后(其实就是我们的中断服务函数(假)),进程调度就会再次开始。
这样,有一个中断标志位的问题也可以解释清楚了
其他gpio的中断配置 见GPA0_INT
*** 中断源与引脚的对应关系
当使用EINT16-31号中断时,中断向量地址寄存器(复数)都使用0-16号寄存器,也就是说,gph族寄存器的中断基本都只对应中断向量地址寄存器(复数)0-16
那么,比如,当gph2-3被触发时,本应该调用EINT19中断,但cpu将中断向量地址寄存器(复数)0-16中中断服务函数地址搬运到中断向量地址寄存器中,
类似的,gph2-4,5,6等gpio引脚都是使用中断向量地址寄存器(复数)0-16寄存器,而前面的中断号则各自对应自己的中断向量地址寄存器(复数)
具体中断源对应关系 见芯片手册此关键字VECTORED INTERRUPT CONTROLLER
举例子,当使用一号定时器触发中断时,需要调用中断向量地址寄存器(复数)22中存放的中断服务函数地址。
其他gpio寄存器的中断则均使用GPIOINT,也就是第0组中断向量地址寄存器(复数)的30号