前几天,遇到一位网友纠结于MSP432的中断优先级问题,给了一些解题思路,对方还是没解决,感觉问题不简单啊。 本着有困难自己上的原则,花了两三天时间,阅读了MSP432P401R的数据手册和用户手册,同时参考了SDK的两个中断代码,在launchpad上简单验证后,梳理了下几个知识点供参考。
关于msp432中断的理解更新如下:
1、每一个中断,对应的一个中断号(可查看数据手册p118); 数值小的优先级高, 称为硬件优先级;中断0的优先级最高;
2、MSP432支持用户通过软件修改中断优先级. 每个中断的软件优先级可以用一个8Bit的数据来表示(即0~255), 一般,数字小的优先级高(其实讨论这个没太大意义),但是不绝对! 因为,MSP432系统在判断 软件优先级时只使用了高3位,低5位会强行清零. 也就是说,优先级可以归结为8个大类: 0x00,0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0。可以称为 组优先级。
3、MSP432支持中断嵌套; 必须设置成不同的组优先级。(可以理解为如果不设置不同的组优先级,则不支持中断嵌套) 例如,如果中断1的组优先级高于中断2的组优先级,那么中断1可以抢占中断2. 也就是,中断2正在处理中断时,会被中断1打断,实现中断嵌套。 4、组优先级相同的中断,相互之间不能抢占. 如果中断的组优先级相同,则PK的是默认的硬件优先级,这点很关键。 系统复位后,软件优先级寄存器的默认值为0,可理解为所有的中断都处于同一个组优先级中(0x00组优先级). 此时,硬件优先级决定着中断的处理顺序.
举例1: 系统复位后,不对优先级进行任何设置.系统中有三个中断: 中断A, 中断号5; 中断B, 中断号6; 中断C, 中断号7; 分析,因为,5<6<7, 所以, 硬件优先级, 中断A 优先于 中断B 优先于 中断C。
假设系统正在处理中断B,此时, 中断A 和 中断C发生了,系统会怎么处理呢?
因为中断ABC的组优先级相同, 不能抢占,系统继续处理当前的中断B, 而中断A和中断C也处于挂起状态,等候处理; 当中断B处理完成后,系统查询当前的中断状态. 发现A和C都处于挂起状态, 而A的优先级高于C, 所以,优先处理中断A. 处理完A之后,继续查询当前的系统中断状态,如果只剩C,也继续处理中断C。
举例2: 容易设置错误的解析. 例如,中断A和中断B, 中断A的硬件优先级高于中断B; 设置中断A的软件优先级为0x21,中断B的软件优先级为0x20. 不能简单的通过软件优先值的大小, 0x20<0x21, 得出错误的结论 中断B的优先级高于中断A. 实际上,设置0x20和0x21 是一样的效果(组优先级相同,只看最高3个比特位), 都使用有效值0x20. 具体的优先级取决于硬件优先级. 所以,中断A的优先级还是要高于中断B。
|