From 93ec7c11a67ef005297ddc2a34518a4f53cf5f45 Mon Sep 17 00:00:00 2001 From: Brian Webb Date: Tue, 15 May 2012 19:38:14 -0700 Subject: [PATCH] Fixed race condition on getting packets. --- flight/Libraries/packet_handler.c | 9 +++++- .../Modules/RadioComBridge/RadioComBridge.c | 28 +++++++++-------- flight/PipXtreme/System/inc/pios_config.h | 2 +- flight/PipXtreme/System/pios_board.c | 31 ++++++++++--------- .../board_hw_defs/pipxtreme/board_hw_defs.c | 6 ++-- shared/uavobjectdefinition/pipxsettings.xml | 2 +- 6 files changed, 45 insertions(+), 33 deletions(-) mode change 100755 => 100644 flight/PipXtreme/System/pios_board.c diff --git a/flight/Libraries/packet_handler.c b/flight/Libraries/packet_handler.c index ded3b10e1..cbb82d77e 100644 --- a/flight/Libraries/packet_handler.c +++ b/flight/Libraries/packet_handler.c @@ -174,7 +174,10 @@ PHPacketHandle PHGetTXPacket(PHInstHandle h) // Is the window full? uint8_t next_end = (data->tx_win_end + 1) % data->cfg.winSize; if(next_end == data->tx_win_start) + { + xSemaphoreGiveRecursive(data->lock); return NULL; + } data->tx_win_end = next_end; // Release lock @@ -202,7 +205,7 @@ void PHReleaseTXPacket(PHInstHandle h, PHPacketHandle p) // If this packet is at the start of the window, increment the start index. while ((data->tx_win_start != data->tx_win_end) && - (data->tx_packets[data->tx_win_start].header.type == PACKET_TYPE_NONE)) + (data->tx_packets[data->tx_win_start].header.type == PACKET_TYPE_NONE)) data->tx_win_start = (data->tx_win_start + 1) % data->cfg.winSize; // Release lock @@ -226,7 +229,11 @@ PHPacketHandle PHGetRXPacket(PHInstHandle h) // Is the window full? uint8_t next_end = (data->rx_win_end + 1) % data->cfg.winSize; if(next_end == data->rx_win_start) + { + // Release lock + xSemaphoreGiveRecursive(data->lock); return NULL; + } data->rx_win_end = next_end; // Release lock diff --git a/flight/Modules/RadioComBridge/RadioComBridge.c b/flight/Modules/RadioComBridge/RadioComBridge.c index 981acc4cb..52932635d 100644 --- a/flight/Modules/RadioComBridge/RadioComBridge.c +++ b/flight/Modules/RadioComBridge/RadioComBridge.c @@ -50,11 +50,11 @@ // Private constants #define TEMP_BUFFER_SIZE 25 -#define STACK_SIZE_BYTES 300 +#define STACK_SIZE_BYTES 150 #define TASK_PRIORITY (tskIDLE_PRIORITY + 1) #define BRIDGE_BUF_LEN 512 #define MAX_RETRIES 2 -#define REQ_TIMEOUT_MS 10 +#define RETRY_TIMEOUT_MS 20 #define STATS_UPDATE_PERIOD_MS 2000 #define RADIOSTATS_UPDATE_PERIOD_MS 1000 #define MAX_LOST_CONTACT_TIME 4 @@ -159,13 +159,13 @@ static int32_t RadioComBridgeStart(void) { if(data) { // Start the tasks - xTaskCreate(comUAVTalkTask, (signed char *)"ComUAVTalk", STACK_SIZE_BYTES/2, NULL, TASK_PRIORITY + 2, &(data->comUAVTalkTaskHandle)); + xTaskCreate(comUAVTalkTask, (signed char *)"ComUAVTalk", STACK_SIZE_BYTES, NULL, TASK_PRIORITY + 2, &(data->comUAVTalkTaskHandle)); if(PIOS_COM_TRANS_COM) - xTaskCreate(transparentCommTask, (signed char *)"transparentComm", STACK_SIZE_BYTES/2, NULL, TASK_PRIORITY + 2, &(data->transparentCommTaskHandle)); - xTaskCreate(radioReceiveTask, (signed char *)"RadioReceive", STACK_SIZE_BYTES/2, NULL, TASK_PRIORITY, &(data->radioReceiveTaskHandle)); - xTaskCreate(sendPacketTask, (signed char *)"SendPacketTask", STACK_SIZE_BYTES/2, NULL, TASK_PRIORITY, &(data->sendPacketTaskHandle)); - xTaskCreate(sendDataTask, (signed char *)"SendDataTask", STACK_SIZE_BYTES/2, NULL, TASK_PRIORITY, &(data->sendDataTaskHandle)); - xTaskCreate(radioStatusTask, (signed char *)"RadioStatus", STACK_SIZE_BYTES/2, NULL, TASK_PRIORITY, &(data->radioStatusTaskHandle)); + xTaskCreate(transparentCommTask, (signed char *)"transparentComm", STACK_SIZE_BYTES, NULL, TASK_PRIORITY + 2, &(data->transparentCommTaskHandle)); + xTaskCreate(radioReceiveTask, (signed char *)"RadioReceive", STACK_SIZE_BYTES, NULL, TASK_PRIORITY+ 2, &(data->radioReceiveTaskHandle)); + xTaskCreate(sendPacketTask, (signed char *)"SendPacketTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY + 2, &(data->sendPacketTaskHandle)); + xTaskCreate(sendDataTask, (signed char *)"SendDataTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY+ 2, &(data->sendDataTaskHandle)); + xTaskCreate(radioStatusTask, (signed char *)"RadioStatus", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->radioStatusTaskHandle)); #ifdef PIOS_INCLUDE_WDG PIOS_WDG_RegisterFlag(PIOS_WDG_COMUAVTALK); if(PIOS_COM_TRANS_COM) @@ -268,7 +268,7 @@ static void comUAVTalkTask(void *parameters) // Receive from USB HID if available, otherwise UAVTalk com if it's available. #if defined(PIOS_INCLUDE_USB) // Determine input port (USB takes priority over telemetry port) - if (PIOS_USB_CheckAvailable(0) && PIOS_COM_USB_HID) + if (PIOS_USB_CheckAvailable(0)) BufferedReadSetCom(f, PIOS_COM_USB_HID); else #endif /* PIOS_INCLUDE_USB */ @@ -322,8 +322,8 @@ static void comUAVTalkTask(void *parameters) UAVTalkConnectionData *connection = (UAVTalkConnectionData*)(data->inUAVTalkCon); UAVTalkInputProcessor *iproc = &(connection->iproc); - if (state == UAVTALK_STATE_COMPLETE) { - + if (state == UAVTALK_STATE_COMPLETE) + { // Is this a local UAVObject? if (iproc->obj != NULL) { @@ -475,6 +475,7 @@ static void radioReceiveTask(void *parameters) // Get a RX packet from the packet handler if required. if (p == NULL) p = PHGetRXPacket(pios_packet_handler); + if(p == NULL) { DEBUG_PRINTF(2, "RX Packet Unavailable.!\n\r"); // Wait a bit for a packet to come available. @@ -519,7 +520,8 @@ static void sendPacketTask(void *parameters) // Wait for a packet on the queue. if (xQueueReceive(data->sendPacketQueue, &p, MAX_PORT_DELAY) == pdTRUE) { // Send the packet. - PHTransmitPacket(pios_packet_handler, p); + if(!PHTransmitPacket(pios_packet_handler, p)) + PHReleaseTXPacket(pios_packet_handler, p); } } } @@ -547,7 +549,7 @@ static void sendDataTask(void *parameters) uint32_t retries = 0; int32_t success = -1; while (retries < MAX_RETRIES && success == -1) { - success = UAVTalkSendObject(data->outUAVTalkCon, ev.obj, 0, 0, REQ_TIMEOUT_MS); + success = UAVTalkSendObject(data->outUAVTalkCon, ev.obj, 0, 0, RETRY_TIMEOUT_MS); ++retries; } data->comTxRetries += retries; diff --git a/flight/PipXtreme/System/inc/pios_config.h b/flight/PipXtreme/System/inc/pios_config.h index 39d51ef1d..07a6f879b 100755 --- a/flight/PipXtreme/System/inc/pios_config.h +++ b/flight/PipXtreme/System/inc/pios_config.h @@ -59,7 +59,7 @@ #define PIOS_INCLUDE_GPIO #define PIOS_INCLUDE_EXTI #define PIOS_INCLUDE_RTC -#define PIOS_INCLUDE_WDG +//#define PIOS_INCLUDE_WDG #define PIOS_INCLUDE_BL_HELPER #define PIOS_INCLUDE_FLASH_EEPROM diff --git a/flight/PipXtreme/System/pios_board.c b/flight/PipXtreme/System/pios_board.c old mode 100755 new mode 100644 index 10b4d89da..98cbc9c53 --- a/flight/PipXtreme/System/pios_board.c +++ b/flight/PipXtreme/System/pios_board.c @@ -94,7 +94,7 @@ void PIOS_Board_Init(void) { #endif /* PIOS_INCLUDE_LED */ PipXSettingsData pipxSettings; -#if defined(PIOS_INCLUDE_FLASH_EEPROM) +#if defined(PIOS_INCLUDE_FLASH_EEPROM__NOT) PIOS_EEPROM_Init(&pios_eeprom_cfg); /* Read the settings from flash. */ @@ -126,9 +126,22 @@ void PIOS_Board_Init(void) { /* Initialize board specific USB data */ PIOS_USB_BOARD_DATA_Init(); + bool usb_cdc_present = false; #if defined(PIOS_INCLUDE_USB_CDC) - if (PIOS_USB_DESC_HID_CDC_Init()) { - PIOS_Assert(0); + switch (pipxSettings.VCPConfig) + { + case PIPXSETTINGS_VCPCONFIG_SERIAL: + case PIPXSETTINGS_VCPCONFIG_DEBUG: + if (PIOS_USB_DESC_HID_CDC_Init()) { + PIOS_Assert(0); + } + usb_cdc_present = true; + break; + case PIPXSETTINGS_VCPCONFIG_DISABLED: + if (PIOS_USB_DESC_HID_ONLY_Init()) { + PIOS_Assert(0); + } + break; } #else if (PIOS_USB_DESC_HID_ONLY_Init()) { @@ -142,10 +155,7 @@ void PIOS_Board_Init(void) { #if defined(PIOS_INCLUDE_USB_CDC) #if defined(PIOS_INCLUDE_COM) - switch (pipxSettings.VCPConfig) - { - case PIPXSETTINGS_VCPCONFIG_SERIAL: - case PIPXSETTINGS_VCPCONFIG_DEBUG: + if(usb_cdc_present) { uint32_t pios_usb_cdc_id; if (PIOS_USB_CDC_Init(&pios_usb_cdc_id, &pios_usb_cdc_cfg, pios_usb_id)) { @@ -165,17 +175,10 @@ void PIOS_Board_Init(void) { case PIPXSETTINGS_VCPCONFIG_SERIAL: pios_com_trans_com_id = pios_com_vcp_id; break; - case PIPXSETTINGS_VCPCONFIG_UAVTALK: - pios_com_uavtalk_com_id = pios_com_vcp_id; - break; case PIPXSETTINGS_VCPCONFIG_DEBUG: pios_com_debug_id = pios_com_vcp_id; break; } - break; - } - case PIPXSETTINGS_VCPCONFIG_DISABLED: - break; } #endif /* PIOS_INCLUDE_COM */ diff --git a/flight/board_hw_defs/pipxtreme/board_hw_defs.c b/flight/board_hw_defs/pipxtreme/board_hw_defs.c index 02ee81013..3572ff9b7 100644 --- a/flight/board_hw_defs/pipxtreme/board_hw_defs.c +++ b/flight/board_hw_defs/pipxtreme/board_hw_defs.c @@ -463,7 +463,7 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { #include const struct pios_usb_hid_cfg pios_usb_hid_cfg = { - .data_if = 2, + .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; @@ -473,10 +473,10 @@ const struct pios_usb_hid_cfg pios_usb_hid_cfg = { #include const struct pios_usb_cdc_cfg pios_usb_cdc_cfg = { - .ctrl_if = 0, + .ctrl_if = 1, .ctrl_tx_ep = 2, - .data_if = 1, + .data_if = 2, .data_rx_ep = 3, .data_tx_ep = 3, }; diff --git a/shared/uavobjectdefinition/pipxsettings.xml b/shared/uavobjectdefinition/pipxsettings.xml index e2f7b44f6..745945866 100644 --- a/shared/uavobjectdefinition/pipxsettings.xml +++ b/shared/uavobjectdefinition/pipxsettings.xml @@ -6,7 +6,7 @@ - +