智能车制作

标题: 【炉边瞎扯】浅谈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
山外メ雲ジ_VCAN 发表于 2017-6-5 00:13
从学习,个人发展的角度,非常有必要学寄存器开发(挑经典1、2款单片机学即可),否则新功能,异常bug,没 ...

山外哥讲的很有道理,刚参赛的时候我们一整套都用的您的东西,非常靠谱。今年试着撸了一些寄存器,也参考了不少您的配置思路,结合手册一起看很有收获。我不是在吐槽库本身和使用库的必要性,而是现在一些院校和选手过于依赖第三方库和技术支持,很多失去了独立解决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
2585341750 发表于 2017-6-5 09:20
果然我第二年还是小白……

顾同学不要灰心啊

作者: 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://111.231.132.190/) Powered by Discuz! X3.2