FreeRTOS-01-任务相关函数
3 任务相关API函数
任务相关函数如下:
任务创建和删除API函数
任务创建和删除实验(动态方法)
任务创建和删除实验(静态方法)
任务挂起和恢复API函数
任务挂起和恢复实验
3.1 任务创建API函数(动态方法)
函数原型:
#include "FreeRTOS.h"
#include "task.h"
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask );
函数描述:使用动态方法创建一个任务,任务控制块和任务堆栈在函数内创建。最新创建的任务初始化为就绪态,如果当前没有更高优先级的任务运行,则立刻变为运行态。
函数参数说明:
| 参数名 | 说明 |
|---|---|
| pxTaskCode | 任务函数,通常为一个无限循环。 |
| pcName | 任务名字,名称长度有限制,在FreeRTOSConfig.h中有定义configMAX_TASK_NAME_LEN。 |
| usStackDepth | 任务堆栈大小,实际申请到的堆栈是usStackDepth的4倍。configMINIMAL_STACK_SIZE定义的是空闲任务堆栈大小。 |
| pvParameters | 传递给任务函数的参数 |
| uxPriority | 任务优先级,范围0~configMAX_PRIORITIES-1。 |
| pxCreatedTask | 任务句柄,任务创建成功以后会返回此任务的任务句柄, 这个句柄其实就是 任务的任务堆栈。 此参数就用来保存这个任务句柄。其他 API 函数可能会使 用到这个句柄。如果任务句柄不需要使用,可以被设置为NULL。 |
返回值:
pdPASS:任务创建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: 任务创建失败,因为堆内存不足!
3.2 任务创建函数(静态方法)
函数原型:
#include "FreeRTOS.h"
#include "task.h"
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer );
函数描述:使用静态方法创建一个任务。任务所需要的RAM需要用户来提供。
函数参数说明:
| 参数名 | 说明 |
|---|---|
| pxTaskCode | 任务函数,通常为一个无限循环。 |
| pcName | 任务名字,名称长度有限制,在FreeRTOSConfig.h中有定义configMAX_TASK_NAME_LEN。 |
| usStackDepth | 任务堆栈大小,静态创建任务的堆栈由用户给出,通常为一个数组,这个参数就是数组的大小。 |
| pvParameters | 传递给任务函数的参数 |
| uxPriority | 任务优先级,范围0~configMAX_PRIORITIES-1。 |
| puxStackBuffer | 任务堆栈,一般为数组,数组类型为StackType_t类型。 |
| pxTaskBuffer | 任务控制块 |
返回值:
NULL:任务创建失败,puxStackBuffer或pxTaskBuffer为空。
其他值: 任务创建成功,返回任务的任务句柄。
3.3 任务删除API函数
函数原型:
void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;
函数描述:删除任务,删除之后的任务不再存在,也不能再使用此函数的句柄。如果任务使用的是xTaskCreate()创建的,此任务被删除后此任务之前申请的堆栈和控制块内存会在任务中被释放掉。
函数参数:xTaskToDelete要删除的任务的任务句柄。
返回值:无
3.4 任务创建和删除实验(动态方法)
创建两个任务,这两个任务的功能如下:
task00:此任务每个1000ms打印一次字符串,调用5次之后调用vTaskDelete()函数删除task01。
task01:此任务为普通任务,间隔500ms打印一次字符串,和task00同样的任务优先级。
task00任务创建代码:
configSTACK_DEPTH_TYPE Task00_STACK_SIZE = 5;
UBaseType_t Task00_Priority = 1;
TaskHandle_t Task00_xHandle;
void vTask00_Code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" task00 cnt %u...", cnt);
if (cnt == 4)
vTaskDelete(Task01_xHandle);
cnt++;
vTaskDelay(1000);
}
}
xTaskCreate(vTask00_Code, "task00", Task00_STACK_SIZE, NULL, Task00_Priority, &Task00_xHandle);
task01任务创建代码:
configSTACK_DEPTH_TYPE Task01_STACK_SIZE = 5;
UBaseType_t Task01_Priority = 1;
TaskHandle_t Task01_xHandle;
void vTask01_Code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" task01 cnt %u...", cnt);
cnt++;
vTaskDelay(500);
}
}
xTaskCreate(vTask01_Code, "task01", Task01_STACK_SIZE, NULL, Task01_Priority, &Task01_xHandle);
编译,运行,测试结果符合预期,task00运行5秒之后删除了task01:

