FreeRTOS应用开发学习

了解FreeRTOS

任务相关API

FreeRTOS任务创建API

FreeRTOS 中,任务的创建有两种方法,一种是使用动态创建,一种是使用静态创建。动态创建时,任务控制块和栈的内存是创建任务时动态分配的,任务删除时,内存可以释放。静态创建时,任务控制块和栈的内存需要事先定义好,是静态的内存 ,任务删除时 ,内存不能释放 。

动态创建API:xTaskCreate()

BaseType_t  xTaskCreate(
TaskFunction_t	pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t  uxPriority,
TaskHandle t* const  pxCreatedTask 
)

在这里插入图片描述返回值:
pdPASS:任务创建成功
errCIOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任务创建失败,因为内存不足

静态创建API:xTaskCreateStatic()

TaskHandle  xTaskCreateStatic(
TaskFunction_t	pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t  uxPriority,
StaticType_t *const puStackBuffer,
StaticTask_t *const pxTaskBuffer)

在这里插入图片描述返回值:
NULL:任务创建失败
其他:任务创建成功,返回任务句柄

删除任务API

vTaskDelete():删除一个任务。

vTaskDelete(TaskHandle_t xTaskToDelete)

参数:
xTaskToDelete:要删除的任务的句柄

任务挂起和恢复API

任务挂起:vTaskToSuspend

此函数用于将某个任务设置为挂起态, 进入挂起态的任务永远都不会进入运行态。退出挂
起态的唯一方法就是调用任务恢复函数 vTaskResume()或 xTaskResumeFromISR()。

void vTaskToSuspend(TaskHandle_t xTaskSuspend)

参数:
在这里插入图片描述

任务恢复

vTaskResume():恢复一个任务的运行。

将一个任务从挂起态恢复到就绪态, 只有通过函数 vTaskSuspend()设置为挂起态的任务才可以使用 vTaskRexume()恢复!

void vTaskResume(TaskHandleToResume)
xTaskResumeFromISR():中断服务函数中恢复一个任务的运行

此函数是 vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务后

BaseType_t xTaskResumeFromISR(Task_Handle_t xTaskToResume)

参数:
xTaskToResume:要恢复的任务句柄

任务创建参考代码

对开始任务进入临界态再创建任务存在疑问

#include "sys.h"   
#include "usart.h" 
#include "gpio.h"                
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"//LCD刷屏时使用的颜色//任务优先级
#define START_TASK_PRIO		4
//任务堆栈大小	
#define START_STK_SIZE 		128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define LED0_TASK_PRIO		0
//任务堆栈大小	
#define LED0_STK_SIZE 		20
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);//任务优先级
#define LED1_TASK_PRIO	  0
//任务堆栈大小	
#define LED1_STK_SIZE 		20
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 delay_init();	    				//延时函数初始化	  My_USART_Init();				//初始化串口MX_GPIO_Init();		  		//初始化GPIO//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄              vTaskStartScheduler();          //开启任务调度
}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建LED0任务xTaskCreate((TaskFunction_t )led0_task,     	(const char*    )"led0_task",   	(uint16_t       )LED0_STK_SIZE, (void*          )NULL,				(UBaseType_t    )LED0_TASK_PRIO,	(TaskHandle_t*  )&LED0Task_Handler);   //创建LED1任务xTaskCreate((TaskFunction_t )led1_task,     (const char*    )"led1_task",   (uint16_t       )LED1_STK_SIZE, (void*          )NULL,(UBaseType_t    )LED1_TASK_PRIO,(TaskHandle_t*  )&LED1Task_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}//LED0任务函数 
void led0_task(void *pvParameters)
{while(1){LED0 = !LED0;vTaskDelay(500);}
}   
/* jwiw */
//LED1任务函数
void led1_task(void *pvParameters)
{uint16_t flag=0;while(1){if(flag==0){flag=1;vTaskDelay(200);}else flag=0;GPIO_ResetBits(GPIOE,GPIO_Pin_5);vTaskDelay(200);GPIO_SetBits(GPIOE,GPIO_Pin_5);vTaskDelay(800);}
}

队列相关API

了解队列

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。 由于队列用来传递消息的,所以也称为消息队列。 FreeRTOS 中的信号量的也是依据队列实现的! 所以有必要深入的了解FreeRTOS 的队列。

特点:先进先出,固定大小/长度

读取队列的两种方式

如果读取时队列 Q 是空

不阻塞:阻塞时间决定的,这个阻塞时间单位是时钟节拍数。 阻塞时间为 0 的话就是不阻塞,没有数据的话就马上返回任务继续执行接下来的代码。

阻塞:如果阻塞时间为 0~ portMAX_DELAY, 当任务没有从队列中获取到消息的话就进入阻塞态,阻塞时间指定了任务进入阻塞态的时间,当阻塞时间到了以后还没有接收到数据的话就退出阻塞态,返回任务接着运行下面的代码,如果在阻塞时间内接收到了数据就立即返回,执行任务中下面的代码

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

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

相关文章

微信开发者工具提示获取手机号失败,客户端短信认证

长时间没有使用快捷登录方式,手机号授权过期, 如何解决 打开 开发者工具中,预览模式,在手机中完成,使用快捷登录,获取完整的手机号流程;验短流程完成后在开发工具也能获取到完整手机号了 Tar…

Mac电脑使用pyenv管理多版本python环境 _

利用Mac包管理工具brew安装pyenv,pyenv用来管理所有python版本。如果没有安装brew,先安装一下吧。 安装pyevn $ brew install pyenv $ pyenv -v pyenv 1.2.6查看所有的python版本(pyenv管理的所有版本) $ pyenv versions * sys…

