FreeRTOS开发指南

news2024/9/24 13:20:59

 1:任务模板

//任务优先级
#define XXX_TASK_PRIO		1
//任务堆栈大小	
#define XXX_STK_SIZE 		128  
//任务句柄
TaskHandle_t XXXTask_Handler = NULL; 

/*
*    放在开始任务,只需要执行一次为了创建任务
*/
void Create_XXX_Task(void)
{
	
	BaseType_t xReturned;
	
	  //创建XXX任务
	xReturned = xTaskCreate((TaskFunction_t )XXX_Task,             
							(const char*    )"XXX_Task",           
							(uint16_t       )XXX_STK_SIZE,        
							(void*          )NULL,                  
							(UBaseType_t    )XXX_TASK_PRIO,        
							(TaskHandle_t*  )&XXXTask_Handler);
							
	//判断任务是否正常创建						
	if( xReturned != pdPASS)
    {
        /* 任务创建失败  一般原因是栈空间不够 */
		vTaskDelete( XXXTask_Handler );
		/* 打印创建失败消息---使用宏定义选择性使用,一般就是调试的时候使用 */
#if 0
		printf("xxxx失败");
#endif
		
    }							
}

/*
*    任务函数
*/

void XXX_Task(void *pvParameters)
{
    while(1)
    {
		
    }
}   

2:常见问题

1:高优先级得任务必须存在阻塞状态,一个任务得大部分时间是处于阻塞状态得

2:对于新建工程以及新建任务,其任务得堆栈大小和优先级先配置为128和1,后面再调与改

3:内核控制函数

1:任务切换函数taskYIELD()

作用:切换任务(可手动切换任务)

我们知道当优先级任务相同的时候,每个任务运行的时间为一个时间片,假如我们此时的任务只需要0.5ms就可以了,不需要1ms,那么我们就可以手动切换任务了

taskYIELD() 用于请求切换上下文到另一个任务。 但是, 除非存在其他任务,其优先级等于或高于调用 taskYIELD() 的任务的优先级, 否则 RTOS 调度器将选择 调用了 taskYIELD() 的任务并使其再次运行。

2:临界段保护代码函数

//任务使用
void taskENTER_CRITICAL( void );
void taskEXIT_CRITICAL( void );
场景:很重要的代码,不允许被其他中断打断,比如我这里是数据处理,而有一个任务是数据判断
,我必须此时先处理数据才能有效,不然就浪费了一次
要求:执行代码必须要短,不能花很长时间
taskENTER_CRITICAL();
	/*执行语句代码*/
taskEXIT_CRITICAL();
//中断使用
UBaseType_t taskENTER_CRITICAL_FROM_ISR( void );
void taskEXIT_CRITICAL_FROM_ISR( UBaseType_t uxSavedInterruptStatus );
使用在中断中,与任务不同的事情是需要单独定义一个变量(模板)
使用起来与任务一样
UBaseType_t save_state;
save_state = taskENTER_CRITICAL_FROM_ISR();
	/*执行语句代码*/
taskEXIT_CRITICAL_FROM_ISR(save_state);

注意点:

临界区必须保持非常短,否则将影响 更高优先级的中断的响应时间,会导致该中断嵌套。 每次 taskENTER_CRITICAL_FROM_ISR() 调用都必须紧密配taskEXIT_CRITICAL_FROM_ISR() 调用一起使用。

不得从临界区调用 FreeRTOS API 函数

4:任务创建函数类

1:xTaskCreate

2:vTaskDelete

void vTaskDelete( TaskHandle_t xTask );//形参是句柄

INCLUDE_vTaskDelete 必须定义为 1 才能使用此函数

此函数的作用为从 RTOS 内核管理中移除任务。被删除的任务将从所有的就绪、阻塞、挂起和事件的列表中移除。

请注意,空闲任务负责从已删除任务中释放 RTOS 内核分配的内存。因此,重要的是,如果您的应用程序调用了 vTaskDelete (),空闲任务不会失去微控制器处理时间。任务代码分配的内存(相当于自己malloc的内存)不会自动释放,并且应在删除任务之前释放。

