本帖最后由 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, 我改到一样大就越界错误了
|