2024-11-08 1:58 AM
Im using USBx as my USB driver for the STM32U599VJT6Q.
This driver has 2 functions: "usbx_cdc_acm_read_thread_entry" and "usbx_cdc_acm_write_thread_entry" each of which runs in their own thread.
The problem im having is the thread running "usbx_cdc_acm_write_thread_entry" gets semaphore suspended whenever interference occurs on the USB transmission line.
The problem appears to be related to the function "ux_device_class_cdc_acm_write" as i have not been able to recreate the issue after removing it from the function.
I haven't found any functions that can circumvent a semaphore suspension, so instead i have attempted to delete the thread and recreate it periodically, this works before interference occurs, however after the interference occurs it does manage to create a new thread but it still does not run.
Transmit function:
VOID usbx_cdc_acm_write_thread_entry(ULONG thread_input)
{
/* Private Variables */
ULONG tx_actual_length;
UX_SLAVE_DEVICE *device;
const char ctrStr[10] = "Alive!\n";
device = &_ux_system_slave->ux_system_slave_device;
uint32_t ctr = 0;
char* testData;
while(1)
{
// if ((device->ux_slave_device_state == UX_DEVICE_CONFIGURED) && (cdc_acm != UX_NULL))
// {
//if (tx_queue_receive(&USB_data, &testData, TX_WAIT_FOREVER) == TX_SUCCESS)
// if (tx_queue_receive(&USB_data, &testData, TX_NO_WAIT) == TX_SUCCESS)
// {
// ux_device_class_cdc_acm_write(cdc_acm, testData, strlen(testData), &tx_actual_length);
// }
// else
// {
if (ctr++ > 10)
{
ctr = 0;
ux_device_class_cdc_acm_write(cdc_acm, ctrStr, strlen(ctrStr), &tx_actual_length);
}
tx_thread_sleep(1);
// }
// }
tx_thread_sleep(1);
//free(testData);
}
}
My attempt at solving the problem:
static VOID app_ux_device_thread_entry(ULONG thread_input)
{
int counter = 0;
/*
...
*/
while (1)
{
tx_thread_sleep(100); // <---- Added to allow other processes to run
if(counter > 15){
counter = 0;
UINT status1 = tx_thread_terminate(&ux_cdc_write_thread);
UINT status2 = tx_thread_delete(&ux_cdc_write_thread);
tx_thread_sleep(100);
UINT status3 = tx_thread_create(&ux_cdc_write_thread, "cdc_acm_write_usbx_app_thread_entry", usbx_cdc_acm_write_thread_entry, 1, pointer, 1025, 13, 13, TX_NO_TIME_SLICE, TX_AUTO_START); // Priority was 20
// UINT status4 = tx_thread_resume(&ux_cdc_write_thread);
// int temp = 3;
}
else{
counter++;
}
}
/* USER CODE END app_ux_device_thread_entry */
}
2025-01-30 5:43 AM
Hi @marcus1129
The title is quite confusing! Do you mean Electromagnetic Compatibility is the root cause of the issue?
Ensure that you are checking the return status of the ux_device_class_cdc_acm_write function. Maybe this is because you did not set transmission status to UX_FALSE for the first time. Also, you should also think about event-driven approach not time-based waiting for a periodic check.
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.