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.
10 years, 4 months ago.
XbeeApi and mbed-rtos
When i import mbed-rtos library to my project the mbed blocks on the fuction xbeeDevice.setUpApi(). Is this a known issue? Do i have to configure something different on the .hpp configuration file so i can use mbed-rtos? If i delete the mbed-rtos library my code works just fine and it doesnt stop at xbeeDevice.setUpApi().
Question relating to:
1 Answer
10 years, 4 months ago.
Hi,
Thanks for letting me know - I've not tried using XBeeApi with mbed-rtos in a while now, and I know that there are sections of code that are not thread-safe. Let me take a look later today and I'll try and get back to you with an answer.
Thanks,
John
Thank you very much for your promptly aswner. I'm not even using mbed rtos on that code! It is just the fact of importing the mbed-rtos library! I wont have any issue with concurrency problems.
posted by 04 Jul 2014OK, I can reproduce this. Digging into it, it seems that the Serial class used in the API isn't RTOS friendly when used within interrupts (as the API does). Switching to RawSerial should fix the problem, so I'll try and get that done soon.
Thanks,
John
posted by 05 Jul 2014OK, so other than switching to RawSerial it seems that there was an issue with the received data handler overflowing the stack, so I've re-structured it slightly to use a thread outside the interrupt context to deal with the received data.
I've created an example at
Import programXBeeApiBroadcastExampleRTOS
Example of using the XBeeApi library to broadcast a message, based on XBeeApiBroadcastExample. This example shows how to use the library when using mbed-rtos. Before compiling you must open "XbeeApi\Config\XBeeApiCfg.hpp" and change the '#if 0' to '#if 1' on the line above the comment reading "Use RTOS features to make XBeeApi threadsafe"
which shows how to use the API if you're using mbed-rtos.
Simply:
- You need to change the configuration file as described in the comment at the top of the example
- You need to call xbeeDevice.setupDispatchTask() before calling setUpApi()
Hope that works for you - let me know how you get on.
Thanks,
John
posted by 06 Jul 2014Thanks you example worked perfectly! Does this alter anything regarding the way i receive packets? For some reason this part of the code stopped working:
XBeeApiRxFrame* frameP; pc.printf("Received frames: %d\r\n",rxBuffer.getFrameCount() ); /* Work through all of the frames in the buffer */ while( NULL != ( frameP = ( XBeeApiRxFrame* )rxBuffer.getTailPtr())) { /* Dump out some information from the frame */ dumpFrame( frameP ); interpret_frame( frameP ); /* Remove the frame from the buffer */ rxBuffer.pop(); }
I mean if i try to use one of your example for receiving like the one using the CircularBuffer or the callback one, neither works!
posted by 08 Jul 2014
Thanks you example worked perfectly! Does this alter anything regarding the way i receive packets? For some reason this part of the code stopped working:
XBeeApiRxFrame* frameP; pc.printf("Received frames: %d\r\n",rxBuffer.getFrameCount() ); /* Work through all of the frames in the buffer */ while( NULL != ( frameP = ( XBeeApiRxFrame* )rxBuffer.getTailPtr())) { /* Dump out some information from the frame */ dumpFrame( frameP ); interpret_frame( frameP ); /* Remove the frame from the buffer */ rxBuffer.pop(); }
posted by Grupo 1 Ser 08 Jul 2014