发 帖  

如何最有效的学习嵌入式Linux? 已关注 关注问答 34 人已关注

2017年03月27日-2017年04月17日 嵌入式AndroidLinux韦东山单片机 分享到: 收藏 81

`


目前大学电子相关专业仍以C51、STM32单片机作为基础教学,但是在技术方面应用场景有限,在就业方面提升空间有限。

随着物联网的兴起,现在很多性能强大的嵌入式linux系统在硬件成本上并不比一个STM32板子高。电子工程师向基于操作系统尤其是Linux的嵌入式开发升级是必由之路。
而Android是Linux的天然伴侣,具备Linux/Android开发技术的人,在产品开发方面优势明显。

那么怎么才能找到最有效的学习Linux、Android的方法呢?
今天我们邀请到在Linux、Android领域有非常丰富的研发、教学经验的专家韦东山来为大家解答这方面的学习方法。

提问的范围举例:
1、我有单片机基础,如何学习Linux?
2、Linux驱动不是都由芯片厂家做好了吗?我们还需要做哪些?
3、学习Android需要有Linux基础吗?

发烧友学院也上线了韦老师的经典课程,观看地址:http://t.elecfans.com/1976.html

` 750X375 7 - 8.jpg
已结束
  • 请问,有c基础,能直接学ARM吗? 还是要先学单片机?
    请问,有c基础,能直接学ARM吗? 还是要先学单片机?
    展开∨
    这个问题有点混乱,但是也基本是多数入门者的问题。
    首先ARM是什么?STM32单片机用的是ARM芯片,S3C2440用的也是ARM芯片,更种高端的嵌入式处理芯片基本也是ARM芯片。所以,如果要进入嵌入式行业,肯定是要学习ARM的。其次,怎么学?先学习ARM单片机,还是直接学习运行于ARM芯片上是Linux系统?

        我觉得这才是这个问题的关键。
       
    这个问题又要分为好几项来回复:
    1)你的目的是什么?
       如果只是想掌握嵌入式里的APP开发,你完全没必要管什么单片机、操作系统,你直接去学习你关心的APP相关知识就可以。

    2)假设你最终需要学习Linux底层知识
       那么你需要先学习单片机,有2个原因:
    ① 后面要学习的bootloader就是单片机程序的组合,
    ② "Linux驱动 = 驱动软件框架 + 硬件操作",学习单片机可以让你先抛开复杂的驱动软件框架,专门学习硬件操作。
       但是我要说明的一点,单片机的学习并不需要再去选择STM32这类的单片机,也不要去选择KEIL、MDK等windows下的开发工具。
       硬件方面,选择能运行Linux系统的ARM开发板,目前推荐S3C2440开发板,它的资料最多。
       软件方面,使用arm-linux工具链来编程,这可以让你学会被keil,mdk等工具屏蔽的技术细节
    有C基础,学嵌入式很合适,可以找我交流啊QQ2685896890
  • 请问韦老师,工作中是不是写应用的机会更多?那么是否一定要学驱动?
    请问韦老师,工作中是不是写应用的机会更多?那么是否一定要学驱动?
    展开∨
    写应用的职位,永远比写驱动的职位多,而做硬件的职位更少,这是事实。
    我们并不一定要学习驱动,这要看你的兴趣与职业规划

        今年看的一篇热文"深圳两套房 面临失业中年财务危机引发家庭悲剧",让我深有感触,摘录部分文字:
        最近也在网上投过简历,我们这三十大几年纪,一般出去做不了高管,企业也不要,面试机会也很少,少数小公司面试过,基本月薪也是税前不到两万,税后房贷都不够,有的还看不上我我们在大公司,自我感觉水平不错,视野开阔,但和***,明显有很大不同,人家小公司我们这年龄的,即使不是高管,基本产品从前到后啥都懂,软硬件,结构啥都能做,我们则只能做自己擅长一段,真正让我们做出产品需要很多配置协助,小公司也养不起我们这样复杂的玩法。
  • 韦老师,你好。我听过几期你的课程了,很实用。请问,听说在第4期安卓视频也讲有驱动,那么它和2期 linux驱动有什么区别?
    韦老师,你好。我听过几期你的课程了,很实用。请问,听说在第4期安卓视频也讲有驱动,那么它和2期 linux驱动有什么区别?
    展开∨
    简单地说,Android驱动=Linux驱动+JAVA封装。
    Android是基于JAVA开发的,Linux驱动的访问接口是通过C来实现的,JAVA如何访问C?
    这需要我们在C接口之上为JAVA语言提供一个调用接口。
    这个接口的知识很简单,所以Android驱动的核心还是Linux驱动。
    我们学习Android系统,驱动只是其中一部分,它还有其他更多更复杂的内容。
  • 怎样才能更有体系地学习嵌入式?
    你好,韦工,请问怎样才能更有体系地学习嵌入式(软硬件)?如果是偏硬件的,又有哪些学习主线路和脉络以更有效循序渐进地学习?谢谢。
    展开∨
    我们要学习的内容按顺序可以分为这几部分:单片机、Linux系统(主要是驱动)、GUI系统(QT或Android)、APP编程。对于有硬件基础的人,只要具备基本的C语言能力,很适合按照上面的流程进行学习。

    下面着重介绍:
    1. 单片机:
    目的:熟悉Linux下开发环境、掌握如何编写软件来控制硬件,为学习bootloader作准备。

    工具:这绝不是让你使用keil去学习C51、使用MDK等去学习STM32,而是在Linux环境下使用arm-linux-gcc工具链从第1行代码开始编写裸板程序。不再需要选择C51、STM32等单片机来学习,而是使用可以运行Linux的ARM开发板。

    原因:
    1)Windows下这些好用的工具(keil,mdk等)把单片机的开发封装得很好,很多时候你只需要编写main函数。你不会了解程序实现的细节:存储、编译与链接、重定位、栈设置、堆使用、位置无关码等等。这些概念只有脱离了这些图形化的开发工具,在Linux下完全由自己实现,你才会有深刻体会。

    2).在嵌入式Linux系统中,bootloader负责启动内核,它的作用相当于PC的bios。
    可以认为bootloader就是一个集合了各种硬件操作的单片机程序:它会从Flash中读数据,初始化内存,使用串口、网口等等。我们先练习如何操作各个硬件,写出单个的单片机程序,最后综合起来就是bootloader。

    3)后续的Linux驱动,可以简单地认为是“驱动框架”+“硬件操作”。在单片机学习里,我们可以抛开复杂的“驱动框架”,专门学习“硬件操作”

    2.Linux系统(主要是驱动)
    很多人问我,要不要单独学习Linux内核。时间充足的话,我建议单独学习一下内核,建议的书:赵炯的<Linux内核完全注释>,看第1版,薄一点,学习得快一点。如果想速成,我建议先跳过内核的学习,Linux内核=众多驱动的集成,学习了多个驱动后,对内核的理解也会加深很多。

    驱动的学习,举贤不避亲,我认为我们的第2期“韦东山Linux驱动视频”是最合适的教程。内容从最简单的点灯、按键,到LCD、触摸屏,再到工作中实际会用到的各类驱动(SPI,I2C,USB,FLASH,网卡等等),基本全覆盖。

    讲解方法:不念PPT,不直接分析原有驱动代码,而是完全从0写起。从0添加,逐步添加代码,实现庞大复杂的驱动。驱动实在太复杂,光看不练,光听不练,必定会迷失于细节,到最后你都不记得为何要分析这些细节了。

    3.GUI系统(QT或Android)
    注意,我们讲的系统,是怎么在开发板上搭建出QT/Android系统,是深入理解整个系统的内部实现,不是讲怎么开发APP。对于QT系统,我没有研究,无法提供建议。对于Android系统,我们正在录制视频,市面上除了我们似乎暂时也没有其他人做这方面的工作。

    Android系统本身就比较庞大复杂,在它的最下面集合了一些Linux的驱动封装,除此之外可以认为Android跟Linux没什么关系。

    1) 如果只限于学习所谓的“Android驱动”,有Linux驱动能力,再学习一些java调用c语言的jni知识,就足够了。因为 Android驱动 = Linux驱动+JAVA封装。

    2) 对于Android系统的内部实现,需要掌握更多。输入系统、显示系统、摄像头、ALSA等等,在Android里,它们在Linux驱动的基础上实现了更多更复杂的功能。比如输入系统,它首先从Linux驱动获得数据,只有这里涉及Linux驱动;
    然后做一些紧急处理,比如来电静音;接下来决定分发给哪一个APP;APP接收到数据后需要分为多个InputStage进行处理。

    我们需要掌握这些InputStage的实现,这样才能知道应该重写什么函数来添加我们的功能。等我们的视频录完,我才能更好地回复“如何学习Android系统”,这实在是一个很大的系统,知识点太多。

    4. APP编程
    1) Linux C语言编程
    Linux APP编程有一本宝典:<UNIX环境高级编程>,它讲的基本都是某些API函数怎么使用。我的经验是把它当字典,碰到不懂的就翻看对应章节。
    APP编程的练习,需要多参加项目的开发,练习对问题的抽象概括能力,写出容易扩展、容易维护的代码。
    一个好的方法就是分析一下网上的开源项目,你可以看到这些代码中封装了无数的结构体,一开始你会觉得不直观,但是深入理解后你会发现它很容易扩展。

    2)QT/Android GUI APP开发
    暂不涉及,无法提供建议
  • 我有单片机基础,如何学习嵌入式?
    我有单片机基础,如何学习嵌入式?
    展开∨
    有单片机基础的人,是很适合学习嵌入式Linux的,因为你对硬件的操作已经很熟悉。而"Linux驱动 = 驱动软件框架 + 硬件操作",所以你接下来需要把重点放在驱动软件框架上。

    我有以下几点建议:
    1)首先选择一款能运行Linux的ARM开发板。现在阶段建议选择s3c2440开发板,因为它的资料最多,最适合入门。

    2) bootloader的学习:
       在开发过程中会经常使用bootloader(u-boot是常用的bootloader),它就是一个复杂的单片机程序,我们需要稍微掌握一下。
       我猜测你应该是在windows下使用keil/mdk等工具进行单片机开发,你需要在linux下使用arm-linux工具链学习写几个裸板程序,
       这是为了让你了解一下系统上电要做的事情,掌握软件的一些概念:编译链接、位置无关、重定位等等。
       然后分简单分析一下u-boot的启动流程,掌握它的用法。
       这花上个1、2周就可以了,如果想深入以后再回头学习。

    3) Linux驱动的学习:
       从简单到复杂,从点灯/按键,到工作中肯定会碰到的各种驱动(LCD、触摸屏等),我认为我们的第2期视频是比较好的。
    关于嵌入式可以找我交流啊,QQ2685896890
    关于嵌入式可以找我交流啊,QQ2685896890
  • 仅有51学习经验,STM32才刚刚开始学习
    仅有51开发经验,STM32才刚刚开始学习;是否需要一步一步的学习完STM32,然后ARM,才能开始学习嵌入式Linux系统。就是不了解目前主流的需求是什么?感觉什么都想学,一个是时间和精力不足,另一个是学的太杂反而迷失方向。。。请韦老师指导一下方向
    展开∨
    你好。我刚刚把前面几个问题都回复了,这个问题在前面的几个回答中,都覆盖了,建议你把前面的几个答案都回看一下。
  • 我是否有必要从测试转开发?
    韦老师你好,我是在南京一家ADAS企业工作,我16年6月份工作的这是我第二份工作,我做的是硬件测试工作,目前月薪7000多一点点,我想问你一直做测试会有前途吗?或者说我需要重新规划学习开发技术,我对嵌入式很感兴趣。
    展开∨
    对于前途,官话是这样说的:每一份工作都有前途,每一行都有顶尖的。
    但是我想我们更关心的是钱途,这点你可以看看比你工作年限更长的同事,了解一下他们的收入有多少。
    看一下行业里的人,想想几年后自己会成为他那样,是否你想要的?在能抗得住经济压力的前提,按兴趣择业吧。
    另外,这个工作以后会不会被轻易替代:如果这份工作上手快、变成资深专家所花精力也不需要太多,我建议趁早转行吧。
    我2005年之前一直在用51单片机,那时看着前辈们做的产品,明显感觉没那么炫了,于是离职半年全心研究嵌入式Linux。
    我那时没结婚没女朋友没压力,可以任性。
    • 老师,我对嵌入式linux这个概念不是很熟悉,不知道从哪里开始学起,能不能提点一下呢
      展开∨
  • 韦老师你好,如果自己设计嵌入式开发板,核心板最少需要哪些部分?
    韦老师你好,如果自己设计嵌入式开发板,核心板最少需要哪些部分?
    展开∨
    你可以去找一些核心板的原理图参考一下,基本上包括这些:
    1. 电源转换: 提供CPU核心电源比如1.8V、1.25V;IO电源比如3.3V
    2. 主芯片
    3. 内存:DDR、SDRAM
    4.存储芯片:Flash,如果可以使用SD卡启动的话,存储芯片可以省略而只留出SD卡插槽
    5. 其它:比如电源灯、复位键、一两个LED/按键(用于测试)
    6. 对外的插座:通过插座,可以接底板
  • 噗,慢慢就是一个程序猴了,,没意思
    展开∨
    有意思的事情很多,看个人喜好了。我就一直对电子游戏提不起兴趣,觉得你砍我一下,我再砍你一下,看起来好傻;但是我同学就喜欢得很。
  • 我有单片机基础,手头也有嵌入式开发板了,如何学习ARM嵌入式?
    我有单片机基础,手头也有嵌入式开发板了,如何学习ARM嵌入式?
    展开∨
    嵌入式的区分有很多,有应用、有驱动。
    有单片机基础的话,对于学习嵌入式LINUX驱动很有帮助。
    linux驱动=驱动软件框架+硬件操作。
    我们的教程是这样:裸机、驱动、项目。
    我认为你可以跳过裸机,只要先掌握怎么烧写、使用UBOOT,怎么编译、烧写内核,怎么烧写根文件系统,就可以开始驱动的学习了。
    刚开始学习驱动时,你会发现它似乎把一个简单的问题复杂化了,比如非常简单地点LED,你要设置很多函数;
    这时,你要坚持住,你最后发现这些设计思路跟单片机完全不同。
    按照我们的第2期视频学习吧,它从点LED开始,从简单的LED到复杂的各类驱动,都分析得很清楚
  • 有8位单片机开发经验和较深厚C语言基础
    韦老师,我有8位单片机开发经验,近段时间又重新深入研究了C语言,对安卓底层驱动非常有兴趣,看了你下面问题的答案,基本学习路线有了,但具体的学习步骤和课程规划还是搞不太清楚,我倾向于买开发板和视频教学的那种学习成本低,学习时间自由的方式,请指点!
    展开∨
    安卓底层驱动其实就是LINUX驱动,
    我以前也是做C51单片机的,
    我买了2440开发板后,就先把它当作单片机来学习,使用arm-linux-gcc来编译简单的裸机程序,
    实现了LED、按键、flash等操作;
    这个过程是让你先掌握在ARM LINUX下开发是怎么一回事,你会发现跟windows下使用keil等工具完全不同。
    接下来就是分析boot程序,它实际上就是一个大的裸板程序;
    最后简单学习一下怎么编译内核,怎么制作烧写根文件系统。
    学习到这里,你已经有能力给一个空白ARM板搭建LINUX系统了。
    最后,就是深入学习驱动,这些驱动个体间都是单独的,一个一个学习。
    这些过程,实际上就是我们第1期、第2期视频的目录顺序。
  • 我想学习一些原理方面的知识,怎么学习呢?
    展开∨
    硬件原理的话,我以前学过微机原理、数字电路,也不知道现在有没有更好的书;
    操作系统的话,我以前学过赵炯的《LINUX内核完全注释》,也不知道现在有没有更好的书;
    你这问题不具体,也不知道你指的是哪方面的原理。
  • 请教下
    您好  ,   老师  ,   我之前在开发快官网申请了一块开发板,想基于说学的嵌入式知识,自己弄些小作品
    展开∨
    你要请教啥?可以去我们官网论坛提问
  • $┐( ‾᷅㉨‾᷅ )┌ 怪我咯
    展开∨
    ?
  • 一样精通,样样通。
    展开∨
    一理通,百理明;很多知识是相通的
  • 电子整流器原理中,c5电容通过+V电流向c6电容充电,这可是直流哦!在说,L1,L2,L3在一开始直流状态下能自耦吗,这都说不通哦
    展开∨
    这提问发错地方了,我不做硬件
  • 老师好,如何正确用含有2803和154以及573来写16*16*16的光立方程序,就现用AT89c51的。能简单提一下么?
    展开∨
    这个问题我不懂,没经验
    这个我也不知道
  • 我买了开发版,看了视频,还是一头雾水
    展开∨
    可以结合我写的《嵌入式LINUX应用开发完全手册》来看,有问题可以到论坛发贴,也可以联系卖家提供即时的技术支持
  • 请问,电磁炉无论线盘对谐振电容充电,还是谐振电容对线盘放电,线盘下端电位都会高于上端电位,请问是什么原因
    展开∨
    你好,这个我不了解。
  • 展开∨
12下一页

本期嘉宾

韦东山

深圳百问网科技  创始人

+ 关注 取消关注 已关注 68 人已关注

更多专家问答

热心回答者

关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表