硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1284|回复: 3
收起左侧

[FreeRTOS] 进程通信问题

[复制链接]

4

主题

19

回帖

31

积分

新手上路

QM

积分
31
QQ
发表于 2024-10-22 21:08:55 | 显示全部楼层 |阅读模式
Freertos刚入门不久,了解的不多,有些问题想要询问。



一个任务产生的数据需要先给LVGL去刷新屏幕,然后通过另一个任务向服务器传递。如果我用消息队列写入和接收,如何操作更为合理?


如果创建一个队列,写一份的话直接读出来也就没有了;
也可以写两份相同的数据到一个队列,或者写一份进去,但peek一次读一次。这两种的话如何保证数据不被同一个任务读取和还没peek就已经被读走了的情况?额外加上信号量去判断好像可以,但感觉有些太繁琐,用全局变量冒充信号量感觉又失去了rtos IPC的意义。
或者创建两个队列分别向LVGL和服务器通信,逻辑上要简单一些,但同时多个队列应该需要额外考虑优先级分配问题,否则大概率会出现数据不同的问题。

再或者有什么方便实现的方法,只是我脑子木了想不到?



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2024-10-23 10:54:25 | 显示全部楼层
可以反过来使用,GUI任务一般都是最低优先级任务,什么时候要刷新,给你这个任务发消息获取数据刷新即可。

可以有效避免你任务发送过去了,GUI还没有获得CPU权限。
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2024-10-31 11:36:06 | 显示全部楼层
之前我写ucos的时候碰到过类似的情况,我是定义了全局变量,然后消息队列传递指针。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-11-13 08:48:46 | 显示全部楼层
本帖最后由 会飞的猪_2020 于 2024-11-13 09:00 编辑

定义两个消息队列
要同步的话定义个互斥量就行了。
数据没有被消费完的话,不允许传输。

[C] 纯文本查看 复制代码
void broadcast_message(account_event_param_t *param)
{
    // 尝试获取互斥量,防止数据竞争
    if (xSemaphoreTake(message_mutex, portMAX_DELAY) == pdPASS) {
        
        // 向WiFi队列发送消息
        if (xQueueSend(wifi_message_queue, param, portMAX_DELAY) != pdPASS) {
            log_e("Failed to send message to WiFi queue");
        }

        // 向串口队列发送消息
        if (xQueueSend(serial_message_queue, param, portMAX_DELAY) != pdPASS) {
            log_e("Failed to send message to Serial queue");
        }

        // 释放互斥量 这个代码放在你确认你的数据被消费完的地方。
        //xSemaphoreGive(message_mutex);
    } else {
        log_e("Failed to take message mutex");
    }
}






回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 15:55 , Processed in 0.042884 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表