FreeRTOS静态创建任务

2023-05-16

一、静态方式创建任务和删除任务
1>测试环境
系统:WIN7
MDK:keil v5.26
开发板:GD32F303C-EVAL
固件库:V1.0.2
FreeRTOS版本:V10.4.0
2>需要满足条件
条件一:需要在FreeRTOS.h或FreeRTOSConfig.h中定义
#define configSUPPORT_STATIC_ALLOCATION 1
在这里插入图片描述

条件二:加载头文件时,加载FreeRTOS.h必须在task.h之前,如下:

#include "FreeRTOS.h"
#include "task.h"

否则会出现如下错误
.\FreeRTOS\Source\include\task.h(32): error: #35: #error directive: “include FreeRTOS.h must appear in source files before include task.h”

3>代码如下:

#include "gd32f30x.h"
#include "led.h"
#include "systick.h"
#include <stdio.h>
#include "usart.h"

#include "FreeRTOS.h"
#include "task.h"

#define 		START_TASK_STACK_SIZE 200
StaticTask_t 	StartTaskBuffer;
StackType_t 	StartTaskStack[ START_TASK_STACK_SIZE ];

#define 		LED1_TASK_STACK_SIZE  200
StaticTask_t 	Led1TaskBuffer;
StackType_t 	Led1TaskStack[ LED1_TASK_STACK_SIZE ];

#define 		LED2_TASK_STACK_SIZE  200
StaticTask_t 	Led2TaskBuffer;
StackType_t 	Led2TaskStack[ LED2_TASK_STACK_SIZE ];

//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;

/*********************************************************************************
//定时器服务任务堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
//定时器服务任务控制块
static StaticTask_t TimerTaskTCB;

获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
静态内存,因此空闲任务的任务堆栈和任务控制块的内存就应该
有用户来提供,FreeRTOS提供了接口函数vApplicationGetIdleTaskMemory()
实现此函数即可。
ppxIdleTaskTCBBuffer:任务控制块内存
ppxIdleTaskStackBuffer:任务堆栈内存
pulIdleTaskStackSize:任务堆栈大小
*********************************************************************************/
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&IdleTaskTCB;
	*ppxIdleTaskStackBuffer=IdleTaskStack;
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
/*********************************************************************************
获取定时器服务任务的任务堆栈和任务控制块内存
ppxTimerTaskTCBBuffer:任务控制块内存
ppxTimerTaskStackBuffer:任务堆栈内存
pulTimerTaskStackSize:任务堆栈大小
如果开启了软件定时器有关的配置选项,则在静态创建任务时,下面的函数也需要用户自己创建
比如如果在FreeRTOS.h中开启
#define configUSE_TIMERS				        1                               //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY		        (configMAX_PRIORITIES-1)        //软件定时器优先级
#define configTIMER_QUEUE_LENGTH		        5                               //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH	        (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&TimerTaskTCB;
	*ppxTimerTaskStackBuffer=TimerTaskStack;
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}
*********************************************************************************/

#define START_TASK_PRIO    ( tskIDLE_PRIORITY + 1 )
#define LED1_TASK_PRIO     ( tskIDLE_PRIORITY + 2 )
#define LED2_TASK_PRIO     ( tskIDLE_PRIORITY + 3 )

void START_task(void * pvParameters);
void LED1_task(void * pvParameters);
void LED2_task(void * pvParameters);

/*创建START_task任务的句柄,用于删除等操作。*/
TaskHandle_t xHandle = NULL;

