Ansersion 发表于 2020-6-16 18:17

HC32F072 RAM使用超过8K后,USB HID Keyboard就跑不动了

本帖最后由 Ansersion 于 2020-6-16 18:24 编辑

自己的项目工程使用了FreeRTOS和keyboard hid,开发过程中发现:如果多创建几个FreeRTOS任务(多使用任务堆栈——RAM)USB HID就跑不动,具体表现如下图


于是我用了官方HID KEYBOARD例程在评估板上跑,预分配8K RAM(0x2000),编译器优化等级None,如下图所示:

同样是出现上面的问题。如果改成6K RAM(0x1800)描述符可以请求成功,但是按评估版上的按键无反应。如果改成5K RAM(0x1400),则运行正常。
求教哪位大神给点指引

例程路径:hc32f072_ddl_Rev1.1.1\example\usb\usb_keyboard\example\EWARM

caizhiwei 发表于 2020-6-16 18:51

本帖最后由 caizhiwei 于 2020-6-16 18:53 编辑

不应该呀?ram 有16kb,难道是假的?

caizhiwei 发表于 2020-6-16 18:52

liaotian001 发表于 2020-6-16 19:17

USB控制器有2种访问存储空间的方式:
1. DMA模式,USB作为AHB Master,直接访问存储空间, 速度快,但是目前访问地址被限制在SRAM8K, FLASH64K
2. SLAVE模式,USB作为AHB Slave, 通过CPU间接访问存储空间,相比Master速度慢一点,但是访问地址不会受限。

Ansersion 发表于 2020-6-17 10:24

liaotian001 发表于 2020-6-16 19:17
USB控制器有2种访问存储空间的方式:
1. DMA模式,USB作为AHB Master,直接访问存储空间, 速度快,但是 ...

多谢
请问具体要怎么操作,有没有相关文档。

本人尝试:
第一我尝试切换到SLAVE模式,我把usb_conf.h中USB_OTG_HS_INTERNAL_DMA_ENABLED注释掉,并不成功;
第二我尝试把usb库文件里的所有变量都@到0x20002000以下的地址,结果也没有成功

wangjia@ic 发表于 2020-6-18 10:27

本帖最后由 wangjia@ic 于 2020-6-18 10:28 编辑

您好,您这个可以如下解决:
对于大数组的定义,首先留给USB一个连续的RAM空间,定义一下大数组的起始地址,比如现在这个开发板上MCU的寻址范围是16K,您可以查看一下工程文件里面的“      .map”文件,看看与USB相关的最有一个使用ram的变量,然后根据该变量大小算一下下一个可以使用的地址,以这个地址作为大数组的起始地址,这个地址也可以往后推,只要不超过最大ram空间。比如您这个数组的起始地址指定为0x20002000,可以如下定义:
uint8_t xxx__attribute__ ((at(0x20002000)));

Ansersion 发表于 2020-6-18 14:08

wangjia@ic 发表于 2020-6-18 10:27
您好,您这个可以如下解决:
对于大数组的定义,首先留给USB一个连续的RAM空间,定义一下大数组的起始地址 ...

666,RTOS堆栈占住后8K的RAM就可以了

lorinislorinis 发表于 2021-6-4 10:32

你好,官网目前下载的资料包里已删掉了USB的例程,麻烦帮忙发一下USB的例程可以吗,非常感谢!5548986@qq.com
页: [1]
查看完整版本: HC32F072 RAM使用超过8K后,USB HID Keyboard就跑不动了