前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FreeRTOS(十):内核控制函数

FreeRTOS(十):内核控制函数

作者头像
Jasonangel
发布2022-02-17 10:36:14
4070
发布2022-02-17 10:36:14
举报
文章被收录于专栏:嵌入式Linux系统开发

FreeRTOS 中有一些函数只供系统内核使用,用户应用程序一般不允许使用,这些 API 函数就是系统内核控制函数。

FreeRTOS 官网可以找到这些函数,如图所示:

https://www.freertos.org/FreeRTOS-quick-start-guide.html

这些函数的含义如表所示:

1、函数 taskYIELD()

此函数用于进行任务切换,此函数本质上是一个宏。

2、函数 taskENTER_CRITICAL()

进入临界区,用于任务函数中,本质上是一个宏。

3、函数 taskEXIT_CRITICAL()

退出临界区,用于任务函数中,本质上是一个宏。

4、函数 taskENTER_CRITICAL_FROM_ISR()

进入临界区,用于中断服务函数中,此函数本质上是一个宏。

5、函数 taskEXIT_CRITICAL_FROM_ISR()

退出临界区,用于中断服务函数中,此函数本质上是一个宏。

6、函数 taskDISABLE_INTERRUPTS()

关闭可屏蔽的中断,此函数本质上是一个宏。

7、函数 taskENABLE_INTERRUPTS()

打开可屏蔽的中断,此函数本质上是一个宏。

8、函数 vTaskStartScheduler()

启动任务调度器。

9、函数 vTaskEndScheduler()

关闭任务调度器。

此函数仅用于 X86 架构的处理器,调用此函数以后所有系统时钟就会停止运行,所有创建的任务都会自动的删除掉(FreeRTOS 对此函数的解释是会自动删除所有的任务,但是在 FreeRTOS 的源码中没有找到相关的处理过程,有可能要根据实际情况编写相关代码,亦或是 X86 的硬件会自动处理?笔者不了解 X86 架构),多任务性能关闭。可以调用函数vTaskStartScheduler()来重新开启任务调度器。此函数在文件 tasks.c 中有如下定义:

代码语言:javascript
复制
void vTaskEndScheduler( void )
{
    portDISABLE_INTERRUPTS(); 
    //关闭中断

    xSchedulerRunning = pdFALSE; 
    //标记任务调度器停止运行

    vPortEndScheduler(); 
    //调用硬件层关闭中断的处理函数
}

函数 vPortEndScheduler()在 port.c 中有定义,这个函数在移植 FreeRTOS 的时候要根据实际使用的处理器来编写,此处没有实现这个函数,只是简单的加了一行断言,函数如下:

代码语言:javascript
复制
void vPortEndScheduler( void )
{
    configASSERT( uxCriticalNesting == 1000UL );
}

10、函数 vTaskSuspendAll()

挂起任务调度器,调用此函数不需要关闭可屏蔽中断即可挂起任务调度器,此函数在文件tasks.c 中定义。

11、函数 xTaskResumeAll()

此函数用于将任务调度器从挂起壮态恢复。

12、函数 vTaskStepTick()

此 函 数 在 使 用 FreeRTOS 的 低 功 耗 tickless 模 式 的 时 候 会 用 到 , 即 宏 configUSE_TICKLESS_IDLE 为 1。当使能低功耗 tickless 模式以后在执行空闲任务的时候系统时钟节拍中断就会停止运行,系统时钟中断停止运行的这段时间必须得补上,这个工作就是由 函数 vTaskStepTick()来完成的,此函数在文件 tasks.c 中定义。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式Linux系统开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档