1.移知——ARM教育官方授权培训合作企业
2.Linux下PCI设备驱动开发详解(六)
3.大一就开始参加电赛?看学长是咋学的!
移知——ARM教育官方授权培训合作企业
移知作为ARM中国教育官方授权的培训合作企业,在去年已经达成合作协议,正式成为ARM教育官方认证的培训机构。作为IC行业内的佼佼者,ARM芯片架构授权覆盖全球,python 获取url源码苹果、联发科、高通等公司的芯片设计都离不开ARM技术。掌握ARM技术,能让你在相关领域成为具有竞争力的专业人士,满足行业需求并发挥重要作用。
移知教育是目前唯一被ARM认证并公布在官网的教育培训机构,作为芯片设计领域的服务平台,移知教育聚焦于芯片设计行业,位于全国集成电路中心重镇——上海张江,能够辐射全国,为准备从事芯片设计的学生提供入行培训,为工程师提供在职提升的课程。成立至今,移知教育已拥有+位讲师,+付费学员,最高人同时在线学习的记录,并获得上万名学员及多个知名企业的认可。
移知教育精心打磨了众多ARM系列课程,每一门课程都经过移知教育创始人、ARM中国资深技术顾问——团长的严格审核,所有课程均获得ARM专业资质评估,并通过系列课程学习,完成并通过测试考核,学员可以获得ARM技术培训认证证书。课程内容涵盖从AMBA入门之APB及AHB总线实战,到AMBA进阶之AXI总线实战,再到AMBA高阶之ACE及CHI总线,论坛担保源码直至Armv8-A和Armv9-A处理器架构、Arm CoreSight架构、Arm Cortex-M3 MCU芯片前端设计及软硬件验证、Arm Cortex-M3 MCU芯片UVM验证、Arm Cortex-M3 MCU芯片中端及DFT流程等,满足不同层次的需求。
对于初学者,AMBA入门之APB及AHB总线实战推荐指数为★★★★★,适应人群包括需要从事芯片设计的数字前端和验证工程师以及需要从事FPGA开发的工程师。课程从系统设计的角度帮助大家理解APB和AHB协议,涵盖协议的时钟和时序要求、地址映射机制、总裁机制及性能优化等相关内容,并通过实际项目教会大家如何设计可靠的总线接口。
进阶的AMBA进阶之AXI总线实战推荐指数同样为★★★★★,适应人群包括一致性总线相关工程师、数字芯片设计工程师和数字芯片验证工程师。课程全面解读AXI总线协议,帮助学习者快速定位实际问题,解决面试和项目中的常见难题,并通过案例模块提供AXI接口的视线,理解RTL源代码。
对于高阶学习者,AMBA高阶之ACE及CHI总线推荐指数为★★★★★,适应人群同样包括一致性总线相关工程师、数字芯片设计工程师和数字芯片验证工程师。课程从协议出发,由浅入深系统全面地介绍CHI的协议分层、流控和各项特性,帮助学员深入了解CHI协议。
对于处理器架构爱好者,Armv8-A和Armv9-A处理器架构推荐指数为★★★★★,适应人群包括Armv8-A和Armv9-ASoC架构师、零的源码前端设计和验证工程师,以及Armv8-A和Armv9-A SoC芯片的软件开发工程师和相关产品的项目经理、产品经理。课程从基础知识开始,逐步深入,覆盖了Armv8-A和Armv9-A处理器架构的方方面面,帮助大家加深对概念的理解,并提供宝贵的实践经验。
Arm CoreSight架构推荐指数为★★★★★,适应人群包括芯片设计工程师、芯片验证工程师、软件开发工程师和系统架构工程师。课程围绕Cortex-A系列的CoreSight架构,从基本原理讲起,再深入到具体每个组件的行为特征,最后讲到整个CoreSight的子系统设计和搭建,帮助企业工程师清晰理解CoreSight架构。
Arm Cortex-M3 MCU芯片前端设计及软硬件验证推荐指数为★★★★★,适应人群包括在做模块或IP级别的设计、还不了解SoC全芯片设计方法、还不知道SoC全芯片验证方法的学习者。此课程通过入门级别的MCU作为学习起点,让您掌握一个入门级SOC设计的思路和技巧。
Arm Cortex-M3 MCU芯片UVM验证推荐指数为★★★★★,适应人群包括刚接触验证的同学、项目负责人、需要做后仿验证的工程师和验证环境的负责人。课程为具有简单基础的验证工程师,以及想要学习MCU芯片项目验证管理的学员打造,通过理论+实验代码多个维度,让学员掌握先进的MCU验证方法学和验证思路。
Arm Cortex-M3 MCU芯片中端及DFT流程推荐指数为★★★★★,适应人群包括芯片前端设计工程师、cydia 院 源码芯片中端工程师、芯片DFT工程师和芯片后端工程师。本课程由年+资深工程师带队,结合企业需求精心研发,通过真实的MCU芯片项目,学员可以一起做项目,掌握全芯片的代码质量检查、综合、一致性检查和DFT流程,以及实际项目中端流程中出现的问题及调试方法。
还有更多体验课及公开课等你加入,移知教育提供名师汇集、教学质量与学习效果保证的课程体系,讲师团队来自行业一线大公司及研究机构,拥有年以上从业经验,知识领域涵盖了IC行业从SOC架构到IP生态,以及IC设计的前端和后端,可测试性设计(DFT),固件系统等,保证课程的高质与实用性。此外,移知教育还拥有一支强大的IT团队,确保线上直播系统的稳定运行及自主研发的直播系统、EDA云实训环境等技术支持。
Linux下PCI设备驱动开发详解(六)
本章及其后续章节将深入探讨通过PCI Express总线实现CPU与FPGA之间数据通信的简单框架,并介绍Linux PCI内核态设备驱动(KMD)的实战开发。
该框架以开源界知名的RIFFA(可重用集成框架,用于FPGA加速器)为基础,这是一个针对FPGA加速器的可重用集成框架,同时也是一款第三方开源的PCIe框架。
该框架需要使用支持PCIe的工作站以及带有PCIe连接器的FPGA板卡。RIFFA支持Windows、Linux操作系统,电视系统源码以及altera和xilinx的FPGA,可以通过c/c++、python、matlab、java等编程语言实现数据的发送和接收。驱动程序可在Linux或Windows系统上运行,每个系统最多支持5个FPGA设备。
在用户端,存在独立的发送和接收端口,用户只需编写少量代码即可实现与FPGA IP内核的通信。
RIFFA使用直接存储器访问(DMA)传输和中断信号传输数据,从而在PCIe链路上实现高带宽,运行速率可达到PCIe链路的饱和点。
开源地址:github.com/KastnerRG/ri...
一、Linux下PCI驱动结构
在《Linux下PCI设备驱动开发详解(四)》中,我们了解到,通常用模块方式编写PCI设备驱动,至少需要实现以下几个部分:初始化设备模块、设备打开模块、数据读写模块、中断处理模块、设备释放模块、设备卸载模块。通常的编写方式如下:
好的,带着这个框架,我们将进入RIFFA框架的driver源代码分析。
二、初始化设备模块
我们直接给出源代码:
OK,我们已经看到了几个关键词,驱动程序、字符设备、class、文件节点。在《Linux下PCI设备驱动开发详解(三)》中,我们知道总线、设备、驱动模型:
硬件拓扑描述Linux设备模型中四个重要概念:
三、probe探测硬件设备
这个fpga_probe函数非常重要和关键:
四、写操作
基本的读写操作通过ioctl来调用对应的driver驱动的实现。我们补充一下,ioctl是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设ioctl()命令的方式实现。
直接给出代码:
在处理ioctl_send的时候,我们发现实现用户数据拷贝到内核态之后,调用了chnl_send_wrapcheck,将api层打包过来的参数一一传递过去。
直接给出chnl_send_wrapcheck():
这段代码主要做了一些避免错误的判断,值得一提的就是通过自旋锁避免了多线程错误的判断,其实我们可以知道riffa架构支持多线程,之后调用了chnl_send。
将数据写入指定的FPGA通道。除非配置了非零超时,否则将阻塞,直到所有数据都发送到FPGA。如果超时不为零,则该函数将阻塞,直到发送所有数据或超时毫秒过去。来自bufp指针的用户数据将被发送,最多len字(每个字==位)。通道将被告知预期数据量和偏移量。如果last==1,则FPGA通道将在发送后将此事务识别为完成。如果last==0,则FPGA通道将需要额外的事务。
成功后,返回发送的字数。出错时,返回负值。
核心思想就是,初始化sg_maps,通过bar空间告知FPGA通道号、长度、大小等信息、使用通用buffer发送数据、更新sg_mapping,最后进入到while(1)的循环函数中。
while(1)大循环,只有当处理完Tx数据完成中断或出错时函数才会返回。在每一轮执行中,首先执行内嵌的小while,在小while中首先读取对应通道上的send消息队列,若返回值为0说明成功出队,小while运行一遍后就会执行下面的代码;若返回值为1说明队列可能是空的,也就是还没有中断到来,此时调用prepare_to_wait函数将本进程添加到等待队列里,然后执行schedule_timeout休眠该进程(有阻塞时间限制),此时在用户看来表现为ioctl函数阻塞等待,但中断还能在后台运行(中断也是一个进程)。
若此时驱动接收到一个该通道的Tx中断,那么在中断回调函数里将中断信息推入消息队列后就会唤醒chnl_send所在的进程。进程唤醒后调用finish_wait函数将本进程pop出等待队列并用signal_pending查看是否因信号而被唤醒,如果是需要返回给用户并让其再次重试。如果不是被信号唤醒,则再去读一下消息队列,此时会将消息类型存入msg_type,消息存入msg中,然后退出小while。
接下来进入一个switch语句,这个switch是根据msg_type消息类型选择处理动作的,即中断处理的下半部。
若执行Tx SG读完成中断,则消息类型发送EVENT_SG_BUF_READ,数据填0,其实是没用的数据。在这里如果剩余长度大于0或者剩余溢出值大于0时就会重新执行上一段讲述的过程,即从上一次分配的结尾处再分配SG缓冲区,并发送SG链表给FPGA等等,不过一般不会发送这种情况,除非分配页时的get_user_pages函数锁定物理页出现了问题,少分了页才会出现这样的现象。
然后FPGA就会按SG链表一个一个SG缓存块的进行流式DMA传输,传输完毕后FPGA发送一个Tx数据读完成中断,即EVENT_TXN_DONE消息类型。这里比较好处理,调用dma_unmap_sg取消内存空间的SGDMA映射,然后释放掉页。
五、读操作
读操作和写操作类似,不再详细描述。
函数chnl_recv用于将FPGA发送的数据读到缓冲区内。
首先调用宏DEFINE_WAIT初始化等待队列项;然后把传入的参数timeout换算成毫秒,这个时间是最长阻塞时间。
剩下的就是中断处理过程,等待读完成。
六、销毁/卸载设备
释放设备模块主要是负责释放对设备的控制权,释放占用的内存和中断等,所做的事情正好和打开设备模块相反。
本文详细介绍了RIFFA框架的驱动模块,涉及的内容非常多,包括内核页面、中断处理等。
一个驱动的框架主要包括:初始化设备模块、设备打开模块、数据读写模块、中断处理模块、设备释放模块、设备卸载模块。
七、未完待续
《Linux下PCI设备驱动开发详解(七)》将详细分析RIFFA的环形通信队列,最大的好处就是不需要对后续的队列内容进行搬移,可以后续由入队(写入)覆盖。
八、参考资料
blog.csdn.net/mcupro/...
zhuanlan.zhihu.com/p/...
大一就开始参加电赛?看学长是咋学的!
电子信息专业的本科生,全国大学生电子设计大赛无疑是本科阶段最重要的比赛。教育部最新公布的全国大学生学科竞赛分类名单中,该赛事被列为A类学科竞赛,其认可度极高。竞赛通常在单数年9月举行,题目涵盖控制、测量、高频和电力电子等多个类别。然而,对于大一新生而言,这样的竞赛可能显得遥不可及。许多学校本科生无法进入实验室,即便有机会进入,是否能参与电赛或取得优异成绩,也是未知数。
新生开学季,很多学生会进入实验室学习。电赛通常在暑假举办,大一学生有一年时间准备。那么,参加电赛需要学习哪些知识?如何寻找学习资料呢?以下是几点建议:
1. 数模电的学习:数字电路基础和模拟电路基础是电子专业的基石。无论是控制类、电源类还是仪表类题目,数模电都是必不可少的。大一虽然可能不系统学习,但基础的电路知识仍需了解。
2. 单片机的学习:STM单片机是目前大学生中最热门的单片机之一。虽然学校的课程可能从单片机开始,但建议直接学习STM单片机。正点原子和野火等品牌在大学生中广受欢迎,其开发板和源码资源丰富,非常适合初学者。
3. 经费:比赛需要一定的经费,建议提前准备。可以提前找到队友,分摊购买成本。实验室经费充足时,部分费用可以报销。
4. 学习资料推荐:
优质UP主:
1. 唐老师讲电赛:提供基础PCB画板教学和历年电赛电源题讲解。
2. 达尔闻:提供嵌入式、FPGA、人工智能等领域的学习资源。
3. 正点原子官方:提供在线教学平台和公众号。
4. 野火_firege:提供丰富的嵌入式学习资源。
优质公众号:
1. 大鱼机器人
2. 果果小师弟
3. 达尔闻说
4. 电子芯吧客
5. 芯片之家
6. txp玩linux
7. 最后一个bug
优质论坛:
1. 黑:/
4. 电路城:/
. 野火电子:/
. 正点原子:/
. 电子芯吧客:/
. 云汉电子社区: /