322|2

176

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【MCXA156开发板测评】学习笔记05(FreeRTOS的信号量使用) [复制链接]

本帖最后由 qzc0927 于 2025-2-12 11:28 编辑

概述

在嵌入式开发中,生产者消费者模式常用于解决并发任务之间的同步问题。本文将介绍如何在NXP MCXA156开发板上使用FreeRTOS实现生产者消费者模式。通过该模式,生产者任务会生成数据,并将其交给消费者任务进行处理。在此过程中,生产者和消费者通过信号量进行同步。

硬件平台

开发板:NXP MCXA156
FreeRTOS操作系统
开发环境:MCUXpresso IDE
软件环境

FreeRTOS内核
NXP SDK和驱动库
调试串口(用于输出调试信息)

  1. 硬件与软件准备 1.1 硬件连接 在这个示例中,我们使用NXP MCXA156开发板。硬件设置非常简单,重点在于通过FreeRTOS调度器管理任务的执行。

1.2 软件环境搭建
安装并配置MCUXpresso IDE。
下载并导入适用于MCXA156的NXP SDK。
确保FreeRTOS内核已经集成并配置好。

  1. 代码分析 以下代码实现了一个生产者消费者模式,生产者负责产生数据,消费者负责处理数据,二者通过信号量进行同步。

2.1 主函数

  1. int main(void)
  2. {
  3. /* 硬件初始化 */
  4. BOARD_InitPins(); // 初始化引脚配置
  5. BOARD_InitBootClocks(); // 初始化系统时钟
  6. BOARD_InitDebugConsole(); // 初始化调试串口
  7. /* 创建生产者任务 */
  8. if (xTaskCreate(producer_task, "PRODUCER_TASK", configMINIMAL_STACK_SIZE + 128, NULL, TASK_PRIO, NULL) != pdPASS) {
  9. PRINTF("Task creation failed!.\r\n");
  10. while (1) ; // 死循环处理错误
  11. }
  12. /* 启动调度器 */
  13. vTaskStartScheduler();
  14. /* 调度器启动失败时进入死循环 */
  15. for (;;) ;
  16. }

}
在主函数中,我们首先初始化了引脚、时钟和调试串口。
然后创建了一个生产者任务,并启动调度器。
2.2 生产者任务

  1. static void producer_task(void *pvParameters)
  2. {
  3. uint32_t i;
  4. PRINTF("Producer_task created.\r\n");
  5. /* 创建二进制信号量 */
  6. xSemaphore_producer = xSemaphoreCreateBinary(); // 用于生产者等待消费者就绪
  7. if (xSemaphore_producer == NULL) {
  8. PRINTF("xSemaphore_producer creation failed.\r\n");
  9. vTaskSuspend(NULL); // 挂起当前任务
  10. }
  11. xSemaphore_consumer = xSemaphoreCreateBinary(); // 用于消费者等待生产者就绪
  12. if (xSemaphore_consumer == NULL) {
  13. PRINTF("xSemaphore_consumer creation failed.\r\n");
  14. vTaskSuspend(NULL);
  15. }
  16. /* 创建多个消费者任务 */
  17. for (i = 0; i < CONSUMER_LINE_SIZE; i++) {
  18. if (xTaskCreate(consumer_task, "CONSUMER_TASK", configMINIMAL_STACK_SIZE + 128, (void *)i, TASK_PRIO, NULL) != pdPASS) {
  19. PRINTF("Task creation failed!.\r\n");
  20. vTaskSuspend(NULL);
  21. }
  22. else {
  23. PRINTF("Consumer_task %d created.\r\n", i);
  24. }
  25. }
  26. /* 生产者主循环 */
  27. while (1) {
  28. /* 步骤1:通知消费者可以接收数据 */
  29. xSemaphoreGive(xSemaphore_consumer);
  30. /* 步骤2:等待消费者确认接收完成 */
  31. if (xSemaphoreTake(xSemaphore_producer, portMAX_DELAY) == pdTRUE) {
  32. PRINTF("Producer released item.\r\n");
  33. } else {
  34. PRINTF("Producer is waiting for customer.\r\n");
  35. }
  36. }
  37. }

}
生产者任务首先创建了两个信号量,一个用于通知消费者开始接收数据,另一个用于等待消费者确认接收。
然后,生产者任务通过 xSemaphoreGive 和 xSemaphoreTake 控制任务之间的同步。
2.3 消费者任务

  1. static void consumer_task(void *pvParameters)
  2. {
  3. /* 将参数转换为消费者编号 */
  4. int consumer_id = (int)pvParameters;
  5. PRINTF("Consumer number: %d\r\n", consumer_id);
  6. while (1) {
  7. /* 步骤1:通知生产者可以发送数据 */
  8. xSemaphoreGive(xSemaphore_producer);
  9. /* 步骤2:等待生产者提供数据 */
  10. if (xSemaphoreTake(xSemaphore_consumer, portMAX_DELAY) == pdTRUE) {
  11. PRINTF("Consumer %d accepted item.\r\n", consumer_id);
  12. } else {
  13. PRINTF("Consumer %d is waiting for producer.\r\n", consumer_id);
  14. }
  15. }
  16. }

