// 定义消息结构体
typedef struct {
  uint8_t id;        // 消息 ID
  uint8_t data[8];   // 消息数据
} Message;

// 定义任务结构体
typedef struct {
  uint8_t id;        // 任务 ID
  QueueHandle_t queue;  // 消息队列句柄
} Task;

// 定义任务数组和消息队列
Task tasks[10];
Message messages[10];

// 定义任务 ID 和消息 ID 的枚举类型
typedef enum {
  TASK1_ID,
  TASK2_ID,
} TaskId;

typedef enum {
  MSG1_ID,
  MSG2_ID,
} MsgId;

// 初始化任务和消息队列
void initTasks() {
  for (int i = 0; i < 2; i++) {
    tasks[i].id = i;
    tasks[i].queue = xQueueCreate(10, sizeof(Message));
  }
}

// 向任务的消息队列中发送消息
void sendMsg(TaskId taskId, Message message) {
  xQueueSend(tasks[taskId].queue, &message, portMAX_DELAY);
}

// 从当前任务的消息队列中接收消息
Message receiveMsg() {
  Message message;
  xQueueReceive(tasks[xTaskGetCurrentTaskHandle()].queue, &message, portMAX_DELAY);
  return message;
}

// 注册任务到消息总线
void registerTask(TaskId taskId, MsgId msgId) {
  // 将任务 ID 和消息 ID 记录到消息结构体中
  Message message = {msgId, {taskId}};
  sendMsg(taskId, message);
}

// 订阅消息
void subscribeMsg(MsgId msgId) {
  // 向所有任务的消息队列中发送订阅消息
  Message message = {msgId, {0}};
  for (int i = 0; i < 2; i++) {
    sendMsg(i, message);
  }
}

// 发布消息
void publishMsg(MsgId msgId, uint8_t *data) {
  // 向所有订阅该消息的任务的消息队列中发送消息
  Message message = {msgId, data};
  for (int i = 0; i < 2; i++) {
    xQueueSend(tasks[i].queue, &message, 0);
  }
}

// 任务 1
void task1(void *pvParameters) {
  while (1) {
    Message message = receiveMsg();
    if (message.id == MSG1_ID) {
      // 处理消息 1
    }
  }
}

// 任务 2
void task2(void *pvParameters) {
  while (1) {
    Message message = receiveMsg();
    if (message.id == MSG2_ID) {
      // 处理消息 2
    }
    if (message.id == MSG1_ID) {
      // 处理消息 1
    }
  }
}

int main() {
  // 初始化任务和消息队列
  initTasks();

  // 注册任务到消息总线
  registerTask(TASK1_ID, MSG1_ID);
  registerTask(TASK2_ID, MSG2_ID);

  // 订阅消息
  subscribeMsg(MSG1_ID);
  subscribeMsg(MSG2_ID);

  // 创建任务 1 和任务 2
  xTaskCreate(task1, "Task 1", 1000, NULL, 1, NULL);
  xTaskCreate(task2, "Task 2", 1000, NULL, 1, NULL);

  // 启动调度器
  vTaskStartScheduler();

  return 0;
}
```

以上代码实现了一个简单的消息总线程序框架机制,通过消息队列来实现消息的发送和接收,实现了消息的注册、订阅和发布。用户可以根据实际需求修改任务和消息的数量和数据结构。此外,还可以在代码中添加相应的处理逻辑来实现更加复杂的功能。

更多推荐