SysTick_Handler的优先级高于其他外设中断优先级,所以外设执行中断服务程序时可能被SysTick_Handler中断打断,能这么理解吗?
如题:1、SysTick_Handler的优先级高于其他外设的中断优先级,所以在外设执行中断服务程序时可能被SysTick_Handler中断打断,这么理解对吗?
2、为了外设的中断服务程序(优先级设置为最高)不被SysTick中断打断而破坏原子操作,所以在需要原子操作的中断服务程序中需要先关闭中断,完事后再开中断,理解对吗?
3、OS的任务切换原理是模拟了一次SVC中断触发,如果外设的中断和任务切换时模拟的SVC中断同时发生,由于SVC的中断优先级高于外设的,所以会执行SVC中断,再执行外设中断。即这种情况下会先切换任务,再执行外设的中断服务程序,这样理解对吗?如果对的话是不是对外设的中断响应有点延迟呢?
4、任何中断的优先级永远都比任何任务的优先级高,这个现象是芯片就是按照这个规则设计的还是其他什么原因呢?
谢谢
刚看了m3权威指南,我的问题我已经明白了。
1、会被systick打断,对
2、可以加开关中断的语句
3、这种情况下会产生一个pendsv中断,继续执行中断服务,完毕后再切换任务,具体见下图
4、可能就是这么设计的,任务的优先级是软件模拟设置的,中断的优先级是硬件设计的
本帖最后由 myxiaonia 于 2018-11-1 13:00 编辑
rtx的SysTick_Handler,pendsv是最低优先级,SVC比他们高一级以保证能够抢占他们,用户中断的优先级因此可以任意指定,rtx不会影响你的代码,它不会影响你,唯一一个注意到对方就是svc发生时要不要响应你的中断,你自己决定要不要比svc优先级高
本来SVC也可以设置为最低优先级,只不过由于cortex-m芯片设计的局限性,在某些临界情况下会出错,才设置了高一级
myxiaonia 发表于 2018-11-1 12:58
rtx的SysTick_Handler,pendsv是最低优先级,SVC比他们高一级以保证能够抢占他们,用户中断的优先级因此可 ...
谢谢
请问对SVC 的中断优先级设置在哪里做的呢?pendsv和systick的优先级设置在下面的初始化中做了
NVIC_SYS_PRI3 设置了systick的优先级为0xff
NVIC_SYS_PRI2 设置了pendsv的优先级为0xfc
svc的在哪里设置了?
__inline void rt_systick_init (void) {
NVIC_ST_RELOAD= os_trv;
NVIC_ST_CURRENT = 0;
NVIC_ST_CTRL = 0x0007;
NVIC_SYS_PRI3|= 0xFF000000;
}
__inline void rt_svc_init (void) {
#if !(__TARGET_ARCH_6S_M)
int sh,prigroup;
#endif
NVIC_SYS_PRI3 |= 0x00FF0000;
#if (__TARGET_ARCH_6S_M)
NVIC_SYS_PRI2 |= (NVIC_SYS_PRI3<<(8+1)) & 0xFC000000;
#else
sh = 8 - __clz (~((NVIC_SYS_PRI3 << 8) & 0xFF000000));
prigroup = ((NVIC_AIR_CTRL >> 8) & 0x07);
if (prigroup >= sh) {
sh = prigroup + 1;
}
NVIC_SYS_PRI2 = ((0xFEFFFFFF << sh) & 0xFF000000) | (NVIC_SYS_PRI2 & 0x00FFFFFF);
#endif
}
木兰花 发表于 2018-11-1 15:33
谢谢
请问对SVC 的中断优先级设置在哪里做的呢?pendsv和systick的优先级设置在下面的初始化中做了
...
就是这些代码 myxiaonia 发表于 2018-11-1 20:09
就是这些代码
哪个寄存器是设置SVC的呢? myxiaonia 发表于 2018-11-1 20:09
就是这些代码
ucos-ii中配置systick,pendsv,SVC优先级的语句在哪里呢,知道不?
页:
[1]