12,FreeRTOS队列执行

news/2025/9/20 17:19:29/文章来源:https://www.cnblogs.com/tlnshuju/p/19102632

12,FreeRTOS队列执行

2025-09-20 17:16  tlnshuju  阅读(0)  评论(0)    收藏  举报

  一、实验目标


        创建四个动态任务,栈空间大小均为128字。startTask、Task1、Task2、Task3。startTask仅运行一次,负责两个队列的创建,task1、task2、task3任务的创建,startTask任务的删除。Task1负责两个队列的入队操作。Task2负责小数据的出队操作,并用串口发送。Task3负责大数据的出队操作,并用串口发送。

注:本实验基于正点原子FreeRTOS教程的学习总结。

 二、实验准备

1.FreeRTOS的Keil动态任务创建与删除程序

2.STM3F407开发板

3.宏定义开启

        将configSUPPORT_DYNAMIC_ALLOCATION 置一 。

#define configSUPPORT_DYNAMIC_ALLOCATION                1                       /* 1: 支持动态申请内存, 默认: 1 */

4.所需API函数介绍

        使用的API函数主要有队列动态创建函数、尾部入队函数、出队函数。在上一章详细描述过,这里附上连接,详情请点击连接查看。

上一章链接:11,FreeRTOS队列理论知识-CSDN博客https://blog.csdn.net/LC_8575/article/details/151067972?spm=1001.2014.3001.5501

5.队列相关定义

        首先在freertos_demo.c中添加头文件:

#include "queue.h"

        其次定义两个队列的句柄,以及大数据字符串内容:

//队列定义
QueueHandle_t key_queue; //小数据队列
QueueHandle_t big_data_queue; //小数据队列
char buff[100] = "这是一个大数据队列消息 abcdefg 123456";

 三、代码编写

3.1修改Task1的任务函数内容

        Task1实现两个队列的消息入队操作。具体为:当按键0、按键1按下时将读取到的键值发送入队(小数据)、当按键up按下时将大字符串数组的地址发送入队(大数据)。

/* task1 按键控制数据入队 */
void task1(void *pvParameters)
{
uint8_t key = 0;
BaseType_t err = 0;
char * buf;
buf = &buff[0];
while(1)
{
key = key_scan(0);
if(key == KEY0_PRES || key == KEY1_PRES)
{
err = xQueueSendToFront( key_queue,  &key,  portMAX_DELAY);
if(err != pdTRUE)
{
printf("key_queue队列入队失败\r\n");
}
}
else if(key == WKUP_PRES)
{
err = xQueueSendToFront( big_data_queue,  &buf,  portMAX_DELAY);
if(err != pdTRUE)
{
printf("key_queue队列入队失败\r\n");
}
}
vTaskDelay(10);//相对延时
}
}

 3.2修改Task2的任务函数内容

        Task2实现小数据出队操作,并用串口发送。

/* task2 小数据出队 */
void task2(void *pvParameters)
{
BaseType_t err;
uint8_t key = 0;
while(1)
{
err = xQueueReceive( key_queue, &key, portMAX_DELAY);
if(err != pdTRUE)
{
printf("key_queue出队失败\r\n");
}
else
{
printf("key_queue出队消息为:%d\r\n",key);
}
}
}

 3.3修改Task3的任务函数内容

        Task3实现大数据出队操作,并用串口发送。

/* task3 大数据出队 */
void task3(void *pvParameters)
{
BaseType_t err;
char * buf;
while(1)
{
err = xQueueReceive( big_data_queue, &buf, portMAX_DELAY);
if(err != pdTRUE)
{
printf("big_data_queue出队失败\r\n");
}
else
{
printf("big_data_queue出队消息为:%s\r\n",buf);
}
}
}

四、实验现象

        实验现象如下所示。可以看到系统初始化显示两个队列创建成功。按下key0/key1显示出队消息(小数据),按下keyup显示出队消息(大数据)。

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

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

相关文章

2025csp初赛

Day 0 文化课,聊天,做初赛,养精蓄锐,明日再战!明天多拍一点照片。 Day 1 早上并没有睡太大的觉,先去学校。和同学一起备考,很好玩。还行啦,随便做一点初赛,随便做一点arc,然后探索机房,然后发现一些很好很好…

PostGIS 介绍(2)--PostGIS 参考

本文主要介绍 PostGIS 中的常用函数。 1、PostGIS 数据类型 数据类型转换可以是显式的,这意味着必须使用 CAST(myval As sometype) 或 myval::sometype 语法指定转换。显式转换避免了歧义转换的问题。所有数据类型都可…

