yxkm 发表于 2024-4-15 17:19:22

Threadx使用消息队列收发字符串

有没有使用threadx的消息队列收发字符串的例子,跟着硬汉教程收发数值没问题,收发字符串就出问题了,打印出来是hell111111111111111111111111111111111111,核心代码如下


#define MAX_LOG_MESSAGE_LEN 256
#define LOG_QUEUE_SIZE 20

/* 定义日志队列 */
TX_QUEUE log_queue;
UCHAR log_queue_buffer;

/* 定义日志处理任务 */
void log_processing_task(ULONG thread_input)
{
    CHAR log_message;

    while (1)
    {
      /* 从日志队列中接收消息 */
      tx_queue_receive(&log_queue, log_message, TX_WAIT_FOREVER);

      /* 处理日志消息,这里可以替换成实际的日志处理逻辑 */
      printf("Log message: %s\n", log_message);
    }
}

/* 初始化日志处理任务和日志队列 */
void initialize_logging()
{
    /* 创建日志队列 */
    tx_queue_create(&log_queue, "Log Queue", sizeof(CHAR), log_queue_buffer,
                  LOG_QUEUE_SIZE * MAX_LOG_MESSAGE_LEN);

    /* 创建日志处理任务 */
    tx_thread_create(&log_processing_task_thread, "Log Processing Task",
                     log_processing_task, 0,
                     log_processing_task_stack, LOG_PROCESSING_TASK_STACK_SIZE,
                     LOG_PROCESSING_TASK_PRIORITY, LOG_PROCESSING_TASK_PRIORITY,
                     TX_NO_TIME_SLICE, TX_AUTO_START);
}

/* 异步日志记录函数 */
void async_log()
{
   char log_message = "helloworld\n";
    /* 向日志队列发送消息 */
    tx_queue_send(&log_queue, log_message, TX_WAIT_FOREVER);
}




turnip 发表于 2024-4-15 17:40:20

你得补一下字符串的知识,字符串的结束符是啥。你这样打印是很容易数组越界的、字符串越界。

yxkm 发表于 2024-4-16 11:15:03

turnip 发表于 2024-4-15 17:40
你得补一下字符串的知识,字符串的结束符是啥。你这样打印是很容易数组越界的、字符串越界。

好像是,直接改成结构体指针了

turnip 发表于 2024-4-16 15:37:50

yxkm 发表于 2024-4-16 11:15
好像是,直接改成结构体指针了

如果你传的指针,要注意源字符串的生命周期,别消息传递后把源字符串篡改了。

yxkm 发表于 2024-4-17 13:12:27

学到了,源字符被覆盖了,申请了内存去存,消息队列接收后把空间释放,现在功能没问题了,感谢
页: [1]
查看完整版本: Threadx使用消息队列收发字符串