剥离CMSIS-OS库实践(从STM32Cube USB库,性能提升至580K/s)

/ 2评 / 0

不喜欢CMSIS-OS库,把东西包了一层又一层,但是USB库非要用HAL,我也是没办法,工程量有点大,所以不想去动他了.何况不就多浪费大概10%的性能嘛,但是CMSIS-OS库,我就觉得非常不爽.很多时候我们只要发一个信号量的事情,给我左右判断了一圈.实验对象是我现在用的L476DISCO,我不太喜欢HAL的狗屎效率.因为U盘读写竟然只搞到剩下100KB/s不到.
关键几个引脚配置好:

让他支持U盘使用FreeRTOS,但是不用FATFS(集成版本太老,都已经0.13版本了,他还0.10版本).

调大那个Heap大小.

让库尽量用LL库.

目标要去掉的文件:

为了防止改动导致系统运行异常,所以...先写个简单测试函数.保证能跑了.

全工程搜索,三处使用到这个头文件,换掉.

把Queue发送换掉.

有很多歌,逐个替换,部分地方要用带ISR的,这样就能提升至少5%效率.三个要用ISR的函数都在usb_core.c,分别是USBH_LL_NotifyURBChange,USBH_LL_Disconnect,USBH_LL_Connect.
然后改接受event的.

改成:

继续把def的改掉.实际上最后一个也可以不要,一般我们都不会暂停USB进程的了.

首页的3个函数也成了2个了.

再把core这些繁复的替换掉.

现在编译应该就已经通过了,已经成功剥离了cmsis-os中间层了.应该是有一点点错误的.很快改好然后继续编译,通过.
打开FreeRTOS的SysTick中断,不要再用HAL自身的了.main函数的HAL_Init也应该去掉了.

把Delay改成能释放系统的Delay函数.

然后此处修复一个BUG,就是USBH_LL_DriverVBUS,我们用PC9来控制VBUS的.我们把PC9的写这里.先让PC9默认不供电.

高是不供电.因为这里已经有个TODO了,就是在外面不写给你看.

继续替换其他Delay函数,然后编译运行,程序照常没问题.看一下MAP表.

我GPIO不已经LL库选了吗?怎么还有其他,虽然这吃Flash空间不开销RAM,但是也是不爽.这个能否编译进去,还得看HAL心情.LL库开销是很低的.所以我更喜欢使用LL库.所以我一定要替换之.具体控制靠hal_conf.h来决定.这一堆,我就是不要的.

既然Cube生成他,肯定是用了他,把他删掉,然后把其他用到HAL的文件清掉,编译,就完全分离了.然后自己移植下FATFS,然后测试速度,缓冲区4KB.

总共开销56.19S,33.2MB的音频文件,也就是大约585KB/s读取,加入写入试试.

这个是读取并写入,还要先减56S,剩下就是写入时间,所以Sample时间就很长了.写入电流比读取大得多,如果串联了电流表,那就更轻松看得到了.总共114.9S,就是58S写完.

跟读取速度差不多,达到了580K左右水平.根据Non-Isochronous Transfer (Handshake Included) = (55 * 8 * 2.083) + (2.083 * Floor(3.167 + BitStuffTime(Data_bc))) + Host_Delay
而USB1.1是12Mbps,那么590K/s是理论速度了,所以585K是极快的了.
3)580K读写U盘

  1. 叶子说道:

    好棒, 过了这段繁忙时间, 好好学习下。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注