FreeRTOS创建静态任务教程及所遇到的问题解决方法

news2024/11/25 2:12:26

静态任务和动态任务的区别

相对于动态任务,静态任务不需要动态分配内存,而是手动指定一个静态内存缓冲区,并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题,提高了系统的稳定性。

静态任务

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 );

//调用方式                                 
StackType_t xTask3Stack[10];
StaticTask_t xTask3STCB;
xTaskCreateStatic(Task3Function,"Task3",100,NULL,1,xTask3Stack,&xTask3STCB);

参数说明:

  • pxTaskCode: 任务函数指针,任务必须实现一个 (void *pvParameters) 原型。
  • pcName: 任务名称(字符串)。
  • ulStackDepth: 任务堆栈大小(字节)。
  • pvParameters: 任务参数,指向会传递给任务函数的数据。
  • uxPriority: 任务优先级,取值范围为 configMAX_PRIORITIES 以内的数值。
  • puxStackBuffer: 任务堆栈缓冲区指针。
  • pxTaskBuffer: 任务缓冲区指针。

动态任务

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 )

xTaskCreate(Task1Function,"Task1",100,NULL,1,NULL);

参数说明:

  • pxTaskCode - 任务的函数指针,指向任务代码的函数。
  • pcName - 任务的名称,以便于调试和跟踪任务。
  • usStackDepth - 任务的堆栈大小,以字节为单位。
  • pvParameters - 传递给任务函数的参数。
  • uxPriority - 任务的优先级。
  • pxCreatedTask - 任务的句柄,用于后续引用该任务。

创建实验

这里我创建3个任务,2个使用动态分配,一个静态分配,

void Task1Function(void * param)
{
	while (1)
	{
		/* code */
		printf("1");
	}
}

void Task2Function(void * param)
{
	while (1)
	{
		/* code */
		printf("2");
	}
}

void Task3Function(void * param)
{
	while (1)
	{
		/* code */
		printf("3");
	}
}

	//创建任务
	xTaskCreate(Task1Function,"Task1",100,NULL,1,NULL);
	xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
	
	StackType_t xTask3Stack[100];
	StaticTask_t xTask3STCB;
	xTaskCreateStatic(Task3Function,"Task3",100,NULL,1,xTask3Stack,&xTask3STCB);

流程步骤

1、需要创建静态任务需打开configSUPPORT_STATIC_ALLOCATION这个宏
在这里插入图片描述

2、编译时会报错说缺少vApplicationGetIdleTaskMemory()函数,是需要我们自主实现的。
vApplicationGetIdleTaskMemory是FreeRTOS操作系统中的一个函数,用于获取空闲任务(Idle task)的堆栈和控制块(TCB)的内存大小。 空闲任务是在系统中没有其他任务要执行时运行的任务,它不执行任何有用的操作,只是等待其他任务需要CPU。
实现代码

/* 创建任务静态分配 */
StackType_t xIdeaTaskStack[100];
StaticTask_t xIdeaTaskTCB;


void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{

    /* 如果输入指针非空,则返回指向上述静态内存的指针。 */
    if (ppxIdleTaskTCBBuffer)
    {
        *ppxIdleTaskTCBBuffer = &xIdeaTaskTCB;
    }

    if (ppxIdleTaskStackBuffer)
    {
        *ppxIdleTaskStackBuffer = &xIdeaTaskStack[0];
    }

    if (pulIdleTaskStackSize)
    {
        *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
    }
}

3、编译程序在线仿真。
在这里插入图片描述
在这里插入图片描述
成功打印出321啦。

遇到*** error 65: access violation at 0x01000004 : no ‘read’ permission解决方法

CPU:STM32F103VB
MDK5软件模拟提示没有读写权限,只能一步一步运行。提示代码如下:

error 65: access violation at 0x01000004 : no 'read' permission

解决方法

更改下面参数
在这里插入图片描述
对照这你对应的芯片参数修改
在这里插入图片描述
在这里插入图片描述
将红框的内容对应的写入target的debug里面就好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python lxml、BeautifulSoup和html.parser区别介绍】零基础也能轻松掌握的学习路线与参考资料

区别介绍 (1)lxml lxml是Python的一个XML解析库,它基于libxml2和libxslt库构建,可以读取、操作和输出XML文档。lxml具有很强的性能和稳定性,在处理较大的XML文件时表现尤佳,并且支持XPath、CSS选择器等高…

PHP复习资料(未完待续)