int main(void)
{
	/* configure 4 bits pre-emption priority ,这样设置避免了MCU的抢占优先级,更简单*/
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
	
	GW_LedInit(LED1);
	GW_LedInit(LED2);
	GW_ComInit(GW_COM3);

	xHandle = xTaskCreateStatic( 
				(TaskFunction_t   ) START_task,
				(const char*      ) "start_task",     /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
				(uint32_t         ) START_TASK_STACK_SIZE,
				(void*            ) 1,
				(UBaseType_t      ) START_TASK_PRIO,
				(StackType_t*     ) StartTaskStack,
				(StaticTask_t*    ) &StartTaskBuffer 
				);
										
	/* start scheduler */
    vTaskStartScheduler();
    while(1){
    }
}
/*开始任务:创建两个任务后删除自身*/
void START_task(void * pvParameters)
{
	static uint8_t ucParameterToPass=5;
	taskENTER_CRITICAL();           //进入临界区	
	xTaskCreateStatic( 
				(TaskFunction_t   ) LED1_task,
				(const char*      ) "LED1_task",     /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
				(uint32_t         ) LED1_TASK_STACK_SIZE,
				(void*            ) &ucParameterToPass,
				(UBaseType_t      ) LED2_TASK_PRIO,
				(StackType_t*     ) Led1TaskStack,
				(StaticTask_t*    ) &Led1TaskBuffer 
				);
	xTaskCreateStatic( 
				(TaskFunction_t   ) LED2_task,
				(const char*      ) "LED2_task",     /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
				(uint32_t         ) LED2_TASK_STACK_SIZE,
				(void*            ) NULL,
				(UBaseType_t      ) LED1_TASK_PRIO,
				(StackType_t*     ) Led2TaskStack,
				(StaticTask_t*    ) &Led2TaskBuffer 
				);
	configASSERT( xHandle );			
	if( xHandle != NULL )
	{
//		vTaskDelete( xHandle );
//		vTaskDelete( NULL );  //在自身任务中删除任务本身,可以使用NULL代替xHandle
		vTaskSuspend( xHandle );//任务挂起
		printf("Delete START_task!\r\n");
	}
	taskEXIT_CRITICAL();            //退出临界区
}
/*任务1:LED1每隔300ms翻转一次,并打印接收的参数的值*/
void LED1_task(void * pvParameters)
{  
	uint8_t *tmp=NULL;
	tmp = (uint8_t *)pvParameters;
    for( ;; ){
        /* toggle LED2 each 500ms */
		printf("LED1_task,value:%d\r\n",*tmp);
        GW_LedToggle(LED1);
        vTaskDelay(300);
    }
}
/*任务2: LED2每隔500ms翻转一次*/
void LED2_task(void * pvParameters)
{  
    for( ;; ){
        /* toggle LED2 each 500ms */
		printf("LED2_task\r\n");
        GW_LedToggle(LED2);
        vTaskDelay(500);
    }
}

二、测试结果
在这里插入图片描述
工程下载链接:GD32F303_FreeRTOS静态创建任务

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

FreeRTOS静态创建任务 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • FreeRTOS-内核控制函数

    FreeRTOS 内核控制函数 FreeRTOS中有一些内核函数 一般来说这些内核函数在应用层不会使用 但是内核控制函数是理解FreeRTOS中断的基础 接下来我们逐一分析这些内核函数 taskYIELD 该函数的作用是进行任务切换 这是一
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS临界区

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free

