Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-os-example-ble-Advertising
Revision 164:51bba7d36eb4, committed 2015-10-30
- Comitter:
- Wolfgang Betz
- Date:
- Fri Oct 30 14:08:52 2015 +0100
- Parent:
- 163:4c008b1089e9
- Child:
- 165:3576598c0889
- Commit message:
- Perform a saver queue handling
Changed in this revision
| source/BlueNRGGap.cpp | Show annotated file Show diff for this revision Revisions of this file |
| source/bluenrg-hci/hci/hci.c | Show annotated file Show diff for this revision Revisions of this file |
--- a/source/BlueNRGGap.cpp Fri Oct 30 10:26:15 2015 +0100
+++ b/source/BlueNRGGap.cpp Fri Oct 30 14:08:52 2015 +0100
@@ -1072,7 +1072,7 @@
addr_type,
1); // 1 to filter duplicates
if (ret != BLE_STATUS_SUCCESS) {
- printf("Start Discovery Procedure failed (0x%02X)\n\r", ret);
+ PRINTF("Start Discovery Procedure failed (0x%02X)\n\r", ret);
// FIXME: We need to wait for a while before starting discovery proc
// due to BlueNRG process queue handling
// NOTE: this workaround causes a potential risk for an endless loop!!!
@@ -1163,7 +1163,7 @@
SUPERV_TIMEOUT, CONN_L1 , CONN_L2);
if (ret != BLE_STATUS_SUCCESS) {
- printf("Error while starting connection (ret=0x%02X).\n\r", ret);
+ PRINTF("Error while starting connection (ret=0x%02X).\n\r", ret);
// FIXME: We need to wait for a while before creating a connection
// due to BlueNRG process queue handling
// NOTE: this workaround causes a potential risk for an endless loop!!!
--- a/source/bluenrg-hci/hci/hci.c Fri Oct 30 10:26:15 2015 +0100
+++ b/source/bluenrg-hci/hci/hci.c Fri Oct 30 14:08:52 2015 +0100
@@ -32,13 +32,22 @@
#define HCI_LOG_ON 0
-#define HCI_READ_PACKET_NUM_MAX (50)
+#define HCI_READ_PACKET_NUM_MAX (0x20)
#define MIN(a,b) ((a) < (b) )? (a) : (b)
#define MAX(a,b) ((a) > (b) )? (a) : (b)
tListNode hciReadPktPool;
tListNode hciReadPktRxQueue;
+
+// betzw - DEBUG:
+//#define POOL_CNT
+#ifdef POOL_CNT
+#include <stdio.h>
+static unsigned int nr_hciReadPktPool;
+static unsigned int lowest_nr_hciReadPktPool;
+#endif // POOL_CNT
+
/* pool of hci read packets */
static tHciDataPacket hciReadPacketBuffer[HCI_READ_PACKET_NUM_MAX];
@@ -57,6 +66,12 @@
{
uint8_t index;
+ Disable_SPI_IRQ();
+
+#ifdef POOL_CNT
+ nr_hciReadPktPool = 0;
+#endif // POOL_CNT
+
/* Initialize list heads of ready and free hci data packet queues */
list_init_head (&hciReadPktPool);
list_init_head (&hciReadPktRxQueue);
@@ -65,7 +80,16 @@
for (index = 0; index < HCI_READ_PACKET_NUM_MAX; index++)
{
list_insert_tail(&hciReadPktPool, (tListNode *)&hciReadPacketBuffer[index]);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif // POOL_CNT
}
+
+#ifdef POOL_CNT
+ lowest_nr_hciReadPktPool = nr_hciReadPktPool;
+#endif // POOL_CNT
+
+ Enable_SPI_IRQ();
}
#define HCI_PCK_TYPE_OFFSET 0
@@ -96,6 +120,11 @@
uint8_t buffer[HCI_READ_PACKET_SIZE];
tHciDataPacket * hciReadPacket = NULL;
+#ifdef POOL_CNT
+ printf("betzw(%s, %d): nr_hciReadPktPool = %u (lowest = %u)\r\n", __func__, __LINE__,
+ nr_hciReadPktPool, lowest_nr_hciReadPktPool);
+#endif // POOL_CNT
+
Disable_SPI_IRQ();
uint8_t list_empty = list_is_empty(&hciReadPktRxQueue);
/* process any pending events read */
@@ -106,6 +135,9 @@
HCI_Event_CB(hciReadPacket->dataBuff);
Disable_SPI_IRQ();
list_insert_tail(&hciReadPktPool, (tListNode *)hciReadPacket);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif
list_empty = list_is_empty(&hciReadPktRxQueue);
}
if (readPacketListFull) {
@@ -136,7 +168,12 @@
/* enqueueing a packet for read */
list_remove_head (&hciReadPktPool, (tListNode **)&hciReadPacket);
-
+#ifdef POOL_CNT
+ nr_hciReadPktPool--;
+ if(nr_hciReadPktPool < lowest_nr_hciReadPktPool)
+ lowest_nr_hciReadPktPool = nr_hciReadPktPool;
+#endif
+
data_len = BlueNRG_SPI_Read_All(hciReadPacket->dataBuff, HCI_READ_PACKET_SIZE);
if(data_len > 0){
hciReadPacket->data_len = data_len;
@@ -147,11 +184,17 @@
#endif
} else {
list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif
}
}
else {
// Insert the packet back into the pool.
list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif
}
}
else{
@@ -327,15 +370,21 @@
}
/* In the meantime there could be other events from the controller.
- In this case, insert the packet in a different queue. These packets will be
- inserted back in the main queue just before exiting from send_req().
+ In this case, insert the packet in a different queue. These packets will be
+ inserted back in the main queue just before exiting from send_req().
*/
- list_insert_tail(&hciTempQueue, (tListNode *)hciReadPacket);
+ if(hciReadPacket != NULL) {
+ list_insert_tail(&hciTempQueue, (tListNode *)hciReadPacket);
+ hciReadPacket = NULL;
+ }
/* Be sure there is at list one packet in the pool to process the expected event. */
- if(list_is_empty(&hciReadPktPool)){
+ if(list_is_empty(&hciReadPktPool)){ // betzw: this is a kind of steeling (should never happen?!?)
pListNode tmp_node;
list_remove_head(&hciReadPktRxQueue, &tmp_node);
- list_insert_tail(&hciReadPktPool, tmp_node);
+ list_insert_tail(&hciReadPktPool, tmp_node);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif
}
Enable_SPI_IRQ();
@@ -343,13 +392,27 @@
}
failed:
+ // Insert the packet back into the pool.
+ if(hciReadPacket != NULL) {
+ list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif
+ hciReadPacket = NULL;
+ }
move_list(&hciReadPktRxQueue, &hciTempQueue);
Enable_SPI_IRQ();
return -1;
done:
// Insert the packet back into the pool.
- list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
+ if(hciReadPacket != NULL) {
+ list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
+#ifdef POOL_CNT
+ nr_hciReadPktPool++;
+#endif
+ hciReadPacket = NULL;
+ }
move_list(&hciReadPktRxQueue, &hciTempQueue);
Enable_SPI_IRQ();