硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 3695|回复: 8
收起左侧

[RTOS] FreeRTOS+USB host,程序应该如何设计?

[复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2022-11-23 17:42:23 | 显示全部楼层 |阅读模式
最近放弃SD卡实时写入,改为尝试用U盘来进行实时录数据,裸机情况下已经移植好,但是放在while循环里面实际运行起来会影响我其他功能的实时性,所以转而投靠到FreeRTOS上;

下面是裸机移植的图,根据一些教程有说到这个MX_USB_HOST_Process()需要放在主循环不停运行,而这个MX_USB_HOST_Process()本质上就是USBH_Process(&hUsbHostFS);
image.png

所以我想着在FreeRTOS里面也是创建一个任务,专门给这个函数用,如下图:
image.png

可是按照这个操作,虽然插入U盘和拔出U盘都有响应,但是响应并不正确:
image.png

裸机情况下的响应是这样的:
image.png

请教一下大家,FreeRTOS+USB host的程序逻辑应该是怎么样的?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124425
QQ
发表于 2022-11-24 01:07:45 | 显示全部楼层
使用ST的USB库,我记得他们官方有个配合RTOS的层,你找找,或者使用CubeMX生成试试。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-24 10:35:42 | 显示全部楼层
eric2013 发表于 2022-11-24 01:07
使用ST的USB库,我记得他们官方有个配合RTOS的层,你找找,或者使用CubeMX生成试试。

我的是使用cubeMX生成的,现在不太明白是否需要创建一个专门的任务去执行USBH_Process(&hUsbHostFS);
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124425
QQ
发表于 2022-11-24 10:37:47 | 显示全部楼层
852050675 发表于 2022-11-24 10:35
我的是使用cubeMX生成的,现在不太明白是否需要创建一个专门的任务去执行USBH_Process(&hUsbHostFS);

ST的USB库有个专门的RTOS玩法的,是基于消息通信机制的,找下。
回复

使用道具 举报

371

主题

2239

回帖

3357

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3357
发表于 2022-11-24 10:54:43 | 显示全部楼层
852050675 发表于 2022-11-24 10:35
我的是使用cubeMX生成的,现在不太明白是否需要创建一个专门的任务去执行USBH_Process(&hUsbHostFS);

就是用cubemx生成的代码就可以了。里面可以勾选fatfs文件系统和FreeRTOS系统。
在任务循环中调用 MX_USB_HOST_Process();
然后根据 Appli_state==xxxxxx状态来进行对应的操作。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-24 15:07:22 | 显示全部楼层
caicaptain2 发表于 2022-11-24 10:54
就是用cubemx生成的代码就可以了。里面可以勾选fatfs文件系统和FreeRTOS系统。
在任务循环中调用 MX_USB ...

谢谢,但是我发现cubeMX生成的FreeRTOS工程没有MX_USB_HOST_Process()这个函数,但是如果是cubeMX生成裸机程序的话就会有,有点没明白为什么FreeRTOS就没有。
而且如果在任务循环里面调用的是USBH_Process(&hUsbHostFS)的话,就会像我贴出来的图片那样显示的内容和裸机不一样
回复

使用道具 举报

5

主题

16

回帖

31

积分

新手上路

积分
31
发表于 2026-1-17 15:06:42 | 显示全部楼层
这两项放一块就是不行,分开都可以,唉。大佬可否提供正常运行的工程?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124425
QQ
发表于 2026-1-19 08:58:26 | 显示全部楼层
wdmvw 发表于 2026-1-17 15:06
这两项放一块就是不行,分开都可以,唉。大佬可否提供正常运行的工程?

在你的另一个帖子里面已经回复。

freertos+fatfs+hostusb整不到一块
https://forum.anfulai.cn/forum.p ... 0790&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

14

主题

69

回帖

111

积分

初级会员

积分
111
发表于 2026-1-19 09:35:15 | 显示全部楼层
本帖最后由 quanshimutou 于 2026-1-19 09:37 编辑
wdmvw 发表于 2026-1-17 15:06
这两项放一块就是不行,分开都可以,唉。大佬可否提供正常运行的工程?

你可以看看这个
就是说,在CubeMX生成的FreeRTOS+USB的工程中:
[C] 纯文本查看 复制代码
void StartDefaultTask(void *argument){ // 默认任务
    MX_USB_HOST_Init();// 调用一次
    ......
}
void MX_USB_HOST_Init(void){
  /* Init host Library, add supported class and start the library. */
  USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS)// 初始化
  ......
  USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS) // 注册
  ......
  USBH_Start(&hUsbHostFS) // 启动
  ......
}
// 里面的USBH_Init()函数会创建一个信号队列,创建一个任务
USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS){
// 创建一个信号队列,创建一个任务
#if (USBH_USE_OS == 1U)
  /* Create USB Host Queue */
  phost->os_event = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(uint32_t), NULL);

  /* Create USB Host Task */
  USBH_Thread_Atrr.name = "USBH_Queue";
  USBH_Thread_Atrr.stack_size = USBH_PROCESS_STACK_SIZE;
  USBH_Thread_Atrr.priority = USBH_PROCESS_PRIO;
  phost->thread = osThreadNew(USBH_Process_OS, phost, &USBH_Thread_Atrr);
  // 任务的函数是 USBH_Process_OS
#endif /* (USBH_USE_OS == 1U) */
}
// 任务函数
static void USBH_Process_OS(void *argument) {
  osStatus_t status;
  for (;;) { // 等消息,然后执行USB背景任务
    status = osMessageQueueGet(((USBH_HandleTypeDef *)argument)->os_event,
                               &((USBH_HandleTypeDef *)argument)->os_msg, NULL, osWaitForever);
    if (status == osOK) {
      USBH_Process((USBH_HandleTypeDef *)argument); // USB背景任务
    }
  }
}

所以,freertos建立的任务,不断的发送消息给这个任务,启动执行"USBH_Process"后台处理函数。
[C] 纯文本查看 复制代码
extern USBH_HandleTypeDef hUsbHostFS;
uint32_t msg = 0;
osMessageQueuePut(hUsbHostFS.os_event, &msg, 1, 10);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-10-24 09:26 , Processed in 0.180901 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表