随机推荐

  • ubuntu20.04中安装ROS系统

    自从在自己的电脑上安装了ubuntu20 04 43 window10双系统之后 xff0c 为了下一步开展研究 xff0c 所以安装ROS系统 把安装过程记录下来 xff0c 方便以后学习 亲测有效 xff01 xff01 xff01 x
  • Linux编程的第三方库引用------gcc、pkg-config与CMake一文讲解

    众所周知 linux 下库文件编译三部曲 config make makeinstall configure过程中可能会遇到无法找到某些头文件和动态库 xff1b 原因有两个 xff1a xff08 1 xff09 系统没有这些头文件和动态
  • 论文阅读 Global Localization with Object-Level Semantics and Topology

    摘要 全局定位是SLAM的核心要素 基于外观的方法虽然很成功 xff0c 但是在视觉条件随时间变化很大的环境中仍然面临许多开放的挑战 xff0c 随着时间的变化 xff0c 外观会发生巨大的变化 在本文中 xff0c 我们提出了一种集成解决
  • DOCKER VNC

    reference https www bilibili com video av882822967 以及泡泡机器人公众号文章 泡泡机器人创建了docker镜像 xff0c 极大的提升了环境配置的效率 docker 简介 准备 安装dock
  • GTSAM:使用gtsam的C++

    GTSAM 是一个在机器人领域和计算机视觉领域用于平滑 xff08 smoothing xff09 和建图 xff08 mapping xff09 的C 43 43 库 它与g2og2o不同的是 xff0c g2og2o采用稀疏矩阵的方式求
  • ROS - 用POSE展示方向或向量 vector - pose

    昨天想在rviz里用pose表示一个vector xff0c 搞了半天 Pose的属性 xff0c point是起点 xff0c orientation是表示由坐标系原点将 1 0 0 这个向量旋转到想要显示的方向所需的旋转的四元数表示 假
  • 目录导读

    SLAM基础 xff1a SLAM基础 xff1a 计算相机运动 SLAM基础 xff1a 单目初始化问题 SLAM基础 xff1a 计算相机运动 3D 2D SLAM基础 xff1a 计算相机运动 3D 3D SLAM基础 xff1a I
  • 特定标志检测算法流程-棋盘格

    ROS标定工具是采用棋盘格 xff0c 具体实现是OPENCV 将输入图像降采样到大约VGA分辨率 xff0c 并在全尺寸图像中检测校准目标角点 结合这些明显正交的职责作为一个优化 棋盘式检测在大图像上太昂贵 xff0c 所以最好在较小的显
  • 无人驾驶——激光雷达篇

    激光雷达技术简介 无人驾驶技术是多项技术的集成 xff0c 包括传感器 定位与深度学习 高精地图 路径规划 障碍物检测与规避 机械控制 系统集成与优化 能耗与散热管理等 无人车系统的感知端由不同的传感器组成 xff0c 其中包括GPS xf
  • simulink搭建简单的陷波滤波器

    simulink搭建简单的陷波滤波器 陷波滤波器的设计模型的搭建通过matlab自带软件设计的滤波器与simulink自带滤波器模块对比 陷波滤波器的设计 具体设计方法可参见这篇 xff1a 算法学习笔记之50HZ陷波滤波器设计 下面给出各
  • docker——常用指令

    docker pull url 从url拉取容器 docker run d url 后台运行镜像 xff0c 如果不存在该镜像 xff0c 则会自动下载 docker exec it 容器id bash 进入镜像容器 xff0c 容器的id
  • Realsense、kinect在ROS环境下的骨骼识别(基于NuiTrack)

    ps 出售我购买的nuitrack liecense xff0c 支持月付 在弄不明白ROS Kinectic之后的openNI之后终于还是向Nuitrack骨骼识别屈服了 xff1a 那么先看看NuiTrack是啥 xff1a https
  • 深度图像帧差法处理以及CV16UC1深度图像的存储方式

    最近为了拾取桌面上的任务目标 xff0c 采用了实时图像与背景图像相减的方法来进行 xff0c 因为采用彩色图像相减会有影子的干扰 xff0c 所以采用了深度图像 但是深度图像的Mat是CV16UC1格式的 矩阵内部数据采用uint 16格
  • Couldn't find executable named joy_node below /opt/ros/kinetic/share/joy解决方法

    最近想用joy node这个节点 xff0c 然后就通过 sudo apt get install ros kinetic joy 去安装 xff0c 然后运行rosrun joy joy node时候一直错误显示Segmentation
  • ros修改map_server地图发布的map关联的坐标系frame_id(多机器人联合建图用)

    帮师弟做多机器人联合建图的时候 遇到了map的坐标系问题如下 map server发布的 map话题包含了frame坐标系关联 想要正确的让多个机器人共同建图导航需要修改 map话题以及其绑定的frame坐标系 防止机器人之间的相互冲突 下
  • ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)

    最近在做图像的深度学习识别 xff0c 但是移动机器人上的电脑配置不够 xff0c 只能用我的电脑远程的去处理图像 xff0c 但是遇到了严重的带宽瓶颈 xff0c 按照我的电脑150Mbps的无线网卡来算 xff0c 每秒的极限传输速度就
  • dockerfile配置运行

  • 气压计高度融合—卡尔曼滤波

    实验平台 xff1a 自制飞控板 xff0c STM32F407主控 xff0c 传感器 xff1a MPU6050 MS5611 正文 xff1a 前几天看了这篇文章 xff0c 做了气压计的高度融合 http www zxiazai c
  • GD32F303移植FreeRTOS

    GD32F303移植FreeRTOS 一 移植环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a
  • FreeRTOS静态创建任务

    一 静态方式创建任务和删除任务 1 gt 测试环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a