if( XXXTask_Handler != NULL )
{
	/* 这样写是防止输出重复删除任务,任务只能删除一次,不然会打印错误信息 */
	vTaskDelete( XXXTask_Handler ); 
	printf("任务删除");
	XXXTask_Handler = NULL;  //然后此任务会在空闲任务中回收资源,
	
}

5:任务控制类函数 

1:vTaskDelay

void vTaskDelay( const TickType_t xTicksToDelay );必须将 INCLUDE_vTaskDelay 定义为 1,此函数才可用

形参是多少个tick,因此不要觉得是多少个ms,只不过我们学的时候,一直是1tick就是1ms,因此初学会误认为这个函数是专门延时ms的

非周期延时

2:vTaskDelayUntil

void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement 

INCLUDE_vTaskDelayUntil 必须被定义为 1 才能使用此函数

// Perform an action every 10 ticks.
 void vTaskFunction( void * pvParameters )
 {
 TickType_t xLastWakeTime;
 const TickType_t xFrequency = 10;

     // Initialise the xLastWakeTime variable with the current time.
     xLastWakeTime = xTaskGetTickCount();

     for( ;; )
     {
         // Wait for the next cycle.
         vTaskDelayUntil( &xLastWakeTime, xFrequency );

         // Perform action here.
     }
 }

周期延时

3:uxTaskPriorityGet


作用:获取任务的优先级
原型:UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );  //返回值为typedef unsigned long UBaseType_t;
返回值:优先级
使用步骤如下:
#define    INCLUDE_uxTaskPriorityGet 1

UBaseType_t TaskPriority_Num = 0;
TaskPriority_Num =  uxTaskPriorityGet( xHandle );//uxTaskPriorityGet( NULL );
printf("%ld",TaskPriority_Num);

4:vTaskPrioritySet
 

作用:改变任务的优先级
原型:void vTaskPrioritySet( TaskHandle_t xTask,
                       UBaseType_t uxNewPriority );
使用步骤如下:
#define INCLUDE_vTaskPrioritySet 1
UBaseType_t TaskNewPriority_Num = 20;  //TaskNewPriority_Num的范围为0-31(推荐是最大优先级数为32)
vTaskPrioritySet(xHandle,TaskNewPriority_Num); //vTaskPrioritySet(NULL,TaskNewPriority_Num); 

5:vTaskResume和vTaskSuspend

中断的恢复稍微复杂一点点

* 挂起和恢复函数模板使用 */
 /* 宏置一 */
//挂起不支持嵌套,多次挂起,一次恢复就可以了

//任务
vTaskResume(XXXTask_Handler); --无返回值
vTaskSuspend(XXXTask_Handler);--无返回值

//中断
	BaseType_t xYieldRequired;

    /* 恢复被挂起的任务 */ 
    xYieldRequired = xTaskResumeFromISR( XXXTask_Handler ); 

    if ( xYieldRequired == pdTRUE ) 
    { 
        /* 执行上下文切换, ISR 返回的时候将运行另外一个任务 */ 
        portYIELD_FROM_ISR(); 
    } 

6:任务实用函数(调试使用)

7:队列模板使用与讲解

1:xQueueCreate

QueueHandle_t xQueue1 = NULL;
#define		QUEUE1_LENGTH	 	3
#define		QUEUE1_ITEMSIZE	 	sizeof(uint8_t)

void vATask( void *pvParameters )
{


    /* Create a queue capable of containing 10 unsigned long values. */
    xQueue1 = xQueueCreate( QUEUE1_LENGTH	 	, QUEUE1_ITEMSIZE	 	 );

    if( xQueue1 == NULL )
    {
        /* Queue was not created and must not be used. */
        //创建失败,需要打印错误信息,一般因为空间不够而无法正确
    }

    
 }


 

 如何学好FreeRTOS

