FreeRTOS学习笔记(二)——FreeRTOS中的任务管理

2023-05-16

目录

  • FreeRTOS的任务创建和删除
    • 创建动态任务
    • 创建静态任务和空闲任务
    • FreeRTOS的任务删除
  • FreeRTOS中的任务状态
    • 常用函数
  • FreeRTOS的延时函数

FreeRTOS的任务创建和删除

创建动态任务

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,		//任务函数
						const char * const pcName,		//任务名字
						const uint16_t usStackDepth,	//栈的大小
						void * const pvParameters,		//任务函数所要传入的参数
						UBaseType_t uxPriority,			//优先级0~(configMAX_PRIORITIES – 1),数值越小优先级越低
						TaskHandle_t * const pxCreatedTask //任务句柄,后续需要操作任务,任务句柄作为参数传入
						)

样例如下

#include "FreeRTOS.h"
#include "UART.h"
#include "Task.h"
void TaskFuntion(void* param);
int main(void)
{	
	TaskHandle_t xHandleTask;

	xTaskCreate(Task1Funtion,"Task1", 100, NULL, 1, &xHandleTask1);
	vTaskStartScheduler();	//任务启动调度
	
	return 0;
}

void TaskFuntion(void* param)
{
	while(1)
	{
		printf("Task is running");
	}
	
}

创建静态任务和空闲任务

打开task.c

#if( configSUPPORT_STATIC_ALLOCATION == 1 )
	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 )	//任务控制块

在task.c中有对静态任务的描述,使用xTaskCreateStatic()函数进行创建,需要注意到前面有#if( configSUPPORT_STATIC_ALLOCATION == 1 )的判断,打开FreeRTOSConfig.h文件

FreeRTOSConfig.h

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "stm32f10x.h"
#include "UART.h"

#define configUSE_PREEMPTION		1
#define configUSE_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#define configCPU_CLOCK_HZ			( ( unsigned long ) 72000000 )	
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES		( 5 )
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN		( 16 )
#define configUSE_TRACE_FACILITY	0
#define configUSE_16_BIT_TICKS		0
#define configIDLE_SHOULD_YIELD		1

#define configSUPPORT_STATIC_ALLOCATION 1

#define configSUPPORT_STATIC_ALLOCATION 1添加进去

同时需要注意到task.c中有这么一段

#if( configSUPPORT_STATIC_ALLOCATION == 1 )
	extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
#endif

我们需要实现vApplicationGetIdleTaskMemory()函数,这函数用于设置空闲任务的堆栈大小,若使用静态任务创建而不实现这个函数,系统会报这个函数未实现的错误。

vApplicationGetIdleTaskMemory()函数实现

StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTCB;
void vApplicationGetIdleTaskMemory(StaticTask_t ** ppxIdleTaskTCBBuffer,
									StackType_t ** ppxIdleTaskStackBuffer,
									uint32_t * pulIdleTaskSize)
{
	*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
	*ppxIdleTaskStackBuffer = xIdleTaskStack;
	*pulIdleTaskSize = 100;//设置空闲任务的栈大小,可根据需要设置,这里我设置100
}

样例

#include "FreeRTOS.h"
#include "UART.h"
#include "Task.h"
void TaskStaticFuntion(void* param);

StackType_t xTaskStaticStack[100];
StaticTask_t xTaskStaticTCB;

StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTCB;
int main(void)
{	
	xTaskCreateStatic(TaskStaticFuntion, 
						"TaskStatic", 
						100 ,
						NULL, 
						1,
						xTask3Stack, 
						&xTask3TCB);
	vTaskStartScheduler();
	
	return 0;
}

void TaskStaticFuntion(void* param)
{
	while(1)
	{
		printf("TaskStatic is running");
	}
}

void vApplicationGetIdleTaskMemory(StaticTask_t ** ppxIdleTaskTCBBuffer,
									StackType_t ** ppxIdleTaskStackBuffer,
									uint32_t * pulIdleTaskSize)
{
	*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
	*ppxIdleTaskStackBuffer = xIdleTaskStack;
	*pulIdleTaskSize = 100;
}

