在EdgeBoard实践中,我们采用的是Xilinx的ZynqMP系列的FPGA芯片,使用PetaLinux工具链来编译Linux内核,并采用DeviceTree中的reserved-memory节点来实现内存的保留。例如,系统总体2GB内存,保留1GB给FPGA,留下1GB给Linux操作系统,DeviceTree中相关节点的设定就是这样的:

嵌入式AI解决方案中内存驱动的设计介绍

FPGA总体设备驱动是采用字符设备platform driver的形式来编写的:在Device的probe阶段,对驱动内所保留的内存块做好内存映射(memremap),并使用合理的数据结构,保存好各个参数,以供后续使用。例如:

嵌入式AI解决方案中内存驱动的设计介绍

mem_start、mem_end、base_addr 等结构成员的定义如下:

嵌入式AI解决方案中内存驱动的设计介绍

关于内存的分配,采用了mmap调用的方式:在FPGA设备的初始化期间,初始化字符设备时传递了file_operations结构变量,这个结构变量的mmap指针初始化为我们的内存分配函数。内存分配中,我们使用了内核提供的bitmap数据结构,来管理我们保留的内存区域——bitmap位数组中的每一位代表着16k的一个内存块,另外还使用相同长度的数组来管理内存被分配的客户owner(即file指针)、内存分配的块的数量等信息。

另外,在分配的内存对应的vma中,我们还注册了自己的私有数据private data来记录对应内存的必要信息:如对应内存块的总线物理地址范围和映射地址、bitmap位数组的索引等,用于地址转换;再如对应内存块的一些finger信息,用来标识保留内存块。已分配出去的内存块都需要回收,其中有两种最具代表性的情况,一种是用户release一块内存的处理,另一种则是用户关闭设备时对未release的内存块的清理回收。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查