TOML 格式配置文件:简洁与强大的选择

在软件开发中,配置文件是不可或缺的一部分。它们用于存储应用程序的设置、参数和其他重要信息。不同的配置文件格式各有特点,本文将介绍 TOML 格式配置文件,并与 YAML 格式进行对比,探讨其优劣。 一、TOML 格式介绍 TOML&#x…

LSTM和GRU

LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)都是循环神经网络(Recurrent Neural Networks,RNNs)的变体,专门设计用来解决传统RNN在处理长序列数据时遇到的梯度消失或梯…

C#里使用PerformLayout,强制控件将布局逻辑应用于其所有子控件。

前几天,使用DataGridView来进行动态数据显示,但是发现左边的滚动条会显示不正确。 比如设置显示第100行了,但是滚动条的位置还是在最顶端, 如果你去点击一下滚动条,它又立即更新,并且跳到正确的位置显示。 …

申请商家转账到零钱功能所需材料及必过攻略

商家转账到零钱功能的快速开通方法,可以归纳为以下几个步骤: 一、确认商户资格与账号状态 1. 商户类型:该功能通常只对公司性质的商户开放,个体工商户及小微商户暂时无法申请。商家需为微信支付认证用户。 2. 账号状态&#xff…

网络层及ip报头

★★★★★默写: A类:0~127 B类:128~191 C类:192~223 A类私网:10.0.0 - 10.255.255.255 B类私网:172.16.0.0 - 172.31.255.255 C类私网:19.168.0.0 - 192.168.255.255 特殊: 0.0.0…

Windows远程桌面到Ubuntu

在Ubuntu系统中,默认情况下root账户是被禁用的,为了安全起见,建议不要直接使用root账户登录图形界面。但是,如果出于特定的管理或维护需求,您可以按照以下步骤启用和使用root账户登录图形界面: 启用root账户…

新手爬虫DAY1

这个错误信息表明在你的Python程序中,re.search() 函数没有找到预期的匹配项,因此返回了 None。当你尝试在 None 对象上调用 group(1) 方法时,Python 抛出了一个 AttributeError。 具体来说,错误发生在 pc.py 文件的第6行&#x…

AI大模型与相对论的结合点的思考、应用及相对论原理与公式表达

大家好,我是微学AI,今天给大家介绍一下AI大模型与相对论的结合点的思考、应用及相对论原理与公式表达。在阐述相对论原理的基础上,通过数学复杂公式,分析了人工智能大模型在相对论领域的应用前景。文章深入挖掘了两大领域之间的联…

浏览器哪个好,占用cpu低。。电脑卡。流氓软件。。。火狐浏览器的使用。

用360安全浏览器打开b站,有时候占用CPU会升高,高达90%以上。一关闭b站就回落。 用谷歌浏览器打开b站,有时候占用CPU会升高,高达60%、70%,比360安全浏览器低一些。。一关闭b站就回落。 360安全浏览器、QQ浏览器&#xf…

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮 摘要:本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据,为深度学习模型提供了丰富的训练样本。基于…

MongoDB 安装配置及配置和启动服务

MongoDB 安装配置 附:MongoDB官网下载地址: https://www.mongodb.com/download-center/community 注: 官网可以下载最新版的MongoDB安装包,有MSI安装版和ZIP安装版。我们课堂上使用4.4.4的ZIP安装版。安装版参考博客&#xff1…

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

安装指定node.js 版本 精简版流程

首先 我们本机上是否安装有node 如果有 需要先卸载 卸载完成后 使用命令查看是否卸载干净 打开WinR 输入cmd 然后输入如下名: where node 如果没有目录显示 说明node 很干净 本机没有相关安装 在输入命令: where npm 如果有相关目录 需要删除掉 要不然 后续安装的…

报错 - LangChain bind_tools NotImplementedError

使用 LangChain 的 bind_tools 方法一直报错&#xff0c;即使使用 ChatOpenAI 作为 llm 接口 根据这个issue 下的回答&#xff0c;修改了 ChatOpenAI 的 import 出处&#xff0c;解决了问题 https://github.com/langchain-ai/langchain/issues/21479#issuecomment-2105618237 …

基于华为昇腾910B,实战 InternLM2.5-7B-Chat 模型推理

本文将带领大家基于启智平台&#xff0c;使用 LMDeploy 推理框架在华为昇腾 910B 上实现 internlm2_5-7b-chat 模型的推理。 GitHub - InternLM/lmdeploy: LMDeploy is a toolkit for compressing, deploying, and serving LLMs.&#xff08;欢迎star&#xff09; GitHub - I…

Opencv库的安装与vs项目配置

目录 一、下载安装opencv 1、下载 2、减压安装 3、环境变量配置&#xff08;vs项目不是必须的&#xff0c;看后面&#xff09; 二、vs项目配置opencv 1、创建vs项目 2、包含opencv头文件 一、下载安装opencv 1、下载 OpenCV - Open Computer Vision Library 2、减压安…

k8s杂记

在node节点内部使用kubectl&#xff1a; rootmultinode-demo-m02:/# ps aux | grep kubelet root 218 3.1 1.6 2066316 62516 ? Ssl 07:35 0:29 /var/lib/minikube/binaries/v1.30.0/kubelet --bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.con…

phpstorm+phpstudy 配置xdebug(无需开启浏览器扩展)

今天又被xdebug折磨了&#xff0c;忘记了以前咋配置了现在百度发现好多都是各种浏览器扩展而且也没有真正的用到项目上的都是测试的地址怎么样的 我就简单写一下自己实战吧 不支持workerman swoole hyperf等这种服务框架 如果你会请教教我 工具版本phpstudy8.1.xphpstorm2021.x…