二十七、RZN2L CherryUSB移植与性能对比
一、目的/概述1、cherryusb还没有人支持瑞萨芯片我们尝试在RZN2L CR52上移植CherryUSB协议栈2、在rzn2l芯片上实现USB CDC ACM 功能(实现cherryusb hal)3、对比CherryUSB与瑞萨原厂USB例程的性能差异4、验证全速12Mbps和高速480Mbps模式下的传输性能二、CherryUSB简介2.1 什么是CherryUSBCherryUSB是一个轻量级的USB主机和设备协议栈具有以下特点特性说明代码量小核心代码约10KB适合资源受限的MCU移植简单统一的HAL抽象层只需实现几个底层函数性能优秀优化的数据传输路径支持DMA功能完整支持USB Host/Device包含常见USB类社区活跃持续更新维护文档齐全2.2 相关资源资源链接官方仓库https://github.com/cherry-embedded/CherryUSB官方文档https://cherryusb.readthedocs.io/示例代码https://github.com/cherry-embedded/CherryUSB/tree/master/demo移植指南https://cherryusb.readthedocs.io/zh-cn/latest/quick_start/transplant.html三、移植涉及的文件3.1 CherryUSB核心文件从CherryUSB官方仓库复制以下文件到工程cherryusb_port/ ├── cherryusb/ # CherryUSB核心库 │ ├── core/ # USB核心协议 │ │ └── usbd_core.c # USB设备核心 │ ├── class/ # USB类实现 │ │ └── cdc/ # CDC类 │ ├── common/ # 公共定义 │ ├── osal/ # OS抽象层 │ │ └── usb_osal_none.c # 无OS适配 │ └── usb_config.h # USB配置 ├── config/ # 配置文件 │ └── cherryusb_config.h # CherryUSB配置 ├── examples/ # 示例代码 │ ├── cdc_acm_descriptor.c # CDC描述符 │ ├── cdc_acm_descriptor.h │ ├── cdc_acm_example.c # CDC示例 │ └── cdc_acm_example.h └── hal/ # 硬件抽象层 ├── usb_dc_rzn2l.c # RZN2L USB设备驱动 ├── usb_dc_rzn2l.h ├── usb_interrupt_override.c # 中断处理 ├── usb_interrupt_override.h └── usb_reg_rzn2l.h # 寄存器定义3.2 HAL层移植文件移植CherryUSB需要实现以下HAL层函数文件功能usb_dc_rzn2l.cUSB设备控制器驱动实现初始化、端点配置、数据收发usb_dc_rzn2l.h驱动头文件定义数据结构和函数接口usb_interrupt_override.cUSB中断处理覆盖默认中断处理usb_reg_rzn2l.hRZN2L USB寄存器定义3.3 应用层文件文件功能hal_entry.c主入口初始化USB并调用CDC示例cdc_acm_example.cCDC ACM示例实现回显和速度测试cdc_acm_descriptor.cUSB描述符定义debug_shell.c调试命令行3.4 工程配置文件文件说明script/fsp_xspi0_boot.ld链接脚本.cprojecte2studio工程配置rzn_gen/hal_data.cFSP硬件配置四、软件流程4.1 USB初始化流程4.2 USB枚举流程4.3 CDC数据传输流程4.3.1 接收流程OUT方向4.3.2 发送流程IN方向4.4 中断处理流程4.5 主循环流程五、测试方法5.1 测试环境项目配置MCURenesas RZN2L内核Cortex-R52 400MHz编译器ARM GCC 13.3.1IDEe2studioUSB模式DeviceCDC ACM测试工具Python pyserial5.2 测试脚本使用Python脚本test_cdc_speed.py进行速度测试# 测试原理 # OUT测试主机写入10MB数据到设备计算速度 # IN测试设置DTR1设备循环发送数据主机读取10MB计算速度 import serial import time import sys test_comx sys.argv[1]# COM端口号 test_maxsize 10*1024*1024# 10MB test_data b\xAA*4096 # OUT测试 deftest_cdc_out(): send_count 0 begin time.time() while send_count test_maxsize: txdatalen test_serial.write(test_data) send_count txdatalen elapsed time.time()- begin speed_mbps (send_count /1024/1024)/ elapsed print(cdc out speed %.3f MB/s% speed_mbps) # IN测试 deftest_cdc_in(): read_count 0 begin time.time() while read_count test_maxsize: data test_serial.read(test_maxsize) read_count len(data) elapsed time.time()- begin speed_mbps (read_count /1024/1024)/ elapsed print(cdc in speed %.3f MB/s% speed_mbps)5.3 测试步骤1、编译烧录固件到RZN2L开发板2、连接USB线到PC确认设备枚举成功3、记录COM端口号如COM114、运行测试脚本python test_cdc_speed.py COM115、记录OUT和IN速度六、性能测试结果6.1 CherryUSB性能全速模式Full-Speed 12 Mbps USB CDC ACM Module: USB_IP0 Mode: Peripheral Speed: Full-Speed (12 Mbps) EP IN: 0x81 max64 EP OUT: 0x02 max64 Buffer: RX2048 TX2048 测试结果 cdc out speed 0.887 MB/s (10485760 B / 11.273 s) cdc in speed 0.902 MB/s (10526720 B / 11.134 s)高速模式High-Speed 480 Mbps USB CDC ACM Module: USB_IP0 Mode: Peripheral Speed: High-Speed (480 Mbps) EP IN: 0x81 max512 EP OUT: 0x02 max512 Buffer: RX16384 TX16384 测试结果 cdc out speed 25.564 MB/s (10485760 B / 0.391 s) cdc in speed 14.797 MB/s (10526720 B / 0.676 s)6.2 瑞萨原厂例程性能全速模式Full-Speed 12 Mbps[USB] Module: USB_IP0 [USB] Mode: Peripheral [USB] Speed: Low-Speed [USB] DMA: OFF [USB] BENCH_BUF_SIZE: 4096 测试结果 OUT: 0.16 MB/s (10485760 B in 61620 ms) IN: 0.89 MB/s (10485760 B in 11175 ms)高速模式High-Speed 480 Mbps[USB] Module: USB_IP0 [USB] Mode: Peripheral [USB] Speed: High-Speed [USB] DMA: OFF [USB] BENCH_BUF_SIZE: 4096 测试结果 OUT: 5.84 MB/s (10485760 B in 1712 ms) IN: 19.65 MB/s (10485760 B in 509 ms)6.3 性能对比全速模式对比Full-Speed 12 Mbps方向CherryUSB瑞萨原厂对比OUT (主机→设备)0.887 MB/s0.16 MB/sCherryUSB快5.5倍IN (设备→主机)0.902 MB/s0.89 MB/s基本持平高速模式对比High-Speed 480 Mbps方向CherryUSB瑞萨原厂对比OUT (主机→设备)25.564 MB/s8.25 MB/sCherryUSB快3.1倍IN (设备→主机)14.797 MB/s19.36 MB/s瑞萨快1.3倍性能分析全速模式OUT方向CherryUSB大幅领先5.5倍IN方向基本持平高速模式OUT方向CherryUSB领先3.1倍IN方向瑞萨原厂略优整体表现CherryUSB在OUT方向主机发送到设备性能优势明显七、移植要点7.1 关键配置cherryusb_config.h中的关键配置#defineUSBD_IRQHandlerUSB_interrupt_override_IRQHandler #defineUSBD_BASER_USBF_BASE #defineCONFIG_USBDEV_EP_NUM10 #defineCONFIG_USBDEV_RX_BUFSIZE2048 #defineCONFIG_USBDEV_TX_BUFSIZE20487.2 中断处理RZN2L的USB中断需要特殊处理通过usb_interrupt_override.c覆盖默认中断voidusb_interrupt_init(void){ // 配置GIC中断 R_BSP_IrqCfgEnable(USB_INT_IRQn,3,NULL); } voidUSB_interrupt_override_IRQHandler(void){ externvoidUSBD_IRQHandler(uint8_t busid); USBD_IRQHandler(0); }7.3 描述符配置CDC ACM描述符需要根据实际需求配置// 端点配置 #defineCDC_IN_EP0x81 #defineCDC_OUT_EP0x02 #defineCDC_INT_EP0x83 // 全速端点大小 #defineCDC_MAX_MPS_FS64 // 高速端点大小 #defineCDC_MAX_MPS_HS512八、总结项目说明移植难度中等需实现HAL层和中断处理代码量约20KB含CDC类全速性能OUT 0.887 MB/s, IN 0.902 MB/s高速性能OUT 25.564 MB/s, IN 14.797 MB/s优势OUT方向性能优秀代码轻量移植简单适用场景需要高性能USB传输的嵌入式应用核心要点1、CherryUSB移植主要工作在HAL层需实现usb_dc_rzn2l.c中的底层驱动2、中断处理需要特殊覆盖确保USB中断正确触发3、高速模式下性能显著优于全速建议优先使用高速模式4、OUT方向性能提升明显适合大量数据接收场景九、附录测试环境MCURenesas RZN2L内核Cortex-R52 400MHz编译器ARM GCC 13.3.1IDEe2studioUSB连接USB Type-C测试数据量10MB文件结构27_rzn2l_cherryusb_port/ ├── rzn2l_cherryusb_port/ # CherryUSB移植工程 │ ├── cherryusb_port/ # CherryUSB库和移植文件 │ ├── src/ # 应用代码 │ ├── rzn_gen/ # FSP生成的配置 │ ├── script/ # 链接脚本 │ └── tools/ # 测试工具 └── RZN2L_RSK_usb_pcdc/ # 瑞萨原厂例程对比用 ├── src/ # 应用代码 ├── rzn/ # FSP库 └── tools/ # 测试工具相关链接资源说明CherryUSB仓库https://github.com/cherry-embedded/CherryUSBRZN2L产品页https://www.renesas.cn/zh/products/rz-n2lFSP文档https://github.com/renesas/rzn-fsp/releases/tag/v2.0.0
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605573.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!