VSCODE IDF 编辑ESP32程序在使用xQueueHandle队列的时候需要注意的问题

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作为类型定义变量,用于存储队列操作。

希望对大家有点帮助,主要还是自己对静态的理解不够吧。

今天在FreeRTOS.h中看到这么一句:

#define xQueueHandle                  QueueHandle_t

说明这两个是一模一样的。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值