滴答定时器SysTick的中断优先级为什么设置为15?即最低优先级?

在,FreeRTOS中,中断优先级 和 任务优先级 不是一个东西。中断可以打断任意的任务。但是任务不可以打断中断。所以在RTOS中把systick的中断优先级设置为15,即最低,是为了保证系统任务切换不会影响别的中断的进行。当然别的中断影响了系统任务的切换是存在的,也是可以接受的。
在裸机开发中,滴答定时器中断常被用于延时函数的定时节拍。为什么也要把systick的中断优先级设置为15,即最低优先级?答:目的是为了保证其他中断的正常运行,我们不能为了一个小小的延时功能就耽误其他重要中断的响应。因此,滴答定时器延时是不太准确的,因为别的中断会打断他。基于此,我们禁止在中断服务函数中调用延时函数。若是想在中断服务函数实现延时功能,那么就使用定时器来实现延时,不要使用滴答定时器进行延时。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/wanghao312/article/details/136503826

### Tick 中断配置 Tick中断作为实时操作系统(RTOS)中的时钟基准,对于任务切换至关重要[^1]。在嵌入式系统开发中,通常通过硬件定时器来实现tick中断功能。 #### 配置硬件定时器用于Tick中断 当选用特定的定时器如TIM2时,需确保其全局中断被正确使能并合理设定其中断优先级[^2]。这一步骤可通过STM32CubeMX工具完成初步配置: - **选择合适的定时器**:根据项目需求挑选适合做为tick源的定时器。 - **调整中断属性**:确认该定时器中断已启用,并适当调节其抢占和响应优先级别以满足整体系统的实时性要求。 #### Systick与PendSV配合工作原理 具体来说,在`xPortSysTickHandler()`函数内部实现了对PendSV中断的触发操作[^3]。每当发生一次systick事件时,除了更新RTOS的时间计数外,还会检查是否有待处理的任务上下文切换请求;若有,则通过设置特殊寄存器位的方式激活PendSV异常,最终由后者负责实际的任务切换逻辑执行。 ```c void xPortSysTickHandler(void) { portBASE_TYPE xHigherPriorityTaskWoken; /* 关闭中断 */ portDISABLE_INTERRUPTS(); { /* 增加RTOS滴答次数 */ if (xTaskIncrementTick() != pdFALSE) { /* 请求进行上下文切换 */ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } /* 清除任何可能存在的挂起状态 */ *(portNVIC_ICPR) = portNVIC_SYSTICK_IRQ; } /* 开启中断 */ portENABLE_INTERRUPTS(); } ``` 这段代码展示了如何在一个典型的ARM Cortex-M架构处理器上实现基本的tick中断服务程序(ISR),它不仅完成了时间增量的操作还准备好了后续可能发生的状态转移准备工作。 ### 处理因中断优先级不当引起的问题 如果遇到仅首次进入外部中断的情况,很可能是由于系统滴答定时器(System tick timer)的中断优先级低于其他外围设备所引发的问题[^4]。为了避免此类冲突,建议遵循以下原则: - 系统滴答定时器应具有较高的优先权以便及时响应; - 对于依赖延迟函数(`HAL_Delay`)的应用场景,务必保证System tick timer 的优先级高于所有使用此API的地方; - 当不同任务间存在明显的优先级差异时,推荐采用基于RTOS API (`osDelay`)而非标准库提供的阻塞等待方法来进行延时期望管理[^5]。 这样既能保障RTOS核心机制正常运作又能有效防止某些低优度进程长期得不到CPU资源分配而陷入饥饿状态的现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值