每个消费者任务通过 xSemaphoreGive 向生产者通知可以开始生产数据。
通过 xSemaphoreTake 等待生产者的信号,接收数据并进行处理。
3. 信号量与同步机制
在这个例子中,信号量用于同步生产者和消费者任务之间的执行顺序。生产者和消费者通过信号量的“给”与“取”机制进行数据传递和同步。

生产者任务:通过 xSemaphoreGive(xSemaphore_consumer) 通知消费者准备好接收数据。然后,等待消费者确认通过 xSemaphoreTake(xSemaphore_producer)。
消费者任务:通过 xSemaphoreGive(xSemaphore_producer) 通知生产者准备好接收数据。然后,等待生产者提供数据,通过 xSemaphoreTake(xSemaphore_consumer)。

  1. 调试与测试 使用串口调试输出,可以观察到任务的执行情况以及生产者和消费者之间的同步状态。每当任务创建、数据传递或者同步发生时,都会在串口终端输出相应的调试信息,帮助开发者确认任务是否正常运行。 image-20250212112017613
  2. 总结 本文通过一个简单的例子介绍了如何在NXP的MCXA156开发板上使用FreeRTOS实现生产者消费者模式。通过任务与信号量的配合,我们可以实现任务之间的同步和数据的安全传递。这种方法不仅适用于MCXA156开发板,也适用于其他基于FreeRTOS的嵌入式系统。
此帖出自NXP MCU论坛

最新回复

谢谢分享~~~   详情 回复 发表于 2025-2-12 11:43
点赞 关注
 

回复
举报

1万

帖子

202

TA的资源

管理员

沙发
 

谢谢分享~~~

此帖出自NXP MCU论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

相互学习  详情 回复 发表于 2025-2-12 13:23
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复

176

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

相互学习

此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
恶意网页病毒症状及简单修复方法

一、对IE浏览器产生破坏的网页病毒:(一).默认主页被修改1.破坏特性:默认主页被自动改为某网站的网址。2.表现形式:浏览器的 ...

一种宽带低噪声中频放大器的设计

摘 要: 介绍了一种基于高频低噪声双极浅结工艺的低噪声、宽带中频放大器单片集成电路。从 电路结构和版图设计两方面详细论述了 ...

2007全国大学生电子设计竞赛 准备(附相关题目推测,基本仪器和主要元器件清单)

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 题目推测 题目一: 一、 设计任务 设计一多功数字自适应电参数测试仪 二、 ...

Piccolo TMS320F28027PTT-48Pin评估板

acai1123赠送的Piccolo TMS320F28027PTT-48Pin评估板,谢谢acai1123,谢谢eeworld。 用摄像头拍了一下,效果不好,但是用 ...

外国工程师的真相

我接触过的外国工程师人数,如果以常驻国家以及永久居留权为标准,大致有30人左右。和他们聊各种事情,从孩子就读MIT(麻省理工 ...

Altium选中原理图器件,自动高亮PCB相应器件。怎么设置?

之前可以,后来换新版本就没有了。 怎么设置回来? PS:不是快捷键T→S跳转。是自动高亮

【RISC-V MCU CH32V103测评】+ 一氧化碳报警器

一氧化碳是无色、无味、无刺激性的有毒的气体.含碳物质不完全燃烧时均会产生一氧化碳,例如部分家庭燃煤取暖,燃气热水器,机车尾气 ...

有没有6通道的模拟开关推荐

本帖最后由 天天1 于 2021-9-26 16:39 编辑 需要对5路信号进行测量,最好是5路的 不过估计没有,找了个6路的,但是这款立创商 ...

【STM32H7S78-DK】④串口收发数据(中断方式)

本篇,我们来到很基础的串口通讯,串口主要常用于程序调试。 查看开发板手册得知,ST—Link的虚拟串口,对应UART4( ...

为什么查找flash_open()这个函数的定义时,查到的是 #define flash_open()

在一个函数中有一个函数flash_open(),查找这个函数的定义时,查到的是#define flash_open() ,如果这个flash_open() 函数是 ...

关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表