FreeRTOS学习(3)——任务创建和删除(静态)

2023-05-16

本代码是基于正点原子的STM32Mini板子,结合其FreeRTOS课程进行学习。

实验一:设计4个任务:start_task、task1、task2、task3

  1. start_task任务:用来创建其他三个任务
  2. task1任务:实现LED0每500ms翻转一次
  3. task2任务:实现LED1亮800ms,暗200ms
  4. task3任务:判断按键KEY0是否按下,按下KEY0删除task1

FreeRTOS中,任务创建和删除(动态方法)的函数为:xTaskCreateStatic、vTaskDelete

动态创建任务和静态创建任务的区别:

(1)动态创建任务:任务的任务控制块以及任务的栈空间所需的内存均由FreeRTOS从FreeRTOS管理的堆中分配;

(2)静态创建任务:任务的任务控制块以及任务的栈空间所需的内存需要用户分配提供。

静态创建任务需要注意:

(1)代码中将宏#define configSUPPORT_STATIC_ALLOCATION配置为1;

#define configSUPPORT_STATIC_ALLOCATION         1            //支持静态内存申请

(2)定义配置空闲任务,软件定时器,实现两个接口函数:vApplicationGetIdleTaskMemory、vApplicationGetTimerTaskMemory;

//空闲任务配置
StaticTask_t idle_task_tcb;
StackType_t idel_task_stack[configMINIMAL_STACK_SIZE];
 /*空闲任务内存分配*/
void vApplicationGetIdleTaskMemory ( StaticTask_t **ppxIdleTaskTCBBuffer,
																		 StackType_t **ppxIdleTaskStackBuffer, 
																		 uint32_t *pulIdleTaskStackSize )
{
	* ppxIdleTaskTCBBuffer = &idle_task_tcb;
	* ppxIdleTaskStackBuffer = idel_task_stack;
	* pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

//软件定时器配置
StaticTask_t time_task_tcb;
StackType_t time_task_stack[configTIMER_TASK_STACK_DEPTH];
 /*软件定时器内存分配*/
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
																		 StackType_t **ppxTimerTaskStackBuffer,
                                     uint32_t *pulTimerTaskStackSize)
{
	 * ppxTimerTaskTCBBuffer = &time_task_tcb;
	 * ppxTimerTaskStackBuffer = time_task_stack;
   * pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
} 

具体代码如下:

#include "led.h"
#include "key.h"
#include "delay.h"
#include "sys.h"
#include "FreeRTOS.h"
#include "task.h"

/*START_TASK 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_TASK_STACK_SIZE   128  //单位是字,128x4才是字节
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//自定义堆栈大小
StackType_t  start_task_stack[START_TASK_STACK_SIZE];
//开始任务的任务控制块
StaticTask_t start_task_tcb;

/*TASK1 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
//任务优先级
#define TASK1_PRIO		2
//任务堆栈大小	
#define TASK1_SIZE 		50  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
//自定义堆栈大小
StackType_t  task1_stack[TASK1_SIZE];
//开始任务的任务控制块
StaticTask_t task1_tcb;


/*TASK2 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
//任务优先级
#define TASK2_PRIO		3
//任务堆栈大小	
#define TASK2_SIZE 		50  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);
//自定义堆栈大小
StackType_t  task2_stack[TASK1_SIZE];
//开始任务的任务控制块
StaticTask_t task2_tcb;


/*TASK3 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
 //任务优先级
#define TASK3_PRIO		4
//任务堆栈大小	
#define TASK3_SIZE 		50  
//任务句柄
TaskHandle_t Task3_Handler;
//任务函数
void task3(void *pvParameters);
//自定义堆栈大小
StackType_t  task3_stack[TASK1_SIZE];
//开始任务的任务控制块
StaticTask_t task3_tcb;

//空闲任务配置
StaticTask_t idle_task_tcb;
StackType_t idel_task_stack[configMINIMAL_STACK_SIZE];
 /*空闲任务内存分配*/
