在线课堂:https://www.100ask.net/index(课程观看)
论  坛:http://bbs.100ask.net/(学术答疑)
开 发 板:https://100ask.taobao.com/ (淘宝)
     https://weidongshan.tmall.com/(天猫)
交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
交流群二:QQ群:536785813(单片机-嵌入式)
公 众 号:百问科技


版本 日期 作者 说明
V1 2020 韦东山 技术文档

我是韦东山,一直从事嵌入式Linux培训,最近打算连载一系列文章。
正在录制全新的嵌入式Linux视频,使用新路线,不再从裸机/uboot开始,效率更高。
对应文档也会写成书<<嵌入式Linux应用开发完全手册>>第二版,
视频文档、书的样稿可以直接下载:https://vdisk.weibo.com/s/t6HbuIpx6zoa1

1.概念

只要涉及编程,并且所用硬件不是电脑的话,都可以认为是嵌入式软件开发。所谓“嵌入”,就是把处理器嵌入某个物体中,让它具备计算能力。比如手表中有单片机,那么手表就是一个嵌入式设备,在上面开发的单片机程序就是嵌入式软件;手机中有性能强大的处理器,它也是一个嵌入式设备,手机中运行Linux系统,在Linux系统上运行Android系统,这些Linux、Android都属于嵌入式软件。

嵌入式设备上运行的软件或系统可以分为三类:单片机、Linux/WinCE等大型操作系统、Android/IOS/QT等GUI系统。

做产品时我们考虑的是性价比,什么合适就用什么,这需要我们具备多方面的开发能力。本文将介绍单片机、Linux、Android系统的侧重点。

2. 有哪些产品使用这3类技术?



没有一样技术可以适用于所有设备,很多时候需要组合起来。比如无人机,使用单片机才能更快处理各种控制事件,使用Linux才能更好进行图像处理、传输,在手机端还得给你开发一个安卓APP让你更容易操控。

3. 谁的工作机会更多

我们要用数据说话,看下图:

让人意外,Linux的职位竟然是最多的。可能因为很多互联网产品也使用Linux,比如虚拟化、云计算、云存储领域。这些互联网公司、云产品公司对Linux开发人员也有大量的需求,把这些公司的职位来跟单片机职位进行对比,很不公平。

所以我再细分一下,把涉及硬件操作的Linux职位单独抽出来,如下:

这些数据统计稍显粗略,但是也能说明一些问题,我先做个柱形图:

也许,我们可以得出这么个结论:跟硬件打交道的职位里单片机最多,嵌入式Linux的数量是单片机的三分之二。

如果把Linux APP的职位算上,那是最多的,这似乎有些不公平,Linux APP应该去跟JAVA等相比。

这些职位需求也是吻合现实的,一个公司里硬件职位最少,驱动稍多点,APP最多。很多时候APP职位里几个老员工把驱动的活也全包了。

3.1 单片机工作机会门槛最低

身边触手可及的电灯开关、洗衣机、冰箱、微波炉等小家电,使用的都是单片机技术;家里的无线路由器、智能电视,用的是Linux;你天天用的手机要么是安卓要么是苹果。

可以大概猜得出来,单片机的工作机会更多地集中在小家电领域,门槛比较低,单纯的技术上升空间也有限。注意,我说的是“技术上升空间”。我几年前发表过一个观点“学习单片机没有前途”,这过于激烈,被很多人骂。我今天把它改为“只学习单片机没有前途”。

最近有一个高手在教我CAN的知识,CAN编程基本只用在单片机上,但是华为年薪80万挖不走他;并且他才刚开始学习Linux。他给我发过两张图:

各位看看上面的图,要想拿高薪,单片机工程师必须深入行业,掌握行业的核心技术。否则,单就单片机技术来说,10年经验跟2年经验并没有太大区别。

做单片机很容易从上到下整个程序都是你一个人掌握,所有问题你都清楚,这很安逸,也意味麻痹及危机。

现在5G、物联网时代到来,单片机也将会有新的发展,我认为重点在于各类RTOS、各类物联网规范。

3.2 Linux的职位反而是最多的

在写这篇文章之前,我也倾向于认为单片机的职位是最多的。但是在51JOB上进行粗略搜索之后,linux的职位反而是最多的,即使仅仅计算“嵌入式 linux”的职位,也达到了单片机职位的三分之二。这也许预示着中国的产业升级,大家都不再满足于使用单片机完成简单的功能,需要添加更多更炫的功能。

