硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1125|回复: 6
收起左侧

[ThreadX全家桶] USBX HOST MSC 初始化内存越界

[复制链接]

15

主题

65

回帖

110

积分

初级会员

积分
110
发表于 2024-9-25 11:13:02 | 显示全部楼层 |阅读模式
本帖最后由 Superusrss 于 2024-9-25 12:00 编辑

stm32 repo上提供的USBX host MSC实例非常啰嗦,所以自己实现,发现内存越界

ST的实现如下,
[C] 纯文本查看 复制代码
#define USBX_HOST_MEMORY_STACK_SIZE     1024 * 22
#define UX_HOST_APP_THREAD_STACK_SIZE   1024

  if (tx_byte_allocate(byte_pool, (VOID **) &pointer,
                       USBX_HOST_MEMORY_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    /* USER CODE BEGIN USBX_ALLOCATE_STACK_ERORR */
    return TX_POOL_ERROR;
    /* USER CODE END USBX_ALLOCATE_STACK_ERORR */
  }

  /* Initialize USBX Memory */
  if (ux_system_initialize(pointer, USBX_HOST_MEMORY_STACK_SIZE, UX_NULL, 0) != UX_SUCCESS)
  {
    /* USER CODE BEGIN USBX_SYSTEM_INITIALIZE_ERORR */
    return UX_ERROR;
    /* USER CODE END USBX_SYSTEM_INITIALIZE_ERORR */
  }

/* Allocate the stack for host application main thread */
  if (tx_byte_allocate(byte_pool, (VOID **) &pointer, UX_HOST_APP_THREAD_STACK_SIZE,
                       TX_NO_WAIT) != TX_SUCCESS)
  {
    /* USER CODE BEGIN MAIN_THREAD_ALLOCATE_STACK_ERORR */
    return TX_POOL_ERROR;
    /* USER CODE END MAIN_THREAD_ALLOCATE_STACK_ERORR */
  }

  /* Create the host application main thread */
  if (tx_thread_create(&ux_host_app_thread, UX_HOST_APP_THREAD_NAME, app_ux_host_thread_entry,
                       0, pointer, UX_HOST_APP_THREAD_STACK_SIZE, UX_HOST_APP_THREAD_PRIO,
                       UX_HOST_APP_THREAD_PREEMPTION_THRESHOLD, UX_HOST_APP_THREAD_TIME_SLICE,
                       UX_HOST_APP_THREAD_START_OPTION) != TX_SUCCESS)
  {
    /* USER CODE BEGIN MAIN_THREAD_CREATE_ERORR */
    return TX_THREAD_ERROR;
    /* USER CODE END MAIN_THREAD_CREATE_ERORR */
  }

static VOID app_ux_host_thread_entry(ULONG thread_input)
{
  /* USER CODE BEGIN app_ux_host_thread_entry */

  /* Initialization of USB host */
  USBX_APP_Host_Init();

  /* USER CODE END app_ux_host_thread_entry */
}
VOID USBX_APP_Host_Init(VOID)
{
  /* USER CODE BEGIN USB_Host_Init_PreTreatment_0 */

  /* USER CODE END USB_Host_Init_PreTreatment_0 */

  /* Initialize the LL driver */
  MX_USB_OTG_HS_HCD_Init();

  /* Register all the USB host controllers available in this system. */
  ux_host_stack_hcd_register(_ux_system_host_hcd_stm32_name,
                             _ux_hcd_stm32_initialize, USB_OTG_HS_PERIPH_BASE,
                             (ULONG)&hhcd_USB_OTG_HS);

  


ST的实现app_ux_host_thread_entry这个是一次运行的,但是新建了个进程,所以按理说直接调用也是可以的, 新建进程会一直占着内存

发现硬汉的实现非常神奇,传入的数组大小和实际大小不一样,是否也是处理这个问题?
[C] 纯文本查看 复制代码
/* USBX动态内存分配 */
#define USBX_MEMORY_SIZE            (32 * 1024)
#define USBX_APP_BYTE_POOL_SIZE     ((1024 * 10) + (USBX_MEMORY_SIZE))

static uint8_t usbx_pool[USBX_APP_BYTE_POOL_SIZE];

ux_system_initialize(usbx_pool, USBX_MEMORY_SIZE, UX_NULL, 0);


上述代码usbx_pool大小是42k,但是ux_system_initialize传入的是32k, 我改到一样大就越界错误了

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117538
QQ
发表于 2024-9-25 15:42:51 | 显示全部楼层
我没有做USBX的HOST
我只做了个Device的案例
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-9-25 15:47:20 | 显示全部楼层
eric2013 发表于 2024-9-25 15:42
我没有做USBX的HOST
我只做了个Device的案例

主要是这里的处理啦,ux_system_initialize(), 其他地方没有用到缓存,就是想了解下为什么要做一个比使用大小大的buffer
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-9-25 23:18:13 | 显示全部楼层
本帖最后由 Superusrss 于 2024-9-27 00:35 编辑

最新进展,内存没有越界,改成一样大也可以。

重点是,所有threadx全家桶api若牵扯到使用threadx的,最好再threadx上下文环境中进行,像filex很多api都会检查上下文环境,但是像ux_system_initialize这种就没有,因为是初始化,直接调用就会有问题,改到线程调用就ok了

update: 好像也不对,ST 的代码就是直接调用ux_system_initialize初始化的。。


update2: 找到原因了,直接调用使用系统堆栈,大小不够。线程中调用的话使用线程堆栈,勉强够。。这种越界还真不好找,现象是无法响应中断。。
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-9-25 23:20:42 | 显示全部楼层
ps, 为什么大容量的U盘,尤其是exfat格式的,使用filex+usb host msc 总是会造成各种各样的报错甚至hardfault,把分区删掉后重建就ok了。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117538
QQ
发表于 2024-9-26 08:09:13 | 显示全部楼层
Superusrss 发表于 2024-9-25 15:47
主要是这里的处理啦,ux_system_initialize(), 其他地方没有用到缓存,就是想了解下为什么要做一个比使用 ...

这个地方还真忘了为什么这么处理了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117538
QQ
发表于 2024-9-26 08:13:28 | 显示全部楼层
Superusrss 发表于 2024-9-25 23:20
ps, 为什么大容量的U盘,尤其是exfat格式的,使用filex+usb host msc 总是会造成各种各样的报错甚至hardfau ...

之前测试exFat的大容量SD,有些刚买的会识别有问题,我是通过SD卡联盟的小软件格式下好了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 14:22 , Processed in 0.042498 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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