xQueueReceive

Hello I just started with freertos …In the following code I am reciving Que Items in a loop I am getting Same Item in the Loop Whats going wrong ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while(i<10){ i++; struct AMessage *pxMessage; if (xQueueReceive( xQueue1, &pxMessage, 0)){ ESP_LOGI(TAG, “—minor—%d == slno=%d” , pxMessage->minor ,pxMessage->slno); asprintf(&post_data, “%s,%d”, data ,pxMessage->minor ); free(data); asprintf(&data, “%s”, post_data ); free(post_data); } }** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

xQueueReceive

When you post source code, please put it between 2 lines that contain 3 tildas only: ~~~ ~~~ /* Write you source code between tildas. */ ~~~ ~~~ Beside that: could you also show the code that fills the queue? How is the queue created? How is it filled?

xQueueReceive

hello Hein Noted… Please Find Image.. of code How I am sending Items to Queue

xQueueReceive

Are you saying that you put in different items, but when you pop them from the queue, they are all the same?

xQueueReceive

hello Hein, Yes. I am observing the Queue is getting empty by 10, since I am looping 10times. I suspect something with pointer

xQueueReceive

Can’t you show show the complete code? Especially how the queue is created? The pointer &xMessage is the address of the data that must me copied into the queue space. You could say that you are passing the contents of the struct. When you want to pass big amounts of data to a queue, it can be more efficient to only pass references (pointers) to the queue. In that case, you would pas a pointer to a pointer to xQueueSendToFront()

xQueueReceive

hello sir, please find code for Queue Creation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struct AMessage {
    uint16_t minor;
    uint16_t rssi;
    uint16_t slno;
}xMessage;

xQueue1 = xQueueCreate(1000, sizeof( struct AMessage *) );
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

xQueueReceive

The trick with the tilda’s seems to work! You can also escape a piece of text by putting it between `back-quotes`. There you are:
xQueue1 = xQueueCreate(1000, sizeof( struct AMessage *) );
you defined the element size as big as a pointer, in stead of the struct size: xQueue1 = xQueueCreate(1000, sizeof( struct AMessage) ); So infact only 4 ( or 8 ) bytes were copied from struct to queue and vv.

xQueueReceive

hi I refered an example at http://www.openrtos.net/a00116.html. One more thing if I dont use loop.. it works fine… while in loop same items are recived.. ‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~’ int i=0; char *post_data; char *data; asprintf(&data, “%s”, “,”);
                while(i<10){
                    i++;
                    struct AMessage *pxMessage;
                    if (xQueueReceive( xQueue1, &(pxMessage), 0)){
                        ESP_LOGI(TAG, "---minor---%d == slno=%d" , pxMessage->minor ,pxMessage->slno);
                        asprintf(&post_data, "%s,%d", data ,pxMessage->minor     );
                        free(data);
                        asprintf(&data, "%s", post_data  );
                        free(post_data);
                        }
                    }
                if(data != NULL)
                    free(data);
         '`````````````````````````````````````````````````'

xQueueReceive

Ok, now you are passing a pointer to a pointer. Did you also change the code that sends the structure pointers to the queue? What does that look like now?

xQueueReceive

If you pass a pointer to a structure to xQueue send, then the queue makes a copy of the pointer, but NOT the stucture. That means the sender needs to use a different structure for each send, or it it changes the contnets of the structure, it will change what the task that gets that pointer sees in the structure. Basically, somewhere you need to store all the different values of the structures you want to send. If you send the structure, then the queue will copy ALL the data into the queue, and then copy all the data out of the queue, which is simpler programming, but a lot of work for the processor. If you send just a pointer to the structure, then you avoid all the data copying, but need to manage the buffers.