如果你是电子工程师,想从事“linux驱动”等跟硬件密切相关的工作,可能机会不多,因为这需要你有经验。这就是行业尴尬的地方,单片机工程师想跳槽,最适配的是嵌入式Linux中跟硬件编程相关的职位,但是这个职位又太看重经验;实际上很容易找到的是电子产品的Linux APP开发。

现在的中小公司里有这么一个趋势,扔一个项目给你,从上到下APP、驱动、硬件都要你的团队完成,很多人都是多面手。

所以,技多不压身,如果你是电子工程师话,单片机、Linux驱动、Linux APP都掌握,也许生存能力才能大辐增强。

3.3 Android

安卓的热度有点退了,一个中小公司没有一定的实力真做不来安卓系统,这个系统太庞大了,乱配个蓝牙就分分钟卡上1、2个月。
所以需要用安卓系统的公司,多是采购方案公司的板卡,方案公司帮你改好安卓系统。
买来方案后,这些公司多是做些安卓APP;要研究安卓系统的人,也许去手机厂家或是方案公司会比较好。
比如我知道的科大讯飞下某子公司,就是使用中山firefly的瑞芯微系列板卡。

4 单片机/Linux/Android工程师怎么点灯

LED的原理图如下,只要让某个引脚输出高电平或低电平,就能让LED亮或灭。

4.1 单片机怎么点灯

简单地说就是需要工作师去看原理图确定引脚是哪一个,输出什么电平能点亮LED。再去看芯片手册,确定怎么操作寄存器。最后写程序。

至于你写的程序,风格如何、函数名怎么取,完全由你自由发挥。以后别的同事想来重用你的代码,就得看你写的说明,或是看你的代码。

现在ARM公司在推出一些HAL规范,就是规定一些硬件操作函数接口,如果大家都遵守这些规范的话,在单片机上的APP也很容易移植到其他板子上。

4.2 Linux怎么点灯

在Linux中,驱动程序负责操作硬件,APP调用open、write这些标准接口就可以点亮LED。APP调用open,会导致驱动程序中的led_open被调用;APP调用write,会导致驱动程序中的led_write被调用。

所以,驱动怎么写?驱动程序中要写出led_open、led_write这些函数。在写出这些函数之前,驱动工程师也要去看原理图、看芯片手册,这跟单片机工程师是一样的。然后就按照Linux的规范提供这些led_open、led_write函数。
所以,Linux驱动 = 驱动框架+硬件操作 = 驱动框架+单片机知识。
为什么要多此一举引入驱动框架?直接操作硬件多爽、多直接。

原因有2
​ 1.术业有专攻,不要让写APP的人去看原理图、芯片手册,他们只需要调用标准的open,read,write等接口即可操作硬件
​ 2.软件和硬件隔离,硬件再怎么变化,只需要改驱动,APP不需要改

3.3 Android怎么点灯

Android是一套GUI系统,它是运行在Linux上面的,硬件操作由Linux完成。所以你可以认为Android就是一套APP,它也是通open、write这些接口来访问驱动,进而操作硬件的。

但是Android中程序太多数是用JAVA编写的,这些open、write是C语言函数,所以要引入一个层:JNI接口(Java Native Interface),通过这个接口Java可以调用C函数。

5. 单片机/Linux/Android工程师怎么使用LCD

用点灯举例太简单,可以突出单片机和Linux的区别;但是Linux和Android的区别似乎不大。

下面我们用LCD为例讲解。

5.1 LCD操作原理

假设上图是一个LCD屏幕,屏幕中一个一个密密麻麻的黑点称之为像素点,每一行有若干个点,试想下有一个电子枪,电子枪位于某一个像素点的背后,然后向这个像素发射红,绿,蓝三种原色,这三种颜色按不同的比例组合成任意一种颜色。电子枪在像素点的背后,一边移动一边发出各种颜色的光,电子枪从左往右移动,到右边边缘之后就跳到下一行的行首,继续从左往右移动,如此往复,一直移动到屏幕右下角的像素点,最后就跳回原点。

问题1:电子枪如何移动?

答: 有一条像素时钟信号线(DCLK),连接屏幕,每来一个像素时钟信号(DCLK),电子枪就移动一个像素。

问题2:电子枪打出的颜色该如何确定?

答:有三组红,绿,蓝信号线(RGB),连接屏幕,由这三组信号线(RGB)传递颜色

问题3:电子枪移动到LCD屏幕右边边缘时,如何得知需要跳到下一行的行首?

