xsemaphoretake返回_FreeRTOS 使用指南

本文详细介绍了FreeRTOS操作系统中的任务管理,包括任务创建、删除、延时、优先级设置等功能,以及任务间的同步与通信。通过示例代码解析了如何在FreeRTOS中创建、删除任务,以及如何控制任务的执行和优先级。此外,还提到了任务延时、信号量和队列等概念,展示了FreeRTOS在嵌入式系统中的灵活应用。
摘要由CSDN通过智能技术生成

http://xilinx.eetrend.com/article/7845

2014

繁星电子开发团队制作

作为一个轻量级的操作系统,FreeRTOS 提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS 内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU 总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S 内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU 的使用时间。

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

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com For evaluation only.

二 任务函数

任务创建

头文件:task.h

portBASE_TYPE xTaskCreate (

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

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

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

void *pvParameters, 指针用于作为一个参数传向创建的任务

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

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

)

说明:

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

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

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

字符串长度超过了这个最大值,字符串将会自动被截断

3. usStackDepth 这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。栈空间

大小为usStackDepth*4(bytes)。

4. uxPriority 优先级的取值范围可以从最低优先级0 到最高优先级(configMAX_PRIORITIES–1)。

返回:

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

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

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

任务删除

头文件:task.h

void vTaskDelete (

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

)

说明:

1. FreeRTOSConfig.h 中的INCLUDE_vTaskDelete=1,这个函数才能用。从RTOS 实时内核管理

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

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

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

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

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com For evaluation only.

任务延时

头文件:task.h

void vTaskDelay (

portTickType xTicksToDelay 时间数量,调用任务应该锁住的时间片周期

)

说明:

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

2. 延时任务为已知时间片,任务被锁住剩余的实际时间由时间片速率决定。portTICK_RATE_MS 常量

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

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 用来计算时间片

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值