硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3240|回复: 6
收起左侧

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

[复制链接]

18

主题

285

回帖

339

积分

高级会员

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

谢谢

回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 2018-11-1 12:02:36 | 显示全部楼层
刚看了m3权威指南,我的问题我已经明白了。
1、会被systick打断,对
2、可以加开关中断的语句
3、这种情况下会产生一个pendsv中断,继续执行中断服务,完毕后再切换任务,具体见下图
4、可能就是这么设计的,任务的优先级是软件模拟设置的,中断的优先级是硬件设计的
2222.png

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-11-1 12:58:23 | 显示全部楼层
本帖最后由 myxiaonia 于 2018-11-1 13:00 编辑

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

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 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的在哪里设置了?

  1. __inline void rt_systick_init (void) {
  2.   NVIC_ST_RELOAD  = os_trv;
  3.   NVIC_ST_CURRENT = 0;
  4.   NVIC_ST_CTRL    = 0x0007;
  5.   NVIC_SYS_PRI3  |= 0xFF000000;
  6. }

  7. __inline void rt_svc_init (void) {
  8. #if !(__TARGET_ARCH_6S_M)
  9.   int sh,prigroup;
  10. #endif
  11.   NVIC_SYS_PRI3 |= 0x00FF0000;
  12. #if (__TARGET_ARCH_6S_M)
  13.   NVIC_SYS_PRI2 |= (NVIC_SYS_PRI3<<(8+1)) & 0xFC000000;
  14. #else
  15.   sh       = 8 - __clz (~((NVIC_SYS_PRI3 << 8) & 0xFF000000));
  16.   prigroup = ((NVIC_AIR_CTRL >> 8) & 0x07);
  17.   if (prigroup >= sh) {
  18.     sh = prigroup + 1;
  19.   }
  20.   NVIC_SYS_PRI2 = ((0xFEFFFFFF << sh) & 0xFF000000) | (NVIC_SYS_PRI2 & 0x00FFFFFF);
  21. #endif
  22. }
复制代码




回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-11-1 20:09:04 | 显示全部楼层
木兰花 发表于 2018-11-1 15:33
谢谢
请问对SVC 的中断优先级设置在哪里做的呢?pendsv和systick的优先级设置在下面的初始化中做了

...

就是这些代码
回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 2018-11-1 20:49:17 | 显示全部楼层

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

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 2018-11-1 21:03:10 | 显示全部楼层

ucos-ii中配置systick,pendsv,SVC优先级的语句在哪里呢,知道不?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 11:35 , Processed in 0.237789 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表