VSCODE IDF 编辑ESP32程序在使用xQueueHandle队列的时候需要注意的问题:
在官方例程中使用:
static xQueueHandle gpio_evt_queue = NULL;
来定义队列,再用
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
来初始化队列。
然后使用:
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
来发送数据,在中断程序中使用xQueueSendFromISR。
最后是接收数据,使用
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {printf("收到数据\n");
}
在同一个组件中的确是完全没有问题,不过在不同组件中使用发送和接收的时候,程序一直重新启动,无法正常使用,找了半天问题,不知道怎么解决,一开始是怀疑是不是没有初始化就在别的组件程序中开始使用,后来也不是这个问题。最后是不停的试,终于找到解决的方法:
定义队列必须使用:
xQueueHandle gpio_evt_queue;
不能有static静态的,也不能有=NULL,改成这样后一切正常,可以在不同的组件中相互调用,完美了。
还有队列定义有两个单词, 分别是xQueueHandle 和QueueHandle_t,发现使用没有感觉有什么区别,好像QueueHandle_t是FreeRTOS定义的,xQueueHandle 是后面再次在FreeRTOS的基础上重新定义的。
查了一下这么说:
QueueHandle:这是一个较为通用的术语,用来指代指任何类型资源的句柄或引用,比如任务句柄、队列句柄、信号量句柄等。在某些上下文中,xQueueHandle可能被用来特指代指代一个队列的句柄,但并不是一个严格定义好的类型名。
QueueHandle_t:这是FreeRTOS中定义的一个具体的数据类型,用来表示队列的句柄。当你创建一个队列时,FreeRTOS会返回一个QueueHandle_t类型的值,你可以用这个句柄来引用这个队列,进行如发送、接收数据、删除队列等操作。它是系统用于区分不同队列的一个标识符,确保操作的正确性。
所以,如果在ESP-IDF或FreeRTOS环境下讨论,xQueueHandle通常指的是对QueueHandle_t类型的一个非正式或口语化表达,两者都是指代指同一个概念,即队列的控制句柄。在编程时,你会使用QueueHandle_t作为类型定义变量,用于存储队列操作。
希望对大家有点帮助,主要还是自己对静态的理解不够吧。