void vApplicationGetIdleTaskMemory ( StaticTask_t **ppxIdleTaskTCBBuffer,
									 StackType_t **ppxIdleTaskStackBuffer, 
									 uint32_t *pulIdleTaskStackSize )
{
	* ppxIdleTaskTCBBuffer = &idle_task_tcb;
	* ppxIdleTaskStackBuffer = idel_task_stack;
	* pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

//软件定时器配置
StaticTask_t time_task_tcb;
StackType_t time_task_stack[configTIMER_TASK_STACK_DEPTH];
 /*软件定时器内存分配*/
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
									 StackType_t **ppxTimerTaskStackBuffer,
                                     uint32_t *pulTimerTaskStackSize)
{
	 * ppxTimerTaskTCBBuffer = &time_task_tcb;
	 * ppxTimerTaskStackBuffer = time_task_stack;
     * pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}  
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
	KEY_Init();               //按键初始化
	//创建开始任务
  StartTask_Handler = xTaskCreateStatic(	(TaskFunction_t  )   start_task,
											(char *     	 )   "start_task",
			                				(uint32_t		 )   START_TASK_STACK_SIZE,
											(void *			 )   NULL,
										 	(UBaseType_t	 )   START_TASK_PRIO,																					 
                                            (StackType_t * )   start_task_stack,
											(StaticTask_t *)   &start_task_tcb);										
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建task1任务
   Task1_Handler = xTaskCreateStatic(	(TaskFunction_t)   task1,
										(char * 			 )   "task1",
										(uint32_t			 )   TASK1_SIZE,
										(void *				 )   NULL,
										(UBaseType_t	 )   TASK1_PRIO,
										(StackType_t * )   task1_stack,
										(StaticTask_t *)   &task1_tcb);										 
    //创建task2任务
  Task2_Handler = xTaskCreateStatic(	(TaskFunction_t)   task2,
										(char * 			 )   "task2",
								    	(uint32_t			 )   TASK2_SIZE,
										(void *				 )   NULL,
										(UBaseType_t	 )   TASK2_PRIO,
										(StackType_t * )   task2_stack,
										(StaticTask_t *)   &task2_tcb);		     
  //创建task3任务
  Task3_Handler = xTaskCreateStatic(	(TaskFunction_t)   task3,
										(char * 			 )   "task3",
										(uint32_t			 )   TASK3_SIZE,
										(void *				 )   NULL,
										(UBaseType_t	 )   TASK3_PRIO,
										(StackType_t * )   task3_stack,
										(StaticTask_t *)   &task3_tcb);
    vTaskDelete(NULL); //删除开始任务  也可以写成vTaskDelete(StartTask_Handler);
    taskEXIT_CRITICAL();            //退出临界区
}

//task1任务函数:实现LED0每500ms翻转一次
void task1(void *pvParameters)
{
    while(1)
    {
        LED0=!LED0;
        vTaskDelay(500);
    }
}   

//task2任务函数:实现LED1每800ms翻转一次
void task2(void *pvParameters)
{
    while(1)
    {
				LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);		
    }
}

//task3任务函数:判断按键KEY0,按下KEY0删除task1
void task3(void *pvParameters)
{
	uint8_t key = 0;
	while(1)
	{
		key = KEY_Scan(0);
		if(key == KEY0_PRES)
		{
			vTaskDelete(Task1_Handler);
		}
		 vTaskDelay(10);
	}
}

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