3.5 任务创建和删除实验(静态方法)
使用静态方式创建一个任务,该任务每个1秒打印一个字符串:
#define STATIC_STACK_SIZE 5
UBaseType_t Static_Task_Priority = 1;
StaticTask_t Static_xTaskBuffer;
StackType_t Static_xStack[STATIC_STACK_SIZE];
TaskHandle_t Static_xhandle = NULL; //任务句柄
void static_task_code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" static task cnt %u...", cnt);
cnt++;
vTaskDelay(1000);
}
}
Static_xhandle = xTaskCreateStatic (static_task_code,
"static task",
STATIC_STACK_SIZE,
NULL,
Static_Task_Priority,
Static_xStack,
&Static_xTaskBuffer);
3.6 vTaskDelay()
函数原型:
#include "FreeRTOS.h"
#include "task.h"
void vTaskDelay( const TickType_t xTicksToDelay );
函数描述:调用该函数的任务将进入阻塞态,中断一段固定的时钟周期。
函数参数:xTicksToDelay表示调用函数的任务的阻塞态保持时间。延时达到之后将进入就绪态。例如:当时钟计数到10000时,函数调用了vTaskDelay(100),然后任务进入阻塞态,并且保持阻塞态直到时钟计数到10100。
宏pdMS_TO_TICKS()可以被使用来延时毫秒。例如:调用vTaskDelay( pdMS_TO_TICKS(100) ),任务将进入阻塞态100毫秒。
3.7 任务挂起函数
函数原型:
#include “FreeRTOS.h”
#include “task.h”
void vTaskSuspend( TaskHandle_t pxTaskToSuspend );
函数描述:将一个任务设置为挂起态。一个任务在挂起态将不会被调度转为运行态。将任务从挂起态移出来的唯一方式是调用vTaskResume()函数。
函数参数:pxTaskToSuspen表示需要挂起的任务句柄。一个任务可以通过设置参数为NULL来挂起自己。
3.8 调度器挂起函数
函数原型:
#include “FreeRTOS.h”
#include “task.h”
void vTaskSuspendAll( void );
函数描述:挂起调度器,但保留中断使能。当调度器被挂起时,如果一个中断需要请求上下文切换,中断请求将保持等待直到调度器从挂起中恢复。调度器从挂起态恢复需要调用xTaskResumeAll()函数。vTaskSuspendAll()支持嵌套使用,当要恢复调度器运行时,vTaskSuspendAll()函数被调用几次就需要调用xTaskResumeAll()函数几次。
3.9 任务恢复函数
函数原型:
#include “FreeRTOS.h”
#include “task.h”
void vTaskResume( TaskHandle_t pxTaskToResume );
函数描述:将一个任务从挂起态转换为就绪态。任务必须是之前使用vTaskSuspend()函数进入的挂起态。
函数参数:pxTaskToResume需要恢复的任务句柄。
3.10 调度器恢复函数
函数原型:
#include “FreeRTOS.h”
#include “task.h”
BaseType_t xTaskResumeAll( void );
函数描述:恢复调度器为调度状态。调度器必须是之前使用vTaskSuspendAll()函数进入的挂起状态。
返回值:pdTRUE:调度器转换为活跃状态。
pdFALSE:调度器嵌套调用了vTaskSuspendAll(),调度器依然保持挂起状态。
3.11 任务挂起和恢复实验
创建两个任务,任务二创建之后就挂起,任务三创建之后延时5秒之后,恢复任务二的运行。
代码大致实现如下:
/* test suppend task */
configSTACK_DEPTH_TYPE Task02_STACK_SIZE = 5;
UBaseType_t Task02_Priority = 2;
TaskHandle_t Task02_xHandle;
configSTACK_DEPTH_TYPE Task03_STACK_SIZE = 5;
UBaseType_t Task03_Priority = 1;
TaskHandle_t Task03_xHandle;
void vTask02_Code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" task02 cnt %u...", cnt);
cnt++;
vTaskDelay(1000);
}
}
void vTask03_Code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" task03 cnt %u...", cnt);
cnt++;
vTaskDelay(1000);
if (cnt == 5)
vTaskResume(Task02_xHandle);
}
}
void create_task_test_suppend(void)
{
if (xTaskCreate(vTask02_Code, "suppend task02", Task02_STACK_SIZE,
NULL, Task02_Priority, &Task02_xHandle) != pdPASS)
PRINT("creat task failed!\n");
if (xTaskCreate(vTask03_Code, "suppend task03", Task03_STACK_SIZE,
NULL, Task03_Priority, &Task03_xHandle) != pdPASS)
PRINT("creat task failed!\n");
vTaskSuspend(Task02_xHandle);
}
编译运行,得到的结果如下:
$ ./build/freertos-simulator
task03 cnt 0...
task03 cnt 1...
task03 cnt 2...
task03 cnt 3...
task03 cnt 4...
task02 cnt 0...
task03 cnt 5...
task02 cnt 1...
task03 cnt 6...
task02 cnt 2...
task03 cnt 7...
task02 cnt 3...
task03 cnt 8...
3.11 调度器挂起和恢复实验
创建两个任务,任务四创建之后运行,任务五创建之后延时5秒之后,挂起调度器,然后恢复调度器。
代码大致实现如下:
configSTACK_DEPTH_TYPE Task04_STACK_SIZE = 5;
UBaseType_t Task04_Priority = 2;
TaskHandle_t Task04_xHandle;
configSTACK_DEPTH_TYPE Task05_STACK_SIZE = 5;
UBaseType_t Task05_Priority = 1;
TaskHandle_t Task05_xHandle;
void vTask04_Code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" task04 cnt %u...", cnt);
cnt++;
vTaskDelay(1000);
}
}
void vTask05_Code(void *para)
{
static unsigned int cnt = 0;
for (;;)
{
PRINT(" task05 cnt %u...", cnt);
cnt++;
vTaskDelay(1000);
if (cnt == 5) {
vTaskSuspendAll();
PRINT("... ...\n");
xTaskResumeAll();
}
}
}
void create_task_test_suppend(void)
{
if (xTaskCreate(vTask04_Code, "suppend task04", Task04_STACK_SIZE,
NULL, Task04_Priority, &Task04_xHandle) != pdPASS)
PRINT("creat task failed!\n");
if (xTaskCreate(vTask05_Code, "suppend task05", Task05_STACK_SIZE,
NULL, Task05_Priority, &Task05_xHandle) != pdPASS)
PRINT("creat task failed!\n");
}
编译运行:
task04 cnt 0...
task05 cnt 0...
task04 cnt 1...
task05 cnt 1...
task04 cnt 2...
task05 cnt 2...
task04 cnt 3...
task05 cnt 3...
task04 cnt 4...
task05 cnt 4...
task04 cnt 5...
... ...
task05 cnt 5...
task04 cnt 6...
task05 cnt 6...
task04 cnt 7...
task05 cnt 7...
FreeRTOS-01-任务相关函数的更多相关文章
- FreeRTOS 系统时钟节拍和时间管理
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的时钟节拍任何操作系统都需要提供一个时钟节拍,以供系统处理诸如延时. 超时等与时间相关的事 ...
- 【FreeRTOS学习01】CubeIDE快速整合FreeRTOS创建第一个任务
整个专栏主要是博主结合自身对FreeRTOS的实战学习以及源码分析,基于STM32F767 Nucleo-144平台,在CubeIDE下进行开发,结合官方的HAL库,将硬件环节的问题减少到最小,将精力 ...
- Linux中表示“时间”的结构体和相关函数
转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html Linux中表示“时间”的结构体和相关函数 2011-09-13 17: ...
- 第二周:01 ICP迭代交互
本周主要任务01:利用PCL库函数,ICP融合两个角度的点云 任务时间:2014年9月8日-2014年9月14日 任务完成情况:可以使用键盘交互,显示每次ICP迭代结果 任务涉及基本方法: 1.PCL ...
- JS倒计时器一只,顺便复习javascript时间相关函数
window.onload = function(){ var uS = 604800; //后台提供 : 秒 var day=hour=minute=second=0, timer; var dem ...
- FreeRTOS——错误排查
1. printf-stdarg.c 在调用标准库函数时,栈空间的用量可能急剧上升,特别是IO与字符串处理函数,比如 sprintf(). 在FreeRTOS下载包中有一个名为printf-stdar ...
- 机器学习01:使用scikit-learn的线性回归预测Google股票
这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让你成为股票高手.下面按逐步介绍如何进行实践. 准备数据 ...
- FreeRTOS如何结束和重新启动调度程序
大多数主机或桌面系统(比如Linux,Mac或Windows)都有一个正常的用例,你可以在早上启动操作系统,然后在晚上关闭它,然后你就离开机器.嵌入式系统是不同的:他们没有参加,他们应该“永远”运行. ...
- emWin洗衣机简易操作界面,含uCOS-III和FreeRTOS两个版本
第3期:洗衣机简易操作界面 配套例子:V6-904_STemWin提高篇实验_洗衣机简易操作界面(uCOS-III)V6-905_STemWin提高篇实验_洗衣机简易操作界面(FreeRTOS) 例程 ...
- 1、FreeRTOS移植
1.FreeRTOS目录结构 FreeRTOS FreeRTOS简略目录如下: ├─FreeRTOS │ ├─Demo // 各种开发工具的完整Demo,开发者可以方便的以此搭建出自己的项目,甚至直接 ...
随机推荐
- Python_selenium页面元素整合设计经验
- JUC 并发编程--08,线程池,三大方法,七大参数,4种拒绝策略,代码演示
三大方法: //线程池核心线程数为n, 最大线程数为 n ExecutorService fixedThreadPool = Executors.newFixedThreadPool(n); 源码: ...
- SpringBoot基础系列之自定义配置源使用姿势实例演示
[SpringBoot基础系列]自定义配置源的使用姿势介绍 前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如 ...
- Python 5种方法实现单例模式
基本介绍 一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点. 单例模式应该是应用最广泛,实现最简单的一种创建型模式. 特点:全局唯一,允许更改 优缺点 优点: 避免对资源的多重 ...
- 重新整理 .net core 实践篇—————路由和终结点[二十三]
前言 简单整理一下路由和终节点. 正文 路由方式主要有两种: 1.路由模板方式 2.RouteAttribute 方式 路由约束: 1.类型约束 2.范围约束 3.正则表达式 4.是否必选 5.自定义 ...
- 5000字长文,kurryluo 的自学编程之路
我是程序员.大众口中非科班的那种,带着高中时期对二进制的恐惧,在大学参加科研比赛后保研,再到和校友一起创业,现在在某大型互联网公司做前端开发,一路走来都是靠自己学习. 前端框架 VUE 的作者尤大说过 ...
- 空指针的解决方案Optional包装类
有道云笔记地址 (建议有道云打开,markdown文档,直接拷贝过来有一些问题) 引言 在java的开发中,有一个问题始终会伴随着开发的进程.记得我第一个项目的时候,有一个同事在评论我的代码的时候说到 ...
- Android系统编程入门系列之应用初始化Application
在上一篇文章中我们了解到Android系统启动应用的时候,会首先加载AndroidManifest.xml清单文件中的一系列信息,在清单文件中如果不指定<application></ ...
- JWT原理实现代码
JWT学习文章: 第一篇:JWT原理 第二篇:JWT原理实现代码 上一篇学习了JWT的基本理论,这一篇将根据原理进行代码实现. 要想实现jwt的加密解密,要先生成一个SecurityKey,大家可以在 ...
- 温故知新,CSharp遇见字符串比较(String Comparison),更佳科学的比较字符串
背景 在C#中,我们经常会遇到需要比较字符串的场景,有时候甚至因为外部输入的不确定性,我们需要忽略大小写来进行比较,以达到判断业务的述求. 对字符串用法的建议 使用.NET进行开发时,请遵循以下简要建 ...