FreeRTOS api库函数 之 RTOS Kernel Control(内核控制)

taskYIELD
taskYIELD()用于请求上下文切换到另一个任务。 但是,如果没有其他任务以高于或等于调用taskYIELD()的任务的优先级,那么RTOS调度程序将只选择调用taskYIELD()再次运行的任务。
如果configUSE_PREEMPTION设置为1,那么RTOS调度程序将始终运行能够运行的最高优先级任务,因此调用taskYIELD()将永远不会导致切换到更高优先级的任务。

taskENTER_CRITICAL()
taskEXIT_CRITICAL()
void taskENTER_CRITICAL(void);
void taskEXIT_CRITICAL(void);

通过调用taskENTER_CRITICAL()输入关键部分,然后通过调用taskEXIT_CRITICAL()退出。
taskENTER_CRITICAL()和taskEXIT_CRITICAL()宏提供了一个基本的关键部分实现,它通过简单地全局或中断特定中断优先级来禁用中断。
如果使用的FreeRTOS端口未使用configMAX_SYSCALL_INTERRUPT_PRIORITY内核配置常量(也称为configMAX_API_CALL_INTERRUPT_PRIORITY),则调用taskENTER_CRITICAL()将使全局禁用中断。如果正在使用的FreeRTOS端口确实使用了configMAX_SYSCALL_INTERRUPT_PRIORITY内核配置常量,则调用taskENTER_CRITICAL()将在禁用configMAX_SYSCALL_INTERRUPT_PRIORITY设置的中断优先级和低于中断优先级的情况下保留中断,并启用所有更高优先级的中断。
抢占式上下文切换仅发生在中断内,因此在禁用中断时不会发生。因此,调用taskENTER_CRITICAL()的任务保证保持在Running状态,直到退出临界区,除非任务显式尝试阻塞或屈服(在临界区内不应该这样做)。
对taskENTER_CRITICAL()和taskEXIT_CRITICAL()的调用旨在嵌套。因此,只有在每次调用taskENTER_CRITICAL()时对taskEXIT_CRITICAL()执行一次调用时,才会退出临界区。
关键部分必须保持很短,否则会对中断响应时间产生不利影响。每次调用taskENTER_CRITICAL()都必须与对taskEXIT_CRITICAL()的调用紧密配对。
不得在关键部分内调用FreeRTOS API函数。
不得从中断服务例程(ISR)调用taskENTER_CRITICAL()和taskEXIT_CRITICAL()

taskENTER_CRITICAL_FROM_ISR()
taskEXIT_CRITICAL_FROM_ISR()
UBaseType_t taskENTER_CRITICAL_FROM_ISR(void);
void taskEXIT_CRITICAL_FROM_ISR(UBaseType_t uxSavedInterruptStatus);

可以在中断服务例程(ISR)中使用的taskENTER_CRITICAL()和taskEXIT_CRITICAL()的版本。
在ISR中,通过调用taskENTER_CRITICAL_FROM_ISR()输入关键部分,然后通过调用taskEXIT_CRITICAL_FROM_ISR()退出。
taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()宏提供了一个基本的关键部分实现,它通过简单地全局或中断特定中断优先级来禁用中断。
如果使用的FreeRTOS端口支持中断嵌套,则调用taskENTER_CRITICAL_FROM_ISR()将禁用由configMAX_SYSCALL_INTERRUPT_PRIORITY(或configMAX_API_CALL_INTERRUPT_PRIORITY)内核配置常量设置的中断优先级以及低于中断的中断,并保持启用所有其他中断优先级。如果使用的FreeRTOS端口不支持中断嵌套,则taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()将不起作用。
对taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()的调用被设计为嵌套,但是如何使用宏的语义与taskENTER_CRITICAL()和taskEXIT_CRITICAL()等价物不同。
关键部分必须保持很短,否则会对优先级较高的中断的响应时间产生不利影响。每次调用taskENTER_CRITICAL_FROM_ISR()都必须与对taskEXIT_CRITICAL_FROM_ISR()的调用紧密配对。
不得在关键部分内调用FreeRTOS API函数。
参数:
    uxSavedInterruptStatus  taskEXIT_CRITICAL_FROM_ISR()将uxSavedInterruptStatus作为其唯一参数。用作uxSavedInterruptStatus参数的值必须是从对taskENTER_CRITICAL_FROM_ISR()的匹配调用返回的值。
    taskENTER_CRITICAL_FROM_ISR()不接受任何参数。
