FreeRTOS系列五:任务的挂起与恢复的API函数(理论)

 FreeRTOS实时内核使用指南中

 

将一个任务从挂起态恢复到就绪态,只有通过函数 vTaskSuspend()设置为挂起态的任务才 可以使用 vTaskRexume()恢复!

如果有用户中断函数调用到freertos提供的系统函数,一定要使用带FromISR的freertos提供的系统函数,并且这个用户中断的优先级一定要在configKERNEL_INTERRUPT_PRIORITY和configMAX_SYSCALL_INTERRUPT_PRIORITY的优先级之间,一般configKERNEL_INTERRUPT_PRIORITY设置为单片机最低优先级,configMAX_SYSCALL_INTERRUPT_PRIORITY是FreeRTOS系统能够屏蔽的最高优先级规定中断优先级比configMAX_SYSCALL_INTERRUPT_PRIORITY高不能调用FreeRTOS API(如此高的中断优先级,已经不在FreeRTOS系统控制范围内,下面有说到,为了确保关键部分的完整性和一致性,通常会采取以下措施:关中断,在进入关键部分之前,可以通过禁用中断的方式来阻止更高优先级的中断发生,所以中断的优先级不能太高)。一个优先级优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断发生了并且调用了系统API这样他就有可能打破低优先级中断的链表操作导致内核数据的毁坏。

官网的解释:RTOS for ARM Cortex-M (freertos.org)

使用 RTOS 时的相关性

以 "FromISR" 结尾的 FreeRTOS 函数是中断安全的,但前提是 调用这些函数的中断的逻辑优先级不高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 定义的优先级(configMAX_SYSCALL_INTERRUPT_PRIORITY 在 FreeRTOSConfig.h 头文件中定义)。 因此,对于任何使用一个 RTOS API 函数的中断服务程序, 必须为其手动设置为一个数值优先级, 这个值必须等于或大于 configMAX_SYSCALL_INTERRUPT_PRIORITY 设定 的值。 这确保了中断的逻辑优先级等于或小于 configMAX_SYSCALL_INTRUPT_PRIORITY 设置。

Cortex-M 中断的默认数值优先级为 0。 0 是最高的 优先级。 因此,切勿将使用中断安全 RTOS API 的中断的优先级 保留为其默认值

在抢占式内核中,更高优先级的中断可以在低优先级中断的关键部分执行期间打断它。这是抢占式内核的特性,允许高优先级任务或中断打断当前正在执行的任务。

在实时操作系统中,为了确保关键部分的完整性和一致性,通常会采取以下措施:

  1. 关中断:在进入关键部分之前,可以通过禁用中断的方式来阻止更高优先级的中断发生。这样可以保证关键部分的执行不会被打断。所以如果这个中断不在FreeRTOS的控制范围中,那么操作系统也没有办法控制了。

  2. 然而,这种方法需要谨慎使用,因为禁用中断可能导致其他问题,如时钟节拍延迟、响应性下降等。

  3. 临界区保护:使用临界区保护机制,例如临界区禁止抢占或互斥锁,在关键部分的开始和结束位置加上临界区保护。这样可以确保同一时间只有一个任务或中断能够进入关键部分。这种方法可以在一定程度上避免并发访问共享资源的问题。

  4. 状态标志:在关键部分的开始和结束位置设置状态标志,例如使用原子操作或标志位。其他中断或任务可以通过检查状态标志来判断是否可以执行关键部分相关的任务。

参考:

这里可以看一下为什么中断优先级一定要在操作系统的管辖之内

 FreeRTOS - 中断使用注意 - 流水灯 - 博客园 (cnblogs.com)

猜你喜欢

转载自blog.csdn.net/qq_51519091/article/details/131491909