FreeRTOS学习(3)——任务创建和删除(静态) 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • FreeRTOS内核配置说明---FreeRTOS Kernel V10.2.1

    FreeRTOS内核是高度可定制的 使用配置文件FreeRTOSConfig h进行定制 每个FreeRTOS应用都必须包含这个头文件 用户根据实际应用来裁剪定制FreeRTOS内核 这个配置文件是针对用户程序的 而非内核 因此配置文件一般
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • Vins-mono细节描述--相机imu外参标定

    vins mono能够在初始化的时候 自动标定相机和imu的外参 这个强大的功能其实并没有想象中那么复杂 一起来看看 1 在vins mono的配置文件中 就可以找到参数 来选择 是否需要估计参数 Extrinsic parameter b
  • lvi-sam的深度匹配策略

    在lvi sam中 xff0c 作者通过视觉处理的时候 xff0c 利用lidar的深度信息 xff0c 得到了更稳定的估计 那在代码里是怎么实现的呢 xff1f 一起来看看看呗 1 在lvi sam的feature tracker nod
  • 路由器硬件组成

    和其他计算机一样 xff0c 运行着baiIOS的路由器也包含了一个 中央处理器 CPU 不同系列和型号的路由器 xff0c CPU也不尽相同 路由器的处理器负责执行处理数据包所需的工作 xff0c 比如维护路由和桥接所需的各种表格以及作出
  • 系统调用与库函数的关系

    系统调用与库函数 1 系统调用 操作系统负责管理和分配所有的计算机资源 为了更好地服务于应用程序 xff0c 操作系统提供了一组特殊接口 系统调用 通过这组接口用户程序可以使用操作系统内核提供的各种功能 例如分配内存 创建进程 实现进程之间
  • FPGA中关于“后仿真正常,但上板测试出错”的问题

    FPGA中关于 后仿真正常 xff0c 但上板测试出错 的问题 求助帖 做的是矩阵键盘的扫描程序 xff0c 后仿真的扫描波形正常 xff1a 但上板子测试的时候用chipscope看扫描的波形却是这个样子的 xff1a 有带佬分析一下是什
  • 一张图搞懂数据结构体系——数据结构脑图

    基本概念 xff1a 数据 xff1a 数据是信息的载体 xff0c 是计算机程序加工的原料 数据元素 xff1a 是数据的基本单位 xff0c 也称元素 结点 数据结构 xff1a 是数据之间的相互关系 xff0c 是数据的组织形式 xf
  • 【入门篇】ESP8266直连智能音箱(天猫精灵)控制智能灯

    本系列博客学习由非官方人员 刘一周 潜心所力所写 xff0c 仅仅做个人技术交流分享 xff0c 不做任何商业用途 如有不对之处 xff0c 请留言 xff0c 本人及时更改 本系列博客内容是通过乐鑫ESP8266直连天猫精灵 xff0c
  • 如何进行CAN总线高效测试?

    CAN总线自BOSCH公司发明以来 xff0c 在汽车通信网络中的应用得到了广泛认可 随着汽车电子技术的发展 xff0c 车上的电子模块越来越多 xff0c 汽车内部的CAN总线节点也随之增多 一般汽车内部CAN节点少则10个 xff0c
  • keil5 中文注释

    keil5 中文注释 点击 Edit gt configuration 如下图 xff1a 在Editor界面中选择Encoding xff0c 如下图 xff0c 这三个均可显示中文注释 xff0c 推荐第一个 xff0c 保持Keil代
  • 【CMake学习】list使用

    添加链接描述 一 介绍 cmake的list命令即对列表的一系列操作 xff0c cmake中的列表变量是用分号 分隔的一组字符串 xff0c 创建列表可以使用set命令 xff08 参考set命令 xff09 xff0c 例如 xff1a
  • 【ros+movros安装与飞控连接测试,pixhawk2.4.8】

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 ros安装二 mavros总结 前言 记一下装ros和movros的过程顺便把一些重要的链接保存一些 提示 xff1a
  • 使用docker发布.net应用

    步骤 xff1a 创建 NET应用样例 创建包含生成 NET镜像所需引导的Dockerfile 构建一个镜像并基于此创建一个容器 设置容器数据卷和网络设置 使用Docker Compose编排容器 使用容器构建开发坏境 创建镜像 先决条件
  • python计算机视觉--全景图像拼接

    目录 一 RANSAC算法 1 1 RANSAC算法简介 1 2 算法基本思想和流程 1 3 RANSAC求解单应性矩阵 二 图像映射与全景拼接 2 1 简介 2 2 计算第二张图像与第一张图像之间的变换关系 2 3 将第二张图像叠加到第一
  • px4自带教程offboard下的gazebo多无人机编队仿真

    px4自带教程offboard下的gazebo多无人机编队仿真 主要教程参考这篇文章 xff0c offboard代码也源自下面链接 xff0c 增加了其他文件的配置细节 xff0c 链接如下 xff1a https blog csdn n
  • rotors_simulator与sitl_gazebo冲突导致报错“gzserver....”

    rotors simulator与sitl gazebo冲突导致报错 gzserver 创建时间2021 04 14 报错图片详见2021 04 14屏幕截图 总是出现gzserver symbol lookup error home zy
  • 安装ROS、gazebo、PX4基础细节及offboard控制

    新手参考教程安装ROS gazebo PX4基础细节及offboard控制 1 安装ROS 参考教程 2 安装PX4 参考教程 注 xff1a 1 在编译px4 Firmware前会经过安装步骤 xff0c 安装需要去github上git
  • 无人机模型记录

    今天看了这篇知乎 xff0c 收获非常大 xff0c 实现了一个非常基础的无人机动力学以及运动学模型 xff0c 包括公式推导等 xff0c 也解决了困扰我很久的问题 xff0c 在此基础上就可以加入控制算法 xff0c 设置轨迹等 htt
  • VMware安装Ubuntu20.04.5常见问题及解决方案

    文章目录 使用Xftp连接ubuntu系统ubuntu上安装指定版本nodejsubuntu设置连网ubuntu安装Java8ubuntu安装 deb格式软件ubuntu卸载 deb格式软件ubuntu中electron框架安装的缓存在如下
  • 无人机控制输入、PID控制

    无人机控制输入 PID控制 最近思路比较乱 xff0c 看到很多东西 xff0c 因为有各种控制 xff0c 需要在这里记录总结 控制输入 结合以下两个链接理解虚拟控制输入U1 U2 U3 U4 1 https blog csdn net
  • FreeRTOS学习(3)——任务创建和删除(静态)

    本代码是基于正点原子的STM32Mini板子 xff0c 结合其FreeRTOS课程进行学习 实验一 xff1a 设计4个任务 xff1a start task task1 task2 task3 start task任务 xff1a 用来