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 中断初始化
bspIntInit函数位于bspLib.c中,用来初始化中断控制器。
ID_SYS是1号中断向量,LW_IRQ_FLAG_QUEUE宏是队列类型中断向量的标志,该标志必须在安装任何一个驱动前设置, 且设置后不能再取消,因此应该在 bspIntInit函数中完成设置。
API_InterVectorSetFlag函数用来设置中断向量属性,代码实现如程序清单2所示。
程序清单 2 中断向量属性设置函数
设置完成后,不同外设多次调用API_InterVectorConnect 函数设置1号中断向量的多个中断服务函数,以AT91SAM9X25 调试串口中断服务函数和tick时钟中断服务函数为例,如程序清单3、程序清单4所示。
程序清单 3 tick中断服务函数安装
程序清单 4 串口中断服务函数安装
Tick和串口中断向量号均为1。
API_InterVectorConnect函数将中断向量号和中断服务函数进行挂接时,会判断中断向量是否是队列类型中断向量,若是队列类型中断向量,则将中断服务函数加入中断队列,部分代码实现如程序清单5所示。
程序清单 5 中断服务函数挂接
当产生中断并执行中断服务函数时,SylixOS内核总中断服务函数API_InterVectorIsr会找到对应中断号的中断服务函数链表,并遍历链表,部分代码如程序清单6所示。
程序清单 6 总中断服务函数
由程序清单6可知,当中断向量号是队列类型中断向量时,中断服务函数返回值显得尤为重要,为0时表示中断函数未被处理,返回值为1时表示中断函数已经被处理,所以串口中断服务函数编写如程序清单7所示。
程序清单 7 串口中断函数
Tick中断服务函数编写如程序清单8所示。
程序清单 8 tick中断函数
SylixOS开发人员在编写单向量、多中断中断服务函数时,中断服务函数中应该首先读取具体外设的状态寄存器以判断是否是该外设产生的中断,否则会进入其他外设中断,结束遍历中断服务函数链表,导致错误。
上一篇:sam9x5平台搭建及rt3070驱动移植总结
下一篇:linux i2c 设备测试,i2c-dev驱动测试代码
设计资源 培训 开发板 精华推荐
- LT6656BCS6-3.3、3.3V 低功率 ADC 电压基准的典型应用
- 智能插头
- NCP11185A130P38WGEVB:使用 NCP11185A130 的白色家电和工业设备的 38 W 辅助电源
- 【航顺训练营】基于航顺HKF030的学习板设计+994718A
- LTC2600IUFD 八通道、16 位数模转换器的典型应用
- 使用 Cypress Semiconductor 的 S6AP413A2BGN1C000 的参考设计
- MCP6S22DM-PICTL、PGA PICtail 演示板评估和演示 MCP6S22 可编程和 MCP6S91/2/3 增益放大器(PGA)
- LT1172CSW、-10 至 -26/1.25A LCD 对比度电源的典型应用
- LT3007ETS8-3.3 用于最后喘息电路的低压差线性稳压器的典型应用电路
- 小马哥STM32F1主控720空心杯四轴飞行器资料(包含源代码和相关教程)