5.3. 软件不可屏蔽中断
在进行VM擦写时系统会关闭总中断并操作系统flash,该过程耗时较长,可能会导致播歌卡顿或其他外设中断无法及时响应;
SDK提供了软件不可屏蔽中断,在关闭总中断的同时允许放出部分中断继续执行(例如放出audio中断优化操作vm卡音问题),该部分中断函数以及依赖的变量都需要放在ram里;
注:AD23N SDK在读写flash时关闭总中断,此时不能使用软件不可屏蔽中断。
本小节介绍软件不可屏蔽中断相关的接口与使用,流程如下:
软件不可屏蔽中断运行流程图
5.3.1. 函数void _OS_ENTER_CRITICAL(u32 bit_list)
该函数适用于中断总数为32的芯片(AD14N / AD15N / AD17N等),实现关闭总中断的同时放出bit_list参数中置1的中断,其中参数:
1、bit_list:需要单独放出的中断list,bit0~bit31分别对应0号~31号中断;
例如AD14N需要同时放出audio(中断号为9)和ticktimer中断(中断号为3);那么bit_list传入0x208即可;
5.3.2. 函数void _OS_ENTER_CRITICAL(u32 bit_list_l, u32 bit_list_h)
该函数适用于中断总数超过32,小于64的芯片(AD16N / AD18N等),实现关闭总中断的同时放出bit_list_l和bit_list_h参数中置1的中断,其中参数:
1、bit_list_l:需要单独放出的中断list的低32位,bit0~bit31分别对应0号~31号中断;
2、bit_list_h:需要单独放出的中断list的高32位,bit0~bit31分别对应32号~63号中断;
例如AD18N需要同时放出音频APA中断(中断号为37)和ticktimer(中断号为3),那么bit_list_h传入0x20,bit_list_l传入0x8即可;
5.3.3. 函数void _OS_ENTER_CRITICAL(IRQ_IDX_BITMAP *p_irq_bitmap)
该函数适用于中断号总数超过64的芯片(AD23N),实现关闭总中断的同时放出p_irq_bitmap参数中置1的中断,其中参数:
1、p_irq_bitmap->irq_0_31:需要单独放出的0号~31号中断,bit0~bit31分别对应0号~31号中断;
2、p_irq_bitmap->irq_32_63:需要单独放出的32号~63号中断,bit0~bit31分别对应32号~63号中断;
例如AD23N需要同时放出timer2中断(中断号为6)和ticktimer(中断号为3),那么p_irq_bitmap->irq_0_31=(BIT(IRQ_TICK_TMR_IDX) | BIT(IRQ_TIME2_IDX))即可;
5.3.4. 函数void _OS_EXIT_CRITICAL(void)
该函数实现恢复中断配置并退出关中断状态;
5.3.5. 函数void vm_isr_response_index_register(u8 index)
注:该函数AD23N不适用
SDK中存在一个全局变量用于存储需要放出来的中断list,该函数实现往该变量中添加中断bit,其中参数:
1、index:需要添加的不屏蔽中断号;例如AD14N的audio中断号为9,则传入9即可;
5.3.6. 函数void vm_isr_response_index_unregister(u8 index)
注:该函数AD23N不适用
该函数实现恢复中断配置并退出关中断状态,其中参数:
1、index:删除已添加的不屏蔽中断号;
5.3.7. 函数u32 get_vm_isr_response_index_l(void)
该函数实现获取全局的不可屏蔽中断list的低32位,其中:
1、对于中断总数为32的芯片,获取到完整的bit_list;
2、对于中断总数超过32且少于64的芯片,获取到低32位中断的bit_list;
5.3.8. 函数u32 get_vm_isr_response_index_h(void)
该函数实现获取全局的不可屏蔽中断list的高32位,仅中断总数超过32且少于64的芯片有该接口;