我使用stm32H5开发板移植了一个USBX,然后使用FreeRtos创建了一个发送数据的任务,但是该任务运行了3次才成功发送一次数据。我尝试用STLink调试,但没有发现问题,应该从哪里排查?
这是我的移植过程
然后我添加了USBX代码和头文件
之后我修改usb.c中的代码来启动USB控制器
我在 STANDALONE 模式下使用 USBX,因此在 FreeRTOS 中运行 ux_system_tasks_run()。
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN defaultTask */
/* Infinite loop */
for(;;)
{
/*==============LED===========================*/
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
vTaskDelay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
vTaskDelay(500);
/* call usbx system fuc*/
ux_system_tasks_run();
}
/* USER CODE END defaultTask */
}
接下来我使用另一个任务通过USB发送数据
static void SPILCDTaskFunction( void *pvParameters )
{
char buf[100];
int cnt = 0;
while (1)
{
cnt ++;
sprintf(buf, "LCD Task Test : %d\r\n", cnt);
//Draw_String(0, 0, buf, 0x0000ff00, 0);
/* use usb send data */
int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout);
ux_device_cdc_acm_send((uint8_t *)buf, strlen(buf), 1000);
vTaskDelay(1000);
}
}
我期望串口每秒能收到连续的数字,但我等了3秒才收到。
[14:07:59.126]收←◆LCD Task Test : 79
[14:08:02.119]收←◆LCD Task Test : 82
[14:08:05.102]收←◆LCD Task Test : 85
[14:08:08.094]收←◆LCD Task Test : 88
[14:08:11.077]收←◆LCD Task Test : 91
[14:08:14.072]收←◆LCD Task Test : 94
[14:08:17.052]收←◆LCD Task Test : 97
[14:08:32.993]收←◆LCD Task Test : 100
我用ST-Link调试,发现这个任务运行正常,也就是说变量cnt不断增长,但是ux_device_cdc_acm_send()函数每调用3次才成功发送一次数据
ux_device_cdc_acm_send()函数
int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout)
{
if (cdc_acm)
{
if (UX_SUCCESS == ux_device_class_cdc_acm_write_with_callback(cdc_acm, datas, len))
{
}
else
{
return -1;
}
}
else
{
return -1;
}
return 0;
}
我正在使用串行调试助手向开发板发送数据,他接收得很好。
我不知道接下来该去哪里解决错误
找到原因了,原来是我在RTOS的默认任务中放了一个LED任务,所以默认任务每次都有1s的延迟,而USBX系统函数ux_system_tasks_run()也在这个任务中,而且它会受到延迟的影响,导致消息无法及时发送
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN defaultTask */
/* Infinite loop */
for(;;)
{
/*==============LED===========================*/
// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
// vTaskDelay(500);
// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
// vTaskDelay(500);
ux_system_tasks_run();
}
/* USER CODE END defaultTask */
}
如上面代码所示,我注释掉LED和延时相关的代码后,得到了想要的结果
[14:09:56.984]收←◆LCD Task Test : 35
[14:09:57.985]收←◆LCD Task Test : 36
[14:09:58.970]收←◆LCD Task Test : 37
[14:09:59.972]收←◆LCD Task Test : 38
[14:10:00.974]收←◆LCD Task Test : 39
[14:10:01.959]收←◆LCD Task Test : 40
[14:10:02.538]发→◇12343245324534efsadfasdfasdfa□
[14:10:02.960]收←◆LCD Task Test : 41
[14:10:03.961]收←◆LCD Task Test : 42
[14:10:04.947]收←◆LCD Task Test : 43