Kaiyun 开云如何学习ARM嵌入式开发?
开云APP 开云官网入口开云APP 开云官网入口Kaiyun App下载 全站Kaiyun App下载 全站我在100ASK_IMX6ULL售后群里,发现很多初学者只有单片机基础,甚至没有单片机基础。在学习Linux时,对很多概念比较陌生,导致不知道学什么,也不知道学了之后有什么用。
从事嵌入式Linux培训12年来,我们写过很多《关于如何学习linux》的文章,这是最新的,本文将不断更新。
所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。
也许你不服!不是还有ucos、vxwork、wince、IOS吗?下面这个图是关于操作系统的占比,是2016年的,我没找到更新的图,但是很有参考意义:
我们说的单片机不使用操作系统,在上图中没有体现出来。但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业
LED程序里面的init_led、led_on、led_off函数是你一个人写的,爱取什么名就取什么名,爱怎么写就怎么写。
很多单片机项目不是很复杂,2、3个人从上到下统统搞定,里面的函数大多时间是直接去读写寄存器。
在单片机程序里,没有应用程序、驱动程序的概念,很可能一个人包揽了硬件设计、模块调试(或称之为驱动)、功能开发(或称之为应用)的全部活。
在Linux中,不允许应用开发人员直接去操作硬件,比如你想点个灯,不好意思,你无法直接访问寄存器;你需要通过驱动程序来访问寄存器。
: 假设你写的程序比较烂,那我不能让你去随便访问寄存器,把系统搞崩溃了怎么办?你本意是去点灯,但是你看错了寄存器,你把电源关了怎么办? 所以这些操作硬件的活,还是交给信得过的人来做吧:交给驱动工程师,他既懂硬件又懂软件。
: 编写应用程序时,大家都使用统一的函数,以后换一个芯片时,应用程序不用变;只需要根据这个接口提供驱动程序就可以了。
: 使用Linux系统的项目一般比较大,术业有专攻,一个人不太可能从上到下都全部掌握。比如做人脸识别项目,有擅长做图像处理的,他可不管你要用多少种摄像头,有图像给他就可以。而多种摄像头的硬件操作方法各有不同,这些交给驱动程序工程师。
你看!从这些接口里,我们根本看不到寄存器的操作。底层的程序驱动会根据这些调用,去设置寄存器、操作硬件。
所以,我高大上的应用工程师,干嘛苦哈哈地去看原理图、看在片手册、读写寄存器,搞不好还要去调试硬件BUG。这些脏活、累活就交给驱动工程师吧。客户的需求千变万化,我996时间都不够用了。
我上懂软件、下懂硬件的驱动工程师,肯定不能把这么重要的活交给你去做了,把我的系统搞崩溃了怎么办。
开玩笑、开玩笑、开玩笑的,有应用工程师、驱动工程师的优劣之分,大家都是为了做出产品。现在有一个趋势,一个任务从上到下你都需要懂,这就是所谓的全栈工程师。
,要访问某个硬件,也是要打开文件、读写文件。应用程序要根据标准的文件接口:open/read/write/ioctl/mmap等来访问驱动程序。
既然如此,怎么写驱动程序呢?最简单的方法就是:APP要调用open来打开驱动程序,那驱动‘程序里就提供一个xxx_open函数来初始化硬件;APP要调用write来写数据,驱动程序里就提供一个xxx_write函数来接收数据并操作硬件。
怎么实现这些xxx_open、xxx_write函数?我们要做的事情跟单片机是类似的,一样要去看电路图、看芯片手册,然后在这些函数里读写寄存器:这称为
高能预警:驱动框架可不简单,对于LED来说是简单,但是还有更复杂的驱动程序,它要考虑“通用”,这很要命。
这几天在群里跟学员聊天,有一位学员的学习方法很好:先观其广,再究其深。有时候要“不求甚解”,很多时候保持疑问先学下去,这些疑问就自然解决了。
比如课程中涉及汇编知识,如果你要彻底弄清楚,你需要去学习《ARM架构与编程》;当你学完这本书,你的同学搞不好已经可以上手工作了。
我们先把学习目标定下来:快速了解嵌入式Linux开发的流程,知道要学什么,具备跟从业者交流的能力。
- 下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。 从上图可以知道:
: 嵌入式Linux系统 = bootloader + linux内核 + 根文件系统(里面含有APP)。
: 它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。 所以,可以认为
: Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。
在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。
花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。
但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。
作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。
: 从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。
入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。
摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。
掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。
怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?
先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。
了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。
嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。
嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。
比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。
不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?
比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。
甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去这些命令就可以了。
不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。
视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,
每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。
记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。
但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。
有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。
如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。
比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。
比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。
想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。
每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。
任何手艺活,看是无用的。万能某宝买个某派板子,编个闹钟的APP啥,或者搭个网站,取决于你想学习的方向。折腾一个月能弄出来,基本就会了。
链接:在大学本科阶段学ARM有效果吗? 目前已经熟悉了stm32,飞思卡尔等单片机,想再学一学ARM,有价值吗? ?
实话是嵌入式难点不是在学,而是很难入门。好多人都是在入门那就卡死了!看来楼主还要重新入门啊!用我们一位老师的说话风格来说,嵌入式学不好的话真的要死人的。
第一,买开发板的厂家很坑,你很容易买一堆不能调试的设备,买回来也是放箱底的。
第二,学校很坑!如果你们学校开了嵌入式方向,那么真的要注意培养方案了!!如果你们学校连ucoss/linux都不开的话,你出去后最好不要给别人说你学过嵌入式。
第三,老师很坑!中国的大学什么样大家都心里清楚,说什么本科期间不适合学,真的是在扯淡。本科期间那么自由,不正是你想学什么就学什么的时候吗?好多老师都是光能讲理论,甚至连理论都讲的不清不楚。或许对于其他的方向而言,并不会有什么不好,但是对嵌入而言就是最大的坑!!!不在设备上调试,你是什么都学不到的。不要到了找工作面试的时候才发现自己有多渣!
一开始的时候,我也不知道嵌入式这个东西,根本就没有接触过。只是在大一下学期时迷上了LINUX,就开始装双系统,看《鸟哥的Linux私房菜》。把里面的命令不知道打了多少遍,自己也额外的看了好多这方面的资料。然后大二第一学期看了《CSAPP》,真的是好书中的好书啊!然后大二第二学期开始看《APUE》,我们学校大二下学期开操作系统。老师知道我的linux水平比较好了,就推荐我去看内核!我也确实去看了结果就迷茫了!《APUE》也看了,但是开始的时候只看了四章,不太能看懂的那种!
然后大二下学期,意外的选了嵌入式方向,真是太年轻了!然后大三第一学期就开始学arm学嵌入式实时操作系统,学校买的书还是渣到了一定的层次,说白了就是坑钱!但是有幸遇到了一个好的老师,很邪门的老师。开始看任哲的《ucosII嵌入式实时操作系统与linux》,这本书也真是一本特别好的书。然后我们arm学的是arm 9, 用的是博创S3C2440大箱子来学习。老师给我们了一大堆学习资料,我们也像淘金者一样在里面淘。还真的都是很好的资料,其中有一本我最想推荐给大家来进行嵌入式入门的书籍是《嵌入式系统教程,机制而非策略》,这本书讲的很清楚。还有你可以自己买一个mini2440来调试,可以买友善之臂MINI2440来调试,来跑你写的裸机开发代码。然后掌握的比较好了可以去买4412芯片(A9)来学习, 如果你真的喜欢嵌入式的线来学习,绝对足够有挑战性。
现在其实好多人可能会问一个问题!你的C语言是怎么学的!怎么讲了这么多还没提过任何关于C语言方面的东西呢!在这里我来说下我的C语言是怎么学的吧!
我们大一的时候就开始开C语言,中国众多大学的通病。确实没学到什么东西!!然后自己无意间发现了一本《LINUX C 编程》然后就开始学,讲的很好!如果你能看第二第三部分的话,那么我想你的C语言就不是一般的扎实了!!C语言嘛,它也真的不好学, 最烦的是C语言与汇编的关系,从编译到链接的过程,不很清晰汇编还真的学不会C语言。《CSAPP》如果你看的比较好,那么你已经很深入的了解了C语言,而且很清楚怎样优化程序的性能!!!变量怎么存储的,存在哪里,函数调用的具体过程是什么? 调用时的函数栈是怎样做的?C程序的起点真的是main函数吗?静态链接与动态链接到底是怎么搞的?如果你还没想过,那么你的路还很长!!!如果你能掌握的比较好的话,那么任何编译问题,都不是问题,只存在很难的链接问题!!
如果上面所说的你已经做到的话,你可以开始看《APUE》。如果你没有任何linux下的经验的话,还是不要看了!!!先看《鸟哥的linux私房菜》!如果你没学过操作系统,也不要看了,看了也看不懂的!!《APUE》从概论开始讲起,第二章就讲标准,这可能是你从来没有接触过的概念!!从文件系统的系统调用开始讲起,这么安排也是因为操作系统要跑起来得先有个文件系统啊!!然后从进程的环境开始到进程的创建到进程的控制到信号机制到线程创建到线程控制,这就是整本书的核心!!!!从哪里来到哪里去!!!你懂得不能再懂了!!引入可重入问题!引入竞争与同步控制!引入进程间的通信与网络通信(socket)!!
ARM和单片机还是有许多区别的,可以说比单片机的应用更为复杂吧,往往在单片机里只需要对一个寄存器赋值就可以的初始化,在ARM下就要调用库函数了。甚至每个引脚其功能都多了许多,相应的配置也会更为麻烦,但如果做多了ARM的项目就会发现,其实它的应用配置也是千篇一律,有章可循的,并没有想象中的那么难。如果真是想学ARM的嵌入式开发滴话:
第二:找一本关于内核的不错的书,比如,想学Cortex-M3的话,《The Definitive Guide to the Cortex-M3》是很不错的。看这书的时候不需要全部掌握,只需要当做一本参考手册来读就好,知道在开发过程中遇到什么问题来这里哪一章找解决方法即可。
第四:自己跟项目,或者自己搞点什么开发了~~例如开发一个小智能小车之类的,学习嘛~总得有点儿投入。
其实,如果你是利用业余时间来学这些东西,前三项估计需要两个月,但如果你真想好好研习下ARM,我相信这两个月的付出是值得的,比急功近利地直接去找个项目程序调试神马的靠谱多了。
扫一扫关注微信公众帐号