(未完待续,请持续关注此板块) 【计科三四】雪课堂PHP期末模拟题:https://ks.wjx.top/vm/tUAmjxq.aspx# 【计科一二】PHP第一章练习题 https://ks.wjx.top/vm/QnjHad4.aspx# 【计科一二】PHP第二章练习题 https://ks.wjx.top/vm/h2…

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变 简单绘制柱状图控制柱状宽度,间距调整颜色渐变简单绘制柱状图 要在ggplot中绘制带有置信区间的柱状图,你可以使用geom_bar和geom_errorbar函数来完成。下面是一个示例代码: library(ggplot2)# 创建一个示例数据集…

【LeetCode热题100】打卡第1天:两数之和

文章目录 两数之和⛅前言🔒题目🔑题解 两数之和 ⛅前言 大家好,我是知识汲取者,欢迎来到我们的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与…

《操作系统》期末最全复习题及解释答案

文章目录 选择题填空题简答题程序题综合题1.银行家算法2.页面置换算法3.进程调度算法4.磁盘调度算法5.求物理/逻辑地址6.分页存储管理7.可变分区分配算法 选择题 若信号量S的初值为2,且有3个进程共享此信号量,则S的取值范围是(B )…

Downie 4 4.6.17 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

Linux学习笔记 --- Linux基础命令

一. Linux的目录结构 目标:1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道,在操作系统中,文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时…

用Lua或c调用go的库

用Lua或c调用go编写的库或函数 背景思路操作golua代码汇总 参考文章 又好久没有更新了,这次肯定又是遇上了什么问题,但又解决了的,才跑过来更新的。我也是翻遍了全网都没找到lua去调go代码的,于是干脆自己写一个 背景 作为提供统…

堆结构与堆排序

二叉树的概念 满二叉树:二叉树的每一层的节点数都达到最大值 完全二叉树:满二叉树或是从左往右依次变满的树 二叉树的数组表示 01234567 堆结构(优先级队列结构) 完全二叉树 大根堆&#xff1…

图数据库评估难?一篇教你搞定图数据库产品评估

随着数字经济时代全面开启,数据作为重要的生产要素,赋能作用日渐凸显,企业逐渐开始关注自身数字化水平和数据资产价值。而当各企业数智水平提升,其业务环境和计算场景呈现数据间关系交错复杂的特点。在面对需要深度挖掘数据间复杂…

C语言——存储类型

目录 1. auto 自动型2. static 静态2.1 修饰变量要知道👇(数据在Linux内核中的分配图) 2.2 static 的特点⭐⭐⭐⭐⭐:2.2 修饰函数 3. extern4. register 寄存器类型 存储类型 存储类型有:auto static extern register…

2023最全selenium面试题及答案,测试员没有碰到算我输.....

一、前言 Selenium,是一个开源的框架,主要用于做HTML页面的UI自动化测试。不过,selenium IDE在去年官方已宣告放弃维护了。官网上放着一句话,selenium IDE is Dead。Selenium IDE是火狐浏览器的一个插件,是Selenium的…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好…

低功耗IC后端培训 | 盘点Power Switch Cell在实际项目中应用注意事项

下面直接进入今天的技术干货分享——全面盘点power gating cell在数字IC后端实现中的各种注意事项。 什么是Power Gating? 随着工艺制程越做越小和芯片规模越来越大,芯片的leakage的比重越来越高,数字后端实现时就得考虑leakage的优化。而leakage优化…

交通标志识别系统-卷积神经网络

介绍 使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,实现用户上传一张图片识别其名…

Linux 软件包管理工具

rpm命令管理软件包 1.学会看rpm包,通过rpm包的名字来了解这个软件包的一些基础信息xfsprogs-4.19.0-2.el8.x86_64.rpm xfsprogs 软件名字 4.19.0 版本号 2 发行次数 el8 适用于哪个操作系统(rel8) x86_64 软…

Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践(解决升级问题)

在Streamlit官方文档中,没有提供提供安全身份验证组件。目前,第三方streamlit-authenticator提供此功能,详见引用我原来的博文,在《Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践》文中,原…

Vue计算属性

1,为什么Vue会设计计算属性(computed property)? 答:一定程度上,Vue的作用就是管理呈现到HTML页面上的所有数据data的,每当一个data发生变化,Vue实例就会自动的去更新模板里面使用到data的地方,…

pytorch完整模型训练套路

文章目录 CIFAR10数据集简介训练模型套路1、准备数据集2、加载数据集3、搭建神经网络4、创建网络模型、定义损失函数、优化器5、训练网络6、测试数据集7、添加tensorboard8、转化为正确率9、保存模型 完整代码 本文以 CIFAR10数据集为例,介绍一个完整的模型训练套路…