freertos使用指南与各类型函数详细说明

网友投稿 221 2022-11-10

freertos使用指南与各类型函数详细说明

FreeRTOS 的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS 被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU 使用权,这样可保证系统满足实时性的要求;当FreeRTOS 被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU 的使用权后才能获得运行,这样可提高CPU 的运行效率FreeRTOS 对系统任务的数量没有限制。

一 变量类型定义

#define portCHAR char

#define portFLOAT float

#define portDOUBLE double

#define portLONG long

#define portSHORT short

#define portSTACK_TYPE unsigned portLONG

#define portBASE_TYPE long

二 任务函数

 任务创建

头文件:task.h

portBASE_TYPE xTaskCreate (

pdTASK_CODE pvTaskCode, 指向任务的实现函数的指针。效果上仅仅是函数名

const portCHAR * const pcNane, 具有描述性的任务名。FreeRTOS 不会使用它。

unsigned portSHORT usStackDepth, 指定任务堆栈的大小

unsigned portBASE_TYPE uxPriority, 任务运行时的优先级

xTaskHandle *pvCreatedTask 用于传递任务的句柄,可以引用从而对任务进行其他操作。

说明:

1. 这里的任务是指一个永远不会退出的C 函数,通常是一个死循环。

2. pcNane 其只是单纯地用于辅助调试。应用程序可以通过定义常量

config_MAX_TASK_NAME_LEN 来定义任务名的最大长度——包括’ ’结束符。如果传入的

大小为usStackDepth*4(bytes)。

返回:

1. pdPASS 表明任务创建成功,准备运行。

2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 由于内存堆空间不足,FreeRTOS 无法分配

足够的空间来保存任务结构数据和任务栈,因此无法创建任务。

 任务删除

头文件:task.h

void vTaskDelete (

xTaskHandle pxTask 处理要删除的任务。传递NULL 将删除自己

说明:

中移除任务。要删除的任务将从就绪,封锁,挂起,事件列表中移除。

2. 任务被删除后就不复存在,也不会再进入运行态

3. 空闲任务负责释放内核分配给已删除任务的内存。

使用提示:只有内核为任务分配的内存空间才会在任务被删除后由空闲任务自动回收。任务自己占用的内存或资源需要由应用程序自己显式地释放

 任务延时

头文件:task.h

void vTaskDelay (

说明:

1. FreeRTOSConfig.h 中的INCLUDE_vTaskDelay=1,这个函数才能用。

以时间片速率来计算实际时间

3. vTaskDelay()指定一个任务希望的时间段,这个时间之后任务解锁。

4. vTaskDelay()不提供一个控制周期性任务频率的好方法,和其他任务和中断一样,在调用vTaskDelay()

后将影响频率

提示:vTaskDelayUntil() ,这个交替的API 函数设计了执行固定的频率。它是指定的一个绝对时间(而不是

一个相对时间)后,调用任务解锁。--------可以实现周期性任务执行。

 任务延迟到指定时间

头文件:task.h

void vTaskDelayUntil (

portTickType *pxPreviousWakeTime, 指定一个变量来掌握任务最后开启的时间, 第一次使用时必须使用当前时间来初始化, 在vTaskDelayUntil 中,这个变量是自动修改的

portTickType xTimeIncrement 循环周期时间

说明:

1. FreeRTOSConfig.h 中的INCLUDE_vTaskDelayUntil=1,这个函数才能用。

2. 延时一个任务到指定时间,这个和vTaskDelay() 不同, vTaskDelay 是延时一个相对时间,而

vTaskDelayUntil 是延时一个绝对时间

3. 常量 portTICK_RATE_MS 用来计算时间片频率的实时时间- 按照一个时间片周期

4. 任务将在一定时间开启(*pxPreviousWakeTime + xTimeIncrement)。使用相同的xTimeIncrement 参数值来调用vTaskDelayUntil()将使任务按固定的周期执行。

注意:vTaskDelayUntil() 如果指定的苏醒时间使用完,将立即返回。因此,一个使用vTaskDelayUntil() 来周期性的执行的任务,如果执行周期因为任何原因(例如任务是临时为悬挂状态)暂停而导致任务错过一个或多个执行周期,那么需要重新计算苏醒时间。通过检查像pxPreviousWakeTime 可变的参数来组织当前时间片计数。然而在大多数使用中并不是必须的。

 获得任务优先级

头文件:task.h

unsigned portBASE_TYPE uxTaskPriorityGet (

xTaskHandle pxTask 需要处理的任务。 当传递NULL 时,将返回调用该任务的优先级

说明:FreeRTOSConfig.h 中的INCLUDE_vTaskPriorityGet=1,这个函数才能用

返回:pxTask 的优先级

 设置任务优先级

头文件:task.h

void vTaskPrioritySet (

xTaskHandle pxTask , 需要设置优先级的任务。当传递NULL,将设置调用任务的优先级

unsigned portBASE_TYPE uxNewPriority 任务需要设置的优先级

说明:FreeRTOSConfig.h 中的INCLUDE_vTaskPrioritySet 为1,才能使用此函数。如果设置的优先级高于

当前执行任务的优先级,则上下文切换将在此函数返回前发生

 挂起任务

头文件:task.h

void vTaskSuspend (

xTaskHandle pxTaskToSuspend 处理需要挂起的任务。传递NULL 将挂起调用此函数的任务

说明:FreeRTOSConfig.h 中的INCLUDE_vTaskSuspend 为1,才能使用此函数。当挂起一个任务时,不管优先级是多少,不需要占用任何微控制器处理器时间。调用vTaskSuspend 不会累积——即:在同一任务中调用vTaskSuspend 两次,但只需要调用一次vTaskResume()就能使挂起的任务就绪

 唤醒挂起的任务

头文件:task.h

void vTaskResume (

xTaskHandle pxTaskToResume 就绪任务的句柄

说明:FreeRTOSConfig.h 中的INCLUDE_vTaskSuspend 为1,才能使用此函数。必须是调用 vTaskSuspend

() 后挂起的任务,才有可能通过调用 vTaskResume ()从新运行

 从中断唤醒挂起的任务

头文件:task.h

xTaskHandle pxTaskToResum 就绪任务的句柄

说明:FreeRTOSConfig.h 中的INCLUDE_vTaskSuspendhe 和INCLUDE_xTaskResumeFromISR 都为1,才能使用此函数。vTaskResumeFromISR()不应该用于任务和中断同步,因为可能会在中断发生期间,任务已经挂起——这样导致错过中断。使用信号量最为同步机制将避免这种偶然性。

返回:pdTRUE: 如果唤醒了任务将引起上下文切换。pdFALSE:用于ISR 确定是否上下文切换。

 为任务分配标签值

头文件:task.h

void vTaskSetApplicationTaskTag (

xTaskHandle xTask , 将分配给标签值的任务。传递NULL 将分配标签给调用的任务。

pdTASK_HOOK_CODE pxTagValue 分配给任务的标签值 类型为 pdTASK_HOOK_CODE 允许一

个函数指针赋值给标签,因此实际上任何值都可以分配

说明:FreeRTOSConfig.h 中的onfigUSE_APPLICATION_TASK_TAG 为1,这个函数才能可用。这个值仅

在应用程序中使用,内核本身不使用它。

 xTaskCallApplicationTaskHook

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:学习Linux操作系统中Alsa音频编程
下一篇:secure crt session options常见的操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~