答:有一条水平同步信号线(HSYNC),连接屏幕,当接收到水平同步信号(HSYNC),电子枪就跳到下一行的最左边

问题4:电子枪如何得知需要跳到原点?

答:有一条垂直同步信号线(VSYNC),连接屏幕,当接收到垂直同步信号线(VSYNC),电子枪就由屏幕右下脚跳到左上角(原点)

问题5:电子枪如何得知三组信号线(RGB)确定的颜色就是它是需要的呢?

答:有一条RGB数据使能信号线(DE),连接屏幕,当接收到数据使能信号线(DE),电子枪就知道这时由这三组信号线(RGB)确定的颜色是有效的,可以发射到该像素点。

下图是开发板,LCD控制器,LCD屏幕的框图

之前提到的像素时钟(DCLK), 三组红,绿,蓝信号线(RGB),水平同步信号线(HSYNC),垂直同步信号线(VSYNC),RGB数据使能信号线(DE)都是从LCD控制器发出的,只要开发板支持LCD显示,它肯定就会有一个LCD控制器。

问题6:RGB三组信号线上的数据从何而来?

上图是RGB数据来源框图,内存中划出一部分区域,这块区域被称为Framebuffer。在Framebuffer里面我们会构造好每一个颜色所对应的像素。Framebuffer中的值会被LCD控制器读出来,通过RGB三组线传给电子枪,电子枪再把它转换成红绿蓝三种颜色打到屏幕上。在屏幕上的每一个像素,在Frambuffer里面都有一个对应存储空间,里面存有屏幕上对应像素的颜色。

LCD控制器会周而复始的从Framebuffer中取出一个个像素的颜色值,发给电子枪,同时需要和DCLK,VSYNC,HSYNC,DE这些信号配合好。

总结起来,程序需要做的就是2点:设置好LCD控制器,然后在显存中写入数据。

5.2 单片机怎么操作LCD

单片机程序员要做的事很直接:
1.设置LCD控制器,它会自动从FrameBuffer中读取每个像素的数据发送到LCD上
2.把要显示的文字、图像放入FrameBuffer中

5.3 Linux怎么操作LCD


在Linux中,驱动程序负责操作硬件,APP调用open、ioctl这些标准接口就可以获得LCD的参数,设置LCD。然后使用mmap获得Framebuffer的地址,就可以往里面填入数据。
至于LCD控制器的设置,这由驱动来做。

所以,驱动怎么写?初始化LCD控制器,提供lcd_open、lcd_ioctl、lcd_mmap函数,让APP可以通过这些函数获得LCD参数,设置参数,获得Framebuffer地址。
所以,Linux驱动 = 驱动框架+硬件操作 = 驱动框架+单片机知识。
为什么要多此一举引入驱动框架?直接操作硬件多爽、多直接。

原因有2
1.术业有专攻,不要让写APP的人去看原理图、芯片手册,他们只需要调用标准的open,read,write,ioctl,mmap等接口即可操作硬件
2.软件和硬件隔离,硬件再怎么变化,只需要改驱动,APP不需要改

5.4 Android怎么操作LCD

Android是一套GUI系统,跟QT是类似的。在Android/QT等GUI系统里:

    1. LCD会被多个APP使用,如果不统一管理必定乱套;
    1. 所以,肯定有一个管理软件,或称为服务软件:
    • 2.1 APP自行构造自己的界面,提交给显示显示服务软件
    • 2.2 显示服务软件:根据多个APP的前后层次,合并最终的显示图像
    1. 最后再调用驱动程序显示出来

所以在Android系统中,它的重心在于显示服务、在于多个窗口的层叠、管理、销毁。硬件的操作交给是Linux实现。

6 写在最后

我无意引起单片机、Linux、Android孰优孰劣的讨论,我确实不看好纯粹的单片机软件开发,但是很看好RTOS及物联网在单片机上的应用。
生活不容易,码农不容易,走上码农之路,只有不断学习了。

