木兰花 发表于 2018-10-31 23:05:30

SysTick_Handler的优先级高于其他外设中断优先级,所以外设执行中断服务程序时可能被SysTick_Handler中断打断,能这么理解吗?

如题:
1、SysTick_Handler的优先级高于其他外设的中断优先级,所以在外设执行中断服务程序时可能被SysTick_Handler中断打断,这么理解对吗?
2、为了外设的中断服务程序(优先级设置为最高)不被SysTick中断打断而破坏原子操作,所以在需要原子操作的中断服务程序中需要先关闭中断,完事后再开中断,理解对吗?
3、OS的任务切换原理是模拟了一次SVC中断触发,如果外设的中断和任务切换时模拟的SVC中断同时发生,由于SVC的中断优先级高于外设的,所以会执行SVC中断,再执行外设中断。即这种情况下会先切换任务,再执行外设的中断服务程序,这样理解对吗?如果对的话是不是对外设的中断响应有点延迟呢?
4、任何中断的优先级永远都比任何任务的优先级高,这个现象是芯片就是按照这个规则设计的还是其他什么原因呢?

谢谢

木兰花 发表于 2018-11-1 12:02:36

刚看了m3权威指南,我的问题我已经明白了。
1、会被systick打断,对
2、可以加开关中断的语句
3、这种情况下会产生一个pendsv中断,继续执行中断服务,完毕后再切换任务,具体见下图
4、可能就是这么设计的,任务的优先级是软件模拟设置的,中断的优先级是硬件设计的


myxiaonia 发表于 2018-11-1 12:58:23

本帖最后由 myxiaonia 于 2018-11-1 13:00 编辑

rtx的SysTick_Handler,pendsv是最低优先级,SVC比他们高一级以保证能够抢占他们,用户中断的优先级因此可以任意指定,rtx不会影响你的代码,它不会影响你,唯一一个注意到对方就是svc发生时要不要响应你的中断,你自己决定要不要比svc优先级高
本来SVC也可以设置为最低优先级,只不过由于cortex-m芯片设计的局限性,在某些临界情况下会出错,才设置了高一级

木兰花 发表于 2018-11-1 15:33:01

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
}



myxiaonia 发表于 2018-11-1 20:09:04

木兰花 发表于 2018-11-1 15:33
谢谢
请问对SVC 的中断优先级设置在哪里做的呢?pendsv和systick的优先级设置在下面的初始化中做了

...

就是这些代码

木兰花 发表于 2018-11-1 20:49:17

myxiaonia 发表于 2018-11-1 20:09
就是这些代码

哪个寄存器是设置SVC的呢?

木兰花 发表于 2018-11-1 21:03:10

myxiaonia 发表于 2018-11-1 20:09
就是这些代码

ucos-ii中配置systick,pendsv,SVC优先级的语句在哪里呢,知道不?
页: [1]
查看完整版本: SysTick_Handler的优先级高于其他外设中断优先级,所以外设执行中断服务程序时可能被SysTick_Handler中断打断,能这么理解吗?