Java编译全过程解密:从源码到机器码的奇幻之旅

引言:Java程序的诞生与成长 当我们编写完一个Java程序,从点击"运行"到看到结果,背后发生了什么?这个看似简单的过程,实际上经历了一场精彩的编译之旅。Java的编译过程分为前端编译和后端编译两个阶段,…

第一节计算机硬件基本组成

随机存储器可以按地址访问存储器的任一单元。 顺序存储器访问时按顺序查找目标地址,访问数据所需时间与数据存储位置相关。 直接存储器按照数据块所在位置访问,介于上述两者之间,磁道寻址随机,磁道内寻址顺序。 相…

PyTorch深度学习实战【11】之神经网络的学习和训练 - 详解

PyTorch深度学习实战【11】之神经网络的学习和训练 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

深搜广搜(DFS、BFS)

DFS:广度优先搜索 DFS所使用的数据结构为栈,每次都需要遍历到最底层,无法遍历后回溯到上一层,然后寻找其他分支,直到所有分支都遍历后,再回溯上一层。以此循环。BFS需要记录从开始到结束结点的元素值,以树为例,…

android studio发现设备立刻就掉

安卓9,usb连接之后,androidstudio会短暂的显示设备名,但几秒钟就掉了,变成no device found. which adb查看到adb位于/usr/bin/adb ls -lah /usr/bin/adb查看指向../lib/android-sdk/platform-tools/adb* 经常会出现…

见证语音领域 GPT-3 时刻!小米开源端到端语音模型 MiMo Audio;Xbox上线游戏助手,实时游戏理解+语音交互丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度…

go语言学习之基本数据类型转字符串

package mainimport ("fmt""strconv" )func main() {res := fmt.Sprintf("%s %d %c %t", "萧海", 2025, A, true)fmt.Println(res)var num int = 10res = strconv.FormatInt(…

DeepLearning-LoRA 及其先进变体技术指南

LoRALoRA 及其先进变体技术指南 1. 引言 1.1 背景:大模型微调的挑战 大型深度学习模型(如 LLMs、扩散模型)的参数规模已达到万亿级别,对其进行全量微调(Full Fine-Tuning)面临巨大挑战:存储灾难:每个任务都需存…

成功没有奇迹,只有积累----Bruce Lee

目标 “目标并不是一定要达到的,它通常只是努力的方向。” 目标是努力的方向,不要为达成目标而停滞不前。把注意力放在享受这个旅程和过程上。如果你在一处风景胜地徒步旅行,你的目标是到达最后的目的地,但那并不意…

strtol() 函数 - 字符串转长整数(long int)

1.引言 strtol() 是 C 语言标准库中的一个字符串转长整数(long int) 的函数,定义在 <stdlib.h> 头文件中。 #include <stdlib.h> long int strtol(const char *str, char **endptr, int base);二、参数…

详细介绍:【最新版】SolidWorks2025安装包下载与安装图文教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

华为eNSP防火墙综合网络结构训练.docx - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

对Transformer的个人理解

本人非AI方向,本文内容不保真。 Transformer工作原理 分词 文本进来之后,首先经过Tokenizer(分词器)分割成很多个token。每个token都会赋予一个从0开始的ID,用于后续索引。 然后通过一个embedding层,将token转换…

第二节中央处理单元CPU知识点

1.在CPU内外常需设置多级高速缓存(Cache),其主要目的是提高CPU访问主存数据或指令的效率 2.CPU中的程序计数器PC用于保存要执行的指令的地址,访问内存时,需先将内存地址送入存储器地址寄存器MAR中,向内存写入数据…

day08 课程

day08 课程课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=168 8.1 公共操作之运算符加号------------------------------------------------ 执行后8.2 公共操作之…

最小生成树MST-07 - jack

目录概念Kruskal算法(克鲁斯卡尔算法)Prim算法(普里姆算法)比较MST应用场景MST与 最短距离MST与 TSP 参考链接 https://cloud.tencent.com/developer/article/1480529 概念 最小生成树MST 应该叫最小总间距树 Min…

Java基础语法1

Java基础语法1 标识符 关键字 Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。 所有的标识符都应该以字母(A-Z或a-z),美元符($),或者下划线(_)开始 首字符之后可以是字母(A-Z或a-z),…

makefile 入门2(变量赋值)

makefile 入门2(变量赋值)makefile 变量赋值 GNU make中赋值语法分为:= 将右侧的值赋值给左侧。延迟赋值 := 将右侧的值赋值给左侧。立即赋值 ::= 将右侧的值赋值给左侧。立即赋值 :::= 转义立即赋值运算符,右侧的…