FreeRTOS的任务删除

void vTaskDelete( TaskHandle_t xTaskToDelete );

使用vTaskDelete()函数进行任务的删除,参数xTaskToDelete表示要删除的任务句柄,当传入NULL则是删除自己


FreeRTOS中的任务状态

在这里插入图片描述

这是FreeRTOS的任务状态转换图,Ready(就绪)Running(运行)Blocked(阻塞)Suspended(挂起),类似进程状态图。

常用函数

void vTaskSuspend( TaskHandle_t xTaskToSuspend );
void vTaskResume( TaskHandle_t xTaskToResume );
void vTaskSuspendAll( void );

vTaskSuspend()函数的作用是时任务进入挂起状态
vTaskResume()函数则是将挂起的任务恢复到就绪状态
这两个函数都是将任务句柄作为参数传入,当参数为NULL时,则表示是自己。
vTaskSuspendAll()函数可以将所有任务挂起


FreeRTOS的延时函数

#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )

在FreeRTOSConfig.h中可以找到该宏定义,该宏定义设置了一个Tick所延时的时间

void vTaskDelay( const TickType_t xTicksToDelay )

vTaskDelay()延时函数,参数xTicksToDelay表示,延时xTicksToDelay*Tick的时间,填入1表示延时1个Tick的时间

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )

vTaskDelayUntil()函数,参数pxPreviousWakeTime是一个起始的Tick时间,xTimeIncrement是填入所需要延时的时间。当需要我们的任务在精确时间开始执行时可以使用该函数达到准确延时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习笔记(二)——FreeRTOS中的任务管理 的相关文章

  • ROS sensor_msgs/LaserScan Message简单说明

    std msgs Header header float32 angle min 开始扫描角度 float32 angle max 结束扫描角度 float32 angle increment 每次扫描增加的角度 xff08 角度分辨率 x
  • 双系统Ubuntu分区

    假设整个空闲空间有200G xff0c 主要分4个区 xff1a 1 给系统分区EFI xff1a 在唯一的一个空闲分区上添加 xff0c 大小200M xff0c 逻辑分区 xff0c 空间起始位置 xff0c 用于efi xff1b 这
  • 2 用D435i运行VINS-fusion

    文章目录 1 VINS fusion的安装1 1 环境和依赖的安装1 2 编译VINS Fusion1 3 编译错误解决方法 2 VINS Fusion跑数据集3 用相机运行VINS Fusion 环境 xff1a Ubuntu20 04
  • Python每日一个小程序

    前几天上网 xff0c 收集了20多道Python练习题 这些练习题还是很有价值的 xff0c 正好最近忙着复习准备校招 xff0c 可以用来练手 我会把每道题都写一篇博客详细阐述解题思路和源代码 xff0c 在每道题目后面附上博客地址 希
  • 数分下(第1讲):一阶微分方程的三类模型求解

    第1 1讲 xff1a 一阶微分方程的解法 第一周第一讲将用3个小时时间 xff0c 完整讲解一阶微分方程y 61 f x y 的三种典型模型求解方法 掌握以下知识点 xff0c 并熟练做题训练 对应同济高数教材第七章1 4节 知识点脑图如
  • 非常详细的 Linux C/C++ 学习路线总结!助我拿下腾讯offer

    点击关注上方 五分钟学算法 xff0c 设为 置顶或星标 xff0c 第一时间送达干货 转自后端技术学堂 正文 我的另一篇文章 腾讯 C 43 43 后台开发面试笔试知识点参考笔记 整理了 C 43 43 后台开发知识点 xff0c 本文尝
  • 一线互联网公司程序员技术面试的流程以及注意事项

    先来了解面试的流程是什么 xff0c 然后再一一做准备 xff01 企业一般通过几轮技术面试来考察大家的各项能力 xff0c 一般流程如下 xff1a 一面机试 xff1a 一般会考选择题和编程题 二面基础算法面 xff1a 就是基础的算法
  • 为什么C++永不过时?

    Linus曾说过 xff1a C 43 43 是一门很恐怖的语言 xff0c 而比它更恐怖的是很多不合格的程序员在使用着它 xff01 这足以说明C 43 43 有多难 xff01 不过 xff0c 你也要明白 难度越高意味着含金量与竞争力
  • STM32 USB学习笔记6

    主机环境 xff1a Windows 7 SP1 开发环境 xff1a MDK5 14 目标板 xff1a STM32F103C8T6 开发库 xff1a STM32F1Cube库和STM32 USB Device Library 现在来分
  • Invalid bound statement (not found)

    目录 一 遇到的问题 二 分析思路 1 映射文件 2 测试类 三 解决方案 一 遇到的问题 前几日 xff0c 有个工作不久的同事找我帮他解决一个 Mybatis 的问题 他写了一个增删改查 xff0c 但是在启动程序的时候报错 xff1a
  • ThinkPHP6 解决小程序调用接口返回错误是网页的尴尬

    背景 早在开始了解ThinkPHP时就一直记得一段话 xff1a 在一开始无知的我以为出现错误后能在调试阶段优雅的了解错误信息 xff0c 但结果大家试一下便知道 xff0c 十分尴尬 尤其是当在小程序里请求api xff0c 在过程中发生
  • 大数据技术Canal总结和详细案例

    0 Canal介绍 Canal 是用 Java 开发的基于数据库增量日志解析 xff0c 提供增量数据订阅 amp 消费的中间件 目前Canal 主要支持了 MySQL 的 Binlog 解析 xff0c 解析完成后才利用 Canal Cl
  • T507 Ubuntu18.04 LXDE桌面汉化

    本文硬件平台采用飞凌T507开发板 xff0c 主要讲解Ubuntu图形桌面LXDE如何修改为中文界面 xff0c 本文使用的思路和方法仅供参考使用 xff0c 其它arm开发板虽然芯片不同 xff0c 但思路和方法有很多的共性 xff0c
  • 工作站和台式机的区别

    转自 xff1a 微点阅读 xff08 www weidianyuedu com xff09 微点阅读 范文大全 免费学习网站 工作站电脑非常高配 xff0c 那么它和台式机有什么区别呢 下面由小编给你做出详细的工作站和台式机区别介绍 希望
  • 分布式锁-简单入门

    状态不是很好 xff0c 记一下以前学过的分布式锁吧 样例简介 不谈大概念 xff0c 就是简单入门以及使用 为什么要用分布式锁呢 xff1f 假设我需要一个定时操作 xff0c 每天在某个点 xff0c 我要处理一批数据 xff0c 要先
  • 深度神经网络的成功应用,深度神经网络发展历程

    深度学习与神经网络有什么区别 深度学习与神经网络关系2017 01 10最近开始学习深度学习 xff0c 基本上都是zouxy09博主的文章 xff0c 写的蛮好 xff0c 很全面 xff0c 也会根据自己的思路 xff0c 做下删减 x
  • Ubuntu22.04启用root账户 2208120941

    Ubuntu22 04启用root账户 2208120941 Ubuntu是有root账户的 只是没有密码 所以无法切换 所以启用的方法是 管理员账户用 sudo passwd root 给 root 设置密码 span class tok
  • WARNING: CLOCK SKEW DETECTED. YOUR BUILD MAY BE INCOMPLETE

    make时遇到这个问题几次了 xff0c 就记录一下吧 WARNING CLOCK SKEW DETECTED YOUR BUILD MAY BE INCOMPLETE 警告 xff1a 检测到时钟偏移 您的构建可能不完整 xff08 来自
  • ROS学习(五):构建系统

    ROS的构建系统默认使用CMake xff08 Cross Platform Make xff09 xff0c 其构建环境在功能 包目录中的CMakeLists txt文件中描述 在ROS中 xff0c CMake被修改为适合于ROS的 c
  • ROS学习(七):三维可视化工具(RViz)

    RViz是ROS的三维可视化工具 它的主要目的是以三维方式显示ROS消息 xff0c 可以将 数据进行可视化表达 例如 xff0c 可以无需编程就能表达激光测距仪 xff08 LRF xff09 传感器中的传感 器到障碍物的距离 xff0c

随机推荐