返回:
    taskENTER_CRITICAL_FROM_ISR()返回调用宏之前的中断屏蔽状态。 taskENTER_CRITICAL_FROM_ISR()返回的值必须在taskEXIT_CRITICAL_FROM_ISR()的匹配调用中用作uxSavedInterruptStatus参数。
    taskEXIT_CRITICAL_FROM_ISR()不返回值。

taskDISABLE_INTERRUPTS()
如果使用的端口支持configMAX_SYSCALL_INTERRUPT_PRIORITY(或configMAX_API_CALL_INTERRUPT_PRIORITY)常量,则taskDISABLE_INTERRUPTS将禁用所有中断,或者屏蔽(禁用)中断直到configMAX_SYSCALL_INTERRUPT_PRIORITY设置。 检查正在使用的端口的taskDISABLE_INTERRUPTS的实现。
如果正在使用的端口不支持configMAX_SYSCALL_INTERRUPT_PRIORITY常量,则taskDISABLE_INTERRUPTS()将全局禁用所有可屏蔽中断。
通常不会直接调用此宏,并且应该在其位置使用taskENTER_CRITICAL()和taskEXIT_CRITICAL()。

taskENABLE_INTERRUPTS()
宏用于启用微控制器中断。
通常不会直接调用此宏,并且应该在其位置使用taskENTER_CRITICAL()和taskEXIT_CRITICAL()。

vTaskStartScheduler
void vTaskStartScheduler(void);

启动RTOS调度程序。 在调用RTOS内核后,可以控制执行哪些任务以及何时执行。
启动RTOS调度程序时,将自动创建空闲任务和可选的计时器守护程序任务。
只有在没有足够的RTOS堆可用于创建空闲或计时器守护程序任务时,vTaskStartScheduler()才会返回。

vTaskEndScheduler
void vTaskEndScheduler(void);

注意:这仅适用于x86实模式PC端口。
停止RTOS内核滴答。 将自动删除所有创建的任务,并停止多任务(抢先或合作)。 然后从调用vTaskStartScheduler()的位置继续执行,就好像vTaskStartScheduler()刚刚返回一样。
vTaskEndScheduler()需要在可移植层中定义退出函数。 这将执行特定于硬件的操作,例如停止RTOS内核滴答。
vTaskEndScheduler()将释放RTOS内核分配的所有资源 - 但不会释放应用程序任务分配的资源。

vTaskSuspendAll
void vTaskSuspendAll(void);

暂停调度程序而不禁用中断。 调度程序挂起时不会发生上下文切换。 在调度程序挂起时发生的RTOS滴答将保持挂起状态,直到使用对xTaskResumeAll()的调用取消挂起调度程序。
在调度程序挂起时,不得调用有可能导致上下文切换的API函数。

xTaskResumeAll
BaseType_t xTaskResumeAll(void);

使用对vTaskSuspendAll()的调用暂停后,恢复调度程序。
xTaskResumeAll()仅恢复调度程序。 它不会取消先前通过调用vTaskSuspend()而暂停的任务。
返回:
     如果恢复调度程序导致上下文切换,则返回pdTRUE,否则返回pdFALSE。

vTaskStepTick
void vTaskStepTick(TickType_t xTicksToJump);

如果RTOS配置为使用无空闲空闲功能,那么每当空闲任务是唯一能够执行的任务时,滴答中断将停止,并且微控制器进入低功耗状态。在退出低功率状态时,必须校正滴答计数值以考虑停止时所经过的时间。
如果FreeRTOS端口包含默认的portSUPPRESS_TICKS_AND_SLEEP()实现,则在内部使用vTaskStepTick()以确保维护正确的滴答计数值。 vTaskStepTick()是一个公共API函数,允许重写默认的portSUPPRESS_TICKS_AND_SLEEP()实现,如果正在使用的端口没有提供默认值,则提供portSUPPRESS_TICKS_AND_SLEEP()。
必须将configUSE_TICKLESS_IDLE配置常量设置为1才能使vTaskStepTick()可用。
参数:
    xTicksToJump自滴答中断停止以来已经过的RTOS滴答数。为了正确操作,参数必须小于或等于portSUPPRESS_TICKS_AND_SLEEP()参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值