Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在FreeRTOS中通过队列发送指向结构的指针_C_Pointers_Queue_Freertos - Fatal编程技术网

C 在FreeRTOS中通过队列发送指向结构的指针

C 在FreeRTOS中通过队列发送指向结构的指针,c,pointers,queue,freertos,C,Pointers,Queue,Freertos,我似乎不知道如何在FreeRTOS中使用队列发送指向结构的指针。我已经尝试了所有我能想到的,但我总是得到一个指向某个随机内存区域的指针 我试图将一个指向按钮结构的指针发送到另一个任务,然后在屏幕上绘制它。我试着发送整个对象,结果成功了,但是由于结构中有很多数据(两个图标的数据),我真的不想这样做 代码正在Atmel SAME70中运行 下面是我正在编写的代码的一个简单版本: typedef结构{ uint32_t宽度; uint32_t高度; uint32_t x; uint32_t y; ui

我似乎不知道如何在FreeRTOS中使用队列发送指向结构的指针。我已经尝试了所有我能想到的,但我总是得到一个指向某个随机内存区域的指针

我试图将一个指向按钮结构的指针发送到另一个任务,然后在屏幕上绘制它。我试着发送整个对象,结果成功了,但是由于结构中有很多数据(两个图标的数据),我真的不想这样做

代码正在Atmel SAME70中运行

下面是我正在编写的代码的一个简单版本:

typedef结构{
uint32_t宽度;
uint32_t高度;
uint32_t x;
uint32_t y;
uint8_t状态;
无效(*回调)(t_但是);
蒂马吉·伊科农;
蒂马吉·伊克诺夫;
}但是;
void任务\u lcd(void){
xQueueButtons=xQueueCreate(6,sizeof(struct t t_but*));
按钮;
配置_lcd();
绘制屏幕();
而(1){
if(xQueueReceive(xQueueButtons,&(button),(勾选类型)500/端口勾选周期){
//这总是打印一些随机数。
printf(“按钮X:%“PRIu32”\r\n”,按钮->X);
}
}
}
void任务按钮(void){
t_但是butPlay={.width=64,
.高度=64,
.x=60,
.y=445,
.status=0,
.callback=&ButPlayCallback,
.iconOn=播放红色,
.iconOff=play_black};
xQueueSend(xQueueButtons和butPlay,0);
而(1){
//其他一些代码。
}
}

非常感谢您的帮助。

从API中可以看出,xQueueSend通过传递的指针进行复制,因此,如果您想在队列上传递指针,则需要传递指向您的结构的指针的地址

void  task_buttons(void) {
    t_but butPlay = {.width = 64,
                     .height = 64,
                     .x = 60,
                     .y = 445,
                     .status = 0,
                     .callback = &ButPlayCallback,
                     .iconOn = play_red,
                     .iconOff = play_black}; 
    t_but * const p_but = &butPlay; 

    xQueueSend(xQueueButtons, &p_but, 0);

    while (1) {
        // Some other code.
    }
}

从API中可以看出,xQueueSend通过传递的指针进行复制,因此如果要在队列上传递指针,则需要传递指向结构的指针的地址

void  task_buttons(void) {
    t_but butPlay = {.width = 64,
                     .height = 64,
                     .x = 60,
                     .y = 445,
                     .status = 0,
                     .callback = &ButPlayCallback,
                     .iconOn = play_red,
                     .iconOff = play_black}; 
    t_but * const p_but = &butPlay; 

    xQueueSend(xQueueButtons, &p_but, 0);

    while (1) {
        // Some other code.
    }
}

xQueueSend
的示例中,在具有结构的示例中,
pvItemToQueue
是指向该结构的指针的地址,该结构被类型转换为
void*
。我不知道这是否有用。我现在无法测试。不知道FreeRTOS用例,但任务按钮是否在范围内?既然看起来您正在发送指向自动变量的指针?您还需要测试队列超时吗?@Olupo,我已经读过了,但没有完全理解。这是否意味着它将永远是一个指针?即使我做了
xQueueSend(xQueueButtons,&butPlay,0)task_lcd
xQueueButtons=xQueueCreate(6,sizeof(t_but));但按钮
任务按钮上
?这是可行的,但我认为它创建了一个结构副本。@bd2357不确定您的意思,但是
task\u按钮
task\u lcd
总是运行,有点像线程。队列超时设置在
xQueueReceive
上,设置为等待约500次。在
xQueueSend
的示例中,在结构的示例中,
pvItemToQueue
是指向结构的指针的地址,该指针被类型转换为
void*
。我不知道这是否有用。我现在无法测试。不知道FreeRTOS用例,但任务按钮是否在范围内?既然看起来您正在发送指向自动变量的指针?您还需要测试队列超时吗?@Olupo,我已经读过了,但没有完全理解。这是否意味着它将永远是一个指针?即使我做了
xQueueSend(xQueueButtons,&butPlay,0)task_lcd
xQueueButtons=xQueueCreate(6,sizeof(t_but));但按钮
任务按钮上
?这是可行的,但我认为它创建了一个结构副本。@bd2357不确定您的意思,但是
task\u按钮
task\u lcd
总是运行,有点像线程。队列超时设置为
xQueueReceive
,设置为等待500次。