Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
5 years, 7 months ago.
Previous data of Queue is overwritten.
I used NUCLEO F303RE and OS5.
I tried to use Queue, but previous Queue data was overwritten to most recent value.
main.cpp
#include "mbed.h" Serial pc(USBTX, USBRX); Thread thread1; Queue<int, 10> queue; void callback(){ int i=0; while(1){ queue.put(&i); pc.printf("put %d\n\r", i); i++; wait(1); } } int main(){ thread1.start(callback); while(1){ while(!queue.empty()){ osEvent evt = queue.get(); int *tmp = (int*)evt.value.p; pc.printf("get %d\n\r", *tmp); } wait(3); } }
output
put 0 put 1 put 2 get 3 get 3 get 3 put 3 put 4 put 5 get 6 get 6 get 6 put 6 put 7 put 8 get 9 get 9 get 9 put 9 put 10 put 11 get 12 get 12 get 12
Please tell me what is wrong.
2 Answers
5 years, 7 months ago.
Since you are only sending the address of variable i, it is possible your i++ is firing before the main wait loop executes. I think the context switch will happen at the next 10ms systick so you can imagine printf and i++ in callback finishing before the switch occurs. Malloc is often used for items going into the queue so you have a unique variable to put in the queue. Then the handler frees it. Using the rtos Mail mechanism solves this too where you basically have a pool of messages/variables that can be used. In this example you could also probably just move i++ in callback() after the wait and it would run in the expected order.
Also what Bill said. That check is used in all the mbed queue examples.
5 years, 7 months ago.
Hi Shouldn't you have a test for the status of the queue? See this example here where they use the status flag. One of the conditions is that *nothing* is in the queue...
https://os.mbed.com/docs/mbed-os/v5.12/apis/queue.html#ad033ffca23a9800b6607f08cec807417
while (true) { osEvent evt = queue.get(); if (evt.status == osEventMessage) { message_t *message = (message_t*)evt.value.p;