STM32CUBE提供的Free RTOS操作系统,经CMSIS的封装,向一个消息队列发送消息的函数变为osMessagePut,其函数的声明为:osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);
其中info是消息的内容,而它类型竟然是uint32_t,而不是一个指针!这岂不是意味着不能发送长度大于4字节的结构体类型的消息吗?
我曾经考虑:是不是可以把结构体的地址作为消息的内容发过去呢?可我看了osMessagePut函数的代码后,发现不对头:该函数最终还是要调用xQueueSend函数的,其代码是:xQueueSend(queue_id, &info, ticks),它把info的地址传过去。
这样问题就来了:要是一个任务两次调用osMessagePut函数发送消息,第一次时,给结构体变量赋值,然后调用osMessagePut函数将结构体的地址发送出去,osMessagePut函数再调用xQueueSend函数,将放置结构体地址的变量的地址发送出去;第二次时,准备再次调用osMessagePut函数发送消息,于是就给结构体变量赋以一个新的值。
假设此时,这样的话,再接收第一个消息,虽然可以根据消息的内容找到结构体,可这时结构体的内容已经改变了,岂不是出问题了! |