@@ -58,7 +58,7 @@ typedef struct
5858extern int kSock ;
5959extern TaskHandle_t kDAPTaskHandle ;
6060
61- int kRestartDAPHandle = 0 ;
61+ int kRestartDAPHandle = NO_SIGNAL ;
6262
6363
6464static DapPacket_t DAPDataProcessed ;
@@ -74,6 +74,36 @@ static RingbufHandle_t dap_dataOUT_handle = NULL;
7474static SemaphoreHandle_t data_response_mux = NULL ;
7575
7676
77+ void malloc_dap_ringbuf () {
78+ if (data_response_mux && xSemaphoreTake (data_response_mux , portMAX_DELAY ) == pdTRUE )
79+ {
80+ if (dap_dataIN_handle == NULL ) {
81+ dap_dataIN_handle = xRingbufferCreate (DAP_HANDLE_SIZE * DAP_BUFFER_NUM , RINGBUF_TYPE_BYTEBUF );
82+ }
83+ if (dap_dataOUT_handle == NULL ) {
84+ dap_dataOUT_handle = xRingbufferCreate (DAP_HANDLE_SIZE * DAP_BUFFER_NUM , RINGBUF_TYPE_BYTEBUF );
85+ }
86+
87+ xSemaphoreGive (data_response_mux );
88+ }
89+ }
90+
91+ void free_dap_ringbuf () {
92+ if (data_response_mux && xSemaphoreTake (data_response_mux , portMAX_DELAY ) == pdTRUE ) {
93+ if (dap_dataIN_handle ) {
94+ vRingbufferDelete (dap_dataIN_handle );
95+ }
96+ if (dap_dataOUT_handle ) {
97+ vRingbufferDelete (dap_dataOUT_handle );
98+ }
99+
100+ dap_dataIN_handle = dap_dataOUT_handle = NULL ;
101+ xSemaphoreGive (data_response_mux );
102+ }
103+
104+ }
105+
106+
77107void handle_dap_data_request (usbip_stage2_header * header , uint32_t length )
78108{
79109 uint8_t * data_in = (uint8_t * )header ;
@@ -168,21 +198,28 @@ void DAP_Thread(void *argument)
168198 {
169199 if (kRestartDAPHandle )
170200 {
171- vRingbufferDelete (dap_dataIN_handle );
172- vRingbufferDelete (dap_dataOUT_handle );
173- dap_dataIN_handle = dap_dataOUT_handle = NULL ;
174-
175- dap_dataIN_handle = xRingbufferCreate (DAP_HANDLE_SIZE * DAP_BUFFER_NUM , RINGBUF_TYPE_BYTEBUF );
176- dap_dataOUT_handle = xRingbufferCreate (DAP_HANDLE_SIZE * DAP_BUFFER_NUM , RINGBUF_TYPE_BYTEBUF );
177- if (dap_dataIN_handle == NULL || dap_dataIN_handle == NULL )
178- {
179- os_printf ("Can not create DAP ringbuf/mux!\r\n" );
180- vTaskDelete (NULL );
201+ free_dap_ringbuf ();
202+
203+ if (kRestartDAPHandle == RESET_HANDLE ) {
204+ malloc_dap_ringbuf ();
205+ if (dap_dataIN_handle == NULL || dap_dataIN_handle == NULL )
206+ {
207+ os_printf ("Can not create DAP ringbuf/mux!\r\n" );
208+ vTaskDelete (NULL );
209+ }
181210 }
182- kRestartDAPHandle = 0 ;
211+
212+ kRestartDAPHandle = NO_SIGNAL ;
183213 }
184214
185- ulTaskNotifyTake (pdFALSE , portMAX_DELAY );
215+ ulTaskNotifyTake (pdFALSE , portMAX_DELAY ); // wait event
216+
217+
218+ if (dap_dataIN_handle == NULL || dap_dataOUT_handle == NULL ) {
219+ continue ; // may be use elaphureLink, wait...
220+ }
221+
222+
186223 packetSize = 0 ;
187224 item = (DapPacket_t * )xRingbufferReceiveUpTo (dap_dataIN_handle , & packetSize ,
188225 pdMS_TO_TICKS (1 ), DAP_HANDLE_SIZE );
0 commit comments