SylixOS 共用中断号机制

发布者:朱颜素韵最新更新时间:2022-07-04 来源: csdn关键字:SylixOS 手机看文章 扫描二维码
随时随地手机看文章

1.原理概述


SylixOS开发人员在编写中断驱动时经常会遇到多个中断源共用一个中断号的情况,但在驱动中为了保证代码独立性,各个外设的中断服务函数应该放在各自的C文件中编写,用统一的中断服务函数是不合理的。为了适应这种情况,SylixOS支持队列类型中断向量,即SylixOS内核将同一中断向量号的多个中断服务函数链接成队列,执行时依次执行。


2.技术实现


2.1应用举例


下面以at91sam9x25处理器为例,该处理器的调试串口,tick时钟等外设共用1号中断向量。如图2-1所示。

图2-1 中断向量


中断向量详见AT91SAM9X25芯片手册8.2节Peripheral Identifiers部分。


2.2代码分析


SylixOS开发人员需要将1号中断向量设置成队列类型中断向量,设置方法如程序清单1所示。


程序清单 1 中断初始化

image.png

bspIntInit函数位于bspLib.c中,用来初始化中断控制器


ID_SYS是1号中断向量,LW_IRQ_FLAG_QUEUE宏是队列类型中断向量的标志,该标志必须在安装任何一个驱动前设置, 且设置后不能再取消,因此应该在 bspIntInit函数中完成设置。


API_InterVectorSetFlag函数用来设置中断向量属性,代码实现如程序清单2所示。


程序清单 2 中断向量属性设置函数

image.png

设置完成后,不同外设多次调用API_InterVectorConnect 函数设置1号中断向量的多个中断服务函数,以AT91SAM9X25 调试串口中断服务函数和tick时钟中断服务函数为例,如程序清单3、程序清单4所示。


程序清单 3 tick中断服务函数安装

image.png

程序清单 4  串口中断服务函数安装

image.png

Tick和串口中断向量号均为1。


API_InterVectorConnect函数将中断向量号和中断服务函数进行挂接时,会判断中断向量是否是队列类型中断向量,若是队列类型中断向量,则将中断服务函数加入中断队列,部分代码实现如程序清单5所示。


程序清单 5 中断服务函数挂接

image.png

当产生中断并执行中断服务函数时,SylixOS内核总中断服务函数API_InterVectorIsr会找到对应中断号的中断服务函数链表,并遍历链表,部分代码如程序清单6所示。


程序清单 6 总中断服务函数

image.png

由程序清单6可知,当中断向量号是队列类型中断向量时,中断服务函数返回值显得尤为重要,为0时表示中断函数未被处理,返回值为1时表示中断函数已经被处理,所以串口中断服务函数编写如程序清单7所示。


程序清单 7 串口中断函数

image.png

Tick中断服务函数编写如程序清单8所示。


程序清单 8 tick中断函数

image.png

SylixOS开发人员在编写单向量、多中断中断服务函数时,中断服务函数中应该首先读取具体外设的状态寄存器以判断是否是该外设产生的中断,否则会进入其他外设中断,结束遍历中断服务函数链表,导致错误。


关键字:SylixOS 引用地址:SylixOS 共用中断号机制

上一篇:sam9x5平台搭建及rt3070驱动移植总结
下一篇:linux i2c 设备测试,i2c-dev驱动测试代码

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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