学会看懂官网给的信息

This page describes the RTOS uxTaskPriorityGet() FreeRTOS API function which is part of the RTOS task control API. FreeRTOS is a professional grade, small footprint, open source RTOS for microcontrollers.

如果忘记了,重新看一遍就行,基础知识其实很少,忘记了就来查找就行

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

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

相关文章

编码器-解码器架构

“编码器-解码器”架构可以将长度可变的序列作为输入和输出,因此适用于机器翻译等序列转换问题。 编码器将长度可变的序列作为输入,并将其转换为具有固定形状的编码状态。 解码器将具有固定形状的编码状态映射为长度可变的序列。 机器翻译是…

2022 年我国的对外贸易行业发展如何?

2021年,在各种不确定因素的影响下,中国外贸人依然以其强大的韧性和实力取得了新的进出口成绩。去年进出口总值创历史新高,达到6.05万亿美元,一年内分别突破5万亿美元和6万亿美元。 在2021年成绩和经验的加持下,今年外…

SpringBoot+VUE前后端分离项目学习笔记 - 【08 SpringBoot实现分页查询】

手动实现分页功能 先理解分页查询原理 采用limit语句来实现分页 -- 页码PageNum 每页数据条目PageSize5 -- 第一页 PageNum0, limit 0,5 SELECT * FROM sys_user limit 0,5; -- 第二页 PageNum1, limit 5,5 SELECT * FROM sys_user limit 5,5; -- 公式: limit …

Python压缩模块:bz2

文章目录基本原理调用基本原理 bz2和zlib的功能是基本一致的,只是算法不同。zlib模块此前已经总结了:zlib模块详解 bz2模块用到的压缩算法是bzip2算法,其核心是BW变换和MTF变换,当然最后少不了霍夫曼编码。 BWT,即B…

Qt RSA OpenSSL C++ Qt加密解密签字通信系统窗体源码

程序示例精选 Qt RSA OpenSSL C Qt加密解密签字通信系统窗体 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Qt RSA OpenSSL C Qt加密解密签字通信系统窗体>>编写代码&#xff0c…

年终回顾 | 小米技术最受欢迎的技术文章TOP20

转眼间&#xff0c;小米技术已经陪伴大家度过了一整个年头。在一年里&#xff0c;我们始终坚持为大家提供有趣好玩的技术科普、硬核前沿的技术干货&#xff0c;带给大家一切有关小米的新鲜技术创新内容。2023年就要到了&#xff0c;欢迎你点击文末左下角的“阅读原文”填写一份…

Vue3:搜索框输入防抖实现整理笔记

目录 场景需求 前言 防抖 & 节流 防抖 节流 输入防抖存在的问题 指令实现 总结 在Vue开发中&#xff0c;遇到了搜索框输入防抖处理&#xff0c;算是防抖的使用场景之一吧&#xff0c;抽象其逻辑记录下来以备后用 场景需求 作为开发人员&#xff0c;一定要先搞清楚…

Android---Material Design

目录 一、什么是Material Design Z轴 Material Design 的一些 theme 一、什么是Material Design Material Design 中文名&#xff1a;材料设计语言&#xff0c;是由 Google 推出的全新的设计语言。Google 表示&#xff0c;这种设计语言旨在为手机、平板、台式机和“其它平台”…

标签平滑(Label Smoothing)详解

一、什么是label smoothing&#xff1f; 标签平滑&#xff08;Label smoothing&#xff09;&#xff0c;像L1、L2和dropout一样&#xff0c;是机器学习领域的一种正则化方法&#xff0c;通常用于分类问题&#xff0c;目的是防止模型在训练时过于自信地预测标签&#xff0c;改善…

spring6笔记2( ioc、bean的作用域、工厂模式、bean的四种实例化方式,生命周期)

第四章、Spring对ioc的实现 4.4 p命名空间注入 目的&#xff1a;简化配置。 使用p命名空间注入的前提条件包括两个&#xff1a; 第一&#xff1a;在XML头部信息中添加p命名空间的配置信息&#xff1a;xmlns:p"http://www.springframework.org/schema/p"第二&…

wanglinrong 程序 环境配置

1、总体要求 我的matlab版本是 r2020b、matconvnet-1.0-beta25、visual studio 2022。笔记本安装&#xff0c;没考虑GPU。建议vs的版本尽量比matlab版本低。 1.1 完美解决方案&#xff1a; 低版本Visual Studio与高版本Matlab&#xff0c;先装vs 后装matlab&#xff01; 比如…

windows下PyTorch安装教程(1.10)

文章目录一.pytorch 1.10版本安装教程一.pytorch 1.10版本安装教程 PyTorch官网 pytorch与cuda版本关系 官网 从官网选择自己对应的conda,python,cuda版本&#xff0c;复制conda命令 在windows搜索框中搜索CMD&#xff0c;选择以管理员身份运行 使用conda新建虚拟环境pyt…

arthas离线包使用说明

arthas离线包使用说明 基于私有化全内网场景&#xff0c;打包了一套arthas离线包&#xff0c;方便后续对服务进行调试和问题的定位。 首先将arthas-bin.zip导入到服务器中 下载连接&#xff1a;https://download.csdn.net/download/Decembetion/87347459 将zip包解压 #解压 unz…

c4d导入大模型以及给建筑上贴图笔记

快捷键普及 h定位 o 鼠标中键 切换视图 鼠标左键移动视图 坐标轴反了&#xff0c;按w切换 alt左键 旋转 alt中键移动 alt右键 缩放 导入超大模型 导入后什么都看不到需要在工程属性里面修改为极大 image.pngshiftf2弹出材质编辑器 点四条杠可以移动选项卡 image.png点新建材质之…

基于GUI界面的yolov5人脸口罩检测项目

文章目录 前言 一、运行环境 二、环境配置 三、yolov5网络结构图介绍 四、 损失函数 五、数据集 六、实验内容 1.实验框架 2.实验环境 3.实验结果 前言 佩戴口罩可以有效降低在和感染者有接触时可能被感染者感染的风险。目前&#xff0c;在一些公共场所&#xff0c…

c++结构体数组sort排序出错?(关于sort排序comp比较器的严格弱排序性质)

文章目录sort的严格弱排序的性质无效的比较器&#xff08;Invalid comparator&#xff09;正确的比较器sort的严格弱排序的性质 我在给结构体数组排序的时候&#xff0c;自定义了sort函数的排序法则&#xff0c;我的结构体如下定义&#xff1a; struct score {int a, b, c;//…

English Learning - L1-8 时态(上) 2022.12.29 周四

English Learning - L1-8 时态&#xff08;上&#xff09; 2022.12.29 周四8 时态为什么时态难学&#xff1f;什么是时态&#xff1f;如何套用时态表8.1 一般时态核心思维&#xff08;一&#xff09; 一般现在时核心思维用法1. 普遍的事实和真理2. 重复活动&#xff08;习惯&am…

166页7万字智慧工厂可视化解决方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 第 一 章 应用…

QT VS移植过程中出现的问题以及解决记录

目录 一、无法定位程序输入点于动态链接库 二、E1696 无法打开 源 文件 “QString“ 三、编译Qt项目提示 error MSB6006: “cmd.exe”已退出 四、禁止显示状态 错误 MSB8036 找不到 Windows SDK 五、E2512 功能测试宏的参数必须是简单标识符 六、Qt VS中双击ui文件无法打…

【计算机模型机设计】单周期MIPS CPU设计报告

2022年结束了&#xff0c;过去一年确实发生了很多事情&#xff0c;开心的、伤心的、激动的、平凡的…这些都已经成为过去了&#xff0c;只希望在新的一年里&#xff0c;能够多一些开心&#xff0c;少一些emo&#xff0c;做一些自己喜欢的事情。 其实说实话&#xff0c;感觉我的…