智能车制作
标题: 【炉边瞎扯】浅谈eDMA [打印本页]
作者: alexyzhov 时间: 2017-6-4 21:46
标题: 【炉边瞎扯】浅谈eDMA
(本贴预计3到4楼)
最近期末季没有车调,每天死亡冲锋准备考试,真是累了。今天休息一下,谈谈我对Kinetis单片机DMA的认识,权当抛砖引玉。如果有地方讲的不对,还请大佬们下手轻点(
因为众所周知的原因,Kinetis系列是如今智能车选型的主流,是单片机中的豪杰。网络上流行的开发库无疑极大地减轻了大家准备底层的负担,但是也惯坏了很多人。比较往年的帖子可以发现,论坛里关于底层、关于电路的硬派技术讨论是越来越少了。取而代之,多了不少关于硬件的,“伸手”的问题。其中又以第七届为时间的分界线,之后的帖子和报告质量,有点不太敢恭维。诚然,我不是说库不好,将有限的精力放在算法上其实是很明智的选择。但是过于依赖库,显然不会让自己的水平有太高的进步。因为智能车面临的环境元素实在是太简单了,本身就不需要太复杂的处理;再加上历年参赛队员智力的积累,程序思路上可以提升的空间已经不大了。我个人觉得,大家每年算法上的“创造性工作”,其实更多是在围绕当年的规则打补丁罢。所谓的算法,和真正计算机类、机器人类的比赛相比,实在差太远了。当然,飞卡作为一个参与院校广泛的自动化类比赛,本来在规则上就没有给程序算法预设太高的门槛。作为参与者,备赛时整夜调试的经历,积累的大量工程经验才是最大的收获。智能车点燃了一届又一届大学生的工程师梦想,从这点来说,我是很感激这个舞台的。
作者: alexyzhov 时间: 2017-6-4 21:46
本帖最后由 alexyzhov 于 2017-6-4 21:55 编辑
------------------------------------------------------------------------
以上是个人吐槽,下面是正文。
Kinetis的外设风格是非常灵活的,我第一次感受到这种灵活,是因为LPLD的一篇文档:《K60实现ADC四通道自动连续采集 无需CPU干预》。看着样例里PDB、ADC、DMA模块的互相配合,感觉简直骚操作。随着后来自己研究底层的深入,发现FSL从硬件设计上就设计的非常灵活,从而给各种外设间的紧密配合留下了可能。
我们知道,DMA是一个数据搬运引擎,一般用于大数据块的搬运,和CPU挂载在同一条数据总线上。当信号触发DMA请求时,DMA引擎抢占数据总线,根据配置好的源地址、目的地址、搬运长度、搬运次数等核心参数开始搬运,如图示:
可以看到,DMA的特点是在不需要CPU的介入的前提下,高速地搬运连续的数据(块)。
Kinetis的DMA
以K66为例,参考手册可以看到Kinetis的DMA功能分为两部分: DMAMultiplexer(DMAMUX)和Enhanced DMA(eDMA)。
Kinetis的DMA有52个触发源和32个搬运通道,其中有16个可以独立编程的通道,并且可以选择映射到一个对应的影子通道上(16*2=32),并且前4个通道可以利用PIT模块轮流出发。eDMA的每个通道都可以通过DMAMUX,一个交叉矩阵,灵活配置触发源。这个过程和管脚复用类似,都是通过交叉矩阵,将信号链接到需要的地方。这是一个很灵活的地方,可以根据需要灵活分配触发源和DMA通道。
根据图示,可以看到eDMA主要由两部分组成,一部分是DMA Engine,一部分是TCD。DMAEngine和普通的DMA结构类似,具有基本的控制器,地址、数据控制和通道仲裁逻辑。TCD则是一系列寄存器结构(一个TCD包含11个寄存器),每个TCD结构(TCD[n])存储着DMA_CHn的搬运属性(每个通道拥有一个对应的TCD结构)。我们对eDMA的配置,主要是对TCD编程。比如DMA搬运的源地址(TCD[n].SADDR)、目的地址(TCD[n].DADDR)、每次搬运(Minor Loop)的源数据长度(TCD[n].ATTR:SSIZE)、每次搬运(Minor Loop)的目的数据长度(TCD[n]. ATTRSIZE)、每次搬运(Minor Loop)的源地址偏移量(TCD[n].SOFF)、每次搬运(Minor Loop)的目的地址偏移量(TCD[n].DOFF)、总搬运(Major Loop)循环次数(TCD[n].NBYTES);以及有关通道映射和Major Loop计数的CITER/BITER寄存器,还有可以用来方便构造环形队列的TCD[n]. ATTR:SMOD/TCD[n].ATTR:DMOD。
值得一提的一点是,通过TCD,eDMA可以实现一种链式结构,进行碎片化数据的搬运。这是Kinetis的一大特色,可以将地址不连续的数据(比如多个不同外设),只经过一次触发就能汇及起来,一定程度上缓解了DMA只能搬运块状数据的瓶颈。
作者: alexyzhov 时间: 2017-6-4 21:47
3L占位
作者: alexyzhov 时间: 2017-6-4 21:47
4L占位
作者: 山外メ雲ジ_VCAN 时间: 2017-6-5 00:13
从学习,个人发展的角度,非常有必要学寄存器开发(挑经典1、2款单片机学即可),否则新功能,异常bug,没法解决。
从应用开发的角度,从智能车比赛的进度、或者项目开发,我往往选择用库。
时代不同,开发效率至关重要,例如上位机我用QT库,而不是VC,但涉及效率的关键步骤,我会自己重写(单片机开发也是如此,关键部分,也要寄存器独立配置,而不是用库)。
时代的步伐:C语言代替汇编,库开发代替寄存器开发,可视化代替库开发,甚至以后 脑电波配合 AI 全自动开发。趋势就是这样发展,所以没什么好抱怨别人的。
举个例子,我毕业的那年,身边有个同学花个 2个月学个java ,随手做个挺简单的app,然后拿到 6k 的offer (当时工资没现在的高的)。而混实验室的老嵌入式人物,熟悉ucos,tip、udp网络编程 ,但拿到 5k 。实力上,肯定后者远强于前者,工资前者高于后者。适者生存!
根据很多同学反馈,其实参加智能车那一年,他们基本上都是迷迷糊糊地水过去,因为一切都要跟时间竞赛,得赶紧跑起来,完成比赛,来不及欣赏消化途中的知识。
但这就结束了?非也!他们真正的跨越式发展,往往是第二年!因为总结了上一年的经验,回过头,把之前缺的知识逐个补回来。而且,他们早期走得远,看得广,第二年少走了很多弯路。
楼主,也是第二年参赛的,所以才有底气说楼上的话。宽容心对待新手,他们的崛起往往是在第二年。
作者: alexyzhov 时间: 2017-6-5 00:36
山外哥讲的很有道理,刚参赛的时候我们一整套都用的您的东西,非常靠谱。今年试着撸了一些寄存器,也参考了不少您的配置思路,结合手册一起看很有收获。我不是在吐槽库本身和使用库的必要性,而是现在一些院校和选手过于依赖第三方库和技术支持,很多失去了独立解决bug的能力(从论坛帖子的质量变化可以感受到)。奖状是对自己学习收获的积极反馈,但有时候过度追求一张奖状,忽略了对技术的追求,反而有种违被初衷了的感觉?每个人都是从新手走过来,但我觉得如果盲目依赖别人的轮子,对基础的东西一无所知,恐怕连如何清晰地提问都成问题了
作者: cankun1314 时间: 2017-6-5 05:53
火钳刘明
作者: じ~凝眸处 时间: 2017-6-5 07:49
表示第一年XS~~
作者: 1325536866 时间: 2017-6-5 09:13
第一年 西部赛前128, 西部赛换K60。
作者: 1325536866 时间: 2017-6-5 09:13
第二年 就只用K60了
作者: 2585341750 时间: 2017-6-5 09:20
果然我第二年还是小白……
作者: eagle丶 时间: 2017-6-5 11:01
小白留名
作者: 半夏微笑 时间: 2017-6-5 22:16
:):)
作者: 守夜人 时间: 2017-6-6 12:40
依旧怼xs128
作者: kyx1996616 时间: 2017-6-7 23:26
第二年依旧很白...:(:(:(
作者: yy260191032 时间: 2017-6-8 01:52
顾同学不要灰心啊
作者: Traverlcq 时间: 2017-6-8 09:53
讲的NICE
作者: 大逗比 时间: 2017-6-9 11:21
楼主说的很有道理,参赛一年和两年其实真的有很大的差距;第一年懵懵懂懂,第二年才是质的飞跃;
第一年参赛时,跟随师兄的脚步,当然师兄是K60,我就是128,也有较多不同之处;
第二年我晋级了,直接开始使用K60(当然第一年的时候已经学习了较长时间的K60了)
作者: znjqr 时间: 2017-6-9 11:34
第一年 西部赛前128, 西部赛换K60
欢迎光临 智能车制作 (http://dns.znczz.com/) |
Powered by Discuz! X3.2 |