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,开发者可以方便的以此搭建出自己的项目,甚至直接 ...
随机推荐
- 深入理解java虚拟机笔记Chapter3-垃圾收集器
垃圾收集器 垃圾收集(Garbage Collection,GC),它的任务是解决以下 3 件问题: 哪些内存需要回收? 什么时候回收? 如何回收? 本节补充知识: ① s:Survivor区 新生代 ...
- 又见 xcrun: error: invalid active developer path 错误
每次升级完macOS都会被 Xcode command line tools missing xcrun 问候一遍,也是挺烦的. 这个春节过光顾着吃喝玩乐,过的蛮颓废的,感觉再也追不上朋友圈各位大佬了 ...
- 解决git冲突
多个开发者同时操作git中的同一个文件,第一个人在commit和push的时候是可以正常提交的,而之后的开发者执行pull,就会报冲突异常conflict. 解决方案: 全部采用当前更改 之后再去gi ...
- Manacher(马拉车)————O(n)回文子串
Manacher 一.背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在O(n)的复杂度中返回字符串s中最长回文子串长度的算法,十分巧妙. 让我们举个栗子 ...
- Mac为docker和kubectl添加自动命令补全
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 自动命令补全是非常有用的功能,特别是当命令有特别多参数时.显然,docker/kubectl就是这样的命令.我们 ...
- beego搭建api服务
beego介绍 beego是一个Golang实现的开源Go应用开发框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful的框架,主要设计灵感来源于tornado.sin ...
- JS 使用try catch捕获异常
JS 使用try catch捕获异常 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 前端是攻克客户的先锋,需要特别注意到 ...
- Java 创建PDF文件包的2种方法
1. 概述 PDF文件包可方便在仅打开一个窗口的情况下阅读多个文档,通过将多个PDF文档或其他非PDF文档封装在一起,打开文件包后可以随意切换查看文件包中的文档,在需要编辑更改的情况,也可以打开文本包 ...
- 6、负载均衡HAproxy介绍
6.1.常用负载均衡器软件说明: 现在常用的三大开源软件负载均衡器分别是Nginx.HAProxy.LVS. 1.nginx负载均衡的特点: (1)工作在网络的七层之上,可以针对http应用做一些分流 ...
- 由ASP.NET Core WebApi添加Swagger报错引发的探究
缘起 在使用ASP.NET Core进行WebApi项目开发的时候,相信很多人都会使用Swagger作为接口文档呈现工具.相信大家也用过或者了解过Swagger,这里咱们就不过多的介绍了.本篇文章记录 ...