【韦东山】嵌入式全系统:单片机-linux-Android对硬件操作的不同侧重点相关推荐

  1. 韦东山嵌入式开发板小结1

    韦东山嵌入式开发板小结1 一.连接[开发板-win10-虚拟机] 1.播放虚拟机VMware的ubuntu 16.04,设置win10和 虚拟机处于同一网段 >>>ipconfig ...

  2. 002_韦东山嵌入式Linux应用开发基础_实操碰到的问题集锦

    嵌入式Linux应用开发基础_韦东山教程思考笔记 配合<嵌入式Linux应用开发完全手册V5.1_IMX6ULL_Pro开发板> 文件目录 访问根/目录下,Filesystem Root目 ...

  3. 韦东山 嵌入式Linux应用开发基础知识 上【gcc makefile 输入设备

    1 main的输入参数,并且在命令行运行文件的时候输入 我的练习 先写了个单纯输出的hello 按照教程里那样写hello 所以gcc编译过程应该是 先创建一个.c文件 gcc -c -o hello ...

  4. 韦东山 嵌入式Linux应用开发基础知识 下【串口 IIC SPI

    10 串口 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双方按照完全相同的速度接收数据.因此,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步: 双方还必须事 ...

  5. 用OpenJTAG烧写程序到Flash—— 韦东山嵌入式Linux视频学习笔记03

    说明:本文仅在Windows环境下实验. 韦东山的JZ2440(v2),可以选择从Nor Flash启动,也可以选择从Nand Flash启动,不管从哪里启动,都需要Flash上有程序,没有程序的话, ...

  6. 如何告别半途而废——韦东山嵌入式Linux视频学习笔记00

    今天终于从柜子里翻出了韦东山的板子--JZ2440(V2),又翻出了当时买板子赠送的光盘,是的,我又要重新学习了.其实说"重新"是不对的,我当初就没有学完,学到一半放弃了(惭愧啊) ...

  7. 关于JTAG——韦东山嵌入式Linux视频学习笔记02

    1. JTAG的字面意思 JTAG --Joint Test Action Group,联合测试行动组. 2. JTAG标准 随着技术的发展,芯片的结构和功能越来越复杂,传统的使用万用表.示波器测试芯 ...

  8. 开发板、Windows、Ubuntu三者互联——韦东山嵌入式Linux学习笔记08

    实验环境: 1. Windows7 2. VMware12.0+Ubuntu 3. JZ2440 按理说,在物理机上安装Ubuntu操作系统是比较推荐的方法.不过,因为windows上有很多好用的工具 ...

  9. win7下不能使用dnw烧写的解决办法——韦东山嵌入式Linux学习笔记05

    本文实验环境: 1. windows 7(64bit) 2. JZ2440 一. 问题的提出--没有驱动 假设板子的 Nor Flash 上已经烧好了 u-boot,那么如何通过 u-boot 的US ...

最新文章

  1. 10 行代码玩转 NumPy!
  2. Oracle传输表空间
  3. boost::lexical_cast用法的测试程序
  4. 采购订单模板_采购必备:如何搭建合规的采购流程
  5. eclipe安装中文语言包 CDT Pydev
  6. background-position 用法介绍
  7. 2017甘肃省计算机二级考试,甘肃省2017年计算机二级考试网上报名须知及流程
  8. 谷歌Pixel 6系列正式发布:搭载自研Tensor SoC 规格超骁龙888
  9. apache缓存php页面不改变,Apache服务器禁止静态文件缓存的实现方法
  10. python字符串格式化 说明符顺序_python实践分享:格式化字符串时使用.format方式还是“%”...
  11. 管理感悟:轮值不是记流水账
  12. paip.提升用户体验-------在C++ Builder 中为Form窗体添加背景图片
  13. aix系统vi修改命令_aix系统VI编辑器的操作
  14. adobe acrobat pro字体很怪,有点发虚,不整齐,调整方法
  15. C语言 case语句 连续值,对一个switch case语句使用两个值
  16. WeaveSocket框架-Unity太空大战游戏-服务端-1
  17. 数据竞赛修炼笔记之快手用户活跃度的预测
  18. 高通8996启动流程-2.总体启动流程
  19. 2020年度国产数据库:openGauss
  20. 北理工乐学C语言 60.合并排序

热门文章

  1. CentOS7安装配置ArangoDB3.4.1图形数据库、NOSQL资料
  2. 新浪微博面试(2018.4.29)
  3. 2021年电工(高级)考试及电工(高级)考试题库
  4. 一个男人的日记片断,笑翻了
  5. solor快速_Solr快速入门(一)
  6. HSA-Cy3;Cy3标记人血清白蛋白;用于免疫荧光检测、流式细胞分析和药物小分子与生物大分子相互作用的分析测定。
  7. 【最佳实践】双因子认证在行云管家中的应用实践
  8. 政府对加密数字货币的态度
  9. 硬件第1城:光猫GE和FE的区别
  10. java sql 美化插件_Mybatis插件-sql日志美化输出