什么是嵌入式编程?如何入门和提高?

article/2025/10/30 14:12:52

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。
转载请注明出处。
原文:http://www.jianshu.com/p/d59378613d15

内容简介


  1. 什么是嵌入式
  2. 什么是交叉编译
  3. 入门和提高嵌入式

1. 什么是嵌入式


嵌入式可以说是目前涵盖面最广、最火的职业之一。那么,什么是嵌入式呢?

这个问题三言两语还真说不清楚。

嵌入式,英语是 embedded,表示“嵌入式的,植入的,内含的”。

因为首先,嵌入式有不少组合名词,例如嵌入式系统,嵌入式软件,Linux 嵌入式,Android 嵌入式,嵌入式 Web,等等。

通常对嵌入式的定义其实是对"嵌入式系统"的定义。

网上对嵌入式系统的中文定义实在是不好理解,比较官方的中文定义是:

嵌入式系统是:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

我个人感觉:如果是从来没接触过嵌入式的朋友,看了上面这段定义,估计跟没看差不多,还是一头雾水。当年我刚开始学习嵌入式时看到这段解释也是这般感受。

当然了,这段定义是正确的,不过就是有点学究味,不够形象,不够"接地气"。

那么如何给嵌入式系统一个接地气的定义呢?

我可以先列举目前用到嵌入式系统的 IT 领域:

  • 物联网
  • Android 嵌入式开发。
  • Linux 嵌入式开发。
  • 智能手机,平板,智能手表。
  • 可穿戴设备,例如 Google 眼镜,小米手环。
  • 微软的 Xbox 和 Kinect。
  • 无人机。
  • VR 头盔。
  • 无线路由器。
  • 等等

我想不必再列举也已经感觉到了吧:是的,嵌入式正在渗透到我们生活的方方面面, 而且会越来越多地被使用。

但是,例如 Android 和 iOS 的纯 app 开发的话一般就不能算是嵌入式了,只能算软件开发。

未来,也许我们可以有一身轻便的可穿戴设备,衣食住行都用得到。甚至未来可以穿一身轻薄的“飞行衣”,想去哪都行。

嵌入式编程,虽然入门门槛比较高,但是如果你能啃下嵌入式这个“硬柿子”,学了很多方面的知识,那么其他一些编程领域,也许就能比较轻松地掌握了。就好比你如果熟练掌握了 C语言和 C++,那么其他一些编程语言一般都可以轻松驾驭了。

我觉得原版英语的定义应该会更便于理解,因此我将维基百科上对嵌入式系统的定义翻译如下(不才, 若翻译有误请补充指正):

An embedded system is a computer system with a dedicated function within a larger mechanical or electrical system, often with real-time computing constraints. It is embedded as part of a complete device often including hardware and mechanical parts. Embedded systems control many devices in common use today. Ninety-eight percent of all microprocessors are manufactured as components of embedded systems.
嵌入式系统首先是一个具备特定功用的计算机系统,是包含在更大的机械或电子系统里面的,通常有实时的计算约束。嵌入式系统作为一个部件被嵌入在一个完整的设备里(补充:这也是“嵌入式”的名字由来),这个设备通常有硬件和机械的部分。当今时代,嵌入式系统控制了很多通用设备。98% 的微处理器被生产用来作为嵌入式系统的部件。

Examples of properties of typically embedded computers when compared with general-purpose counterparts are low power consumption, small size, rugged operating ranges, and low per-unit cost. This comes at the price of limited processing resources, which make them significantly more difficult to program and to interact with.
嵌入式系统和通常的系统有区别,主要体现在以下特性:低能耗,小尺寸,受限的计算范围,单元成本较低。这些特性是以有限的处理资源为代价的,使得嵌入式系统更难以编程和交互。

Modern embedded systems are often based on microcontrollers (i.e. CPUs with integrated memory or peripheral interfaces), but ordinary microprocessors (using external chips for memory and peripheral interface circuits) are also common, especially in more-complex systems. In either case, the processor(s) used may be types ranging from general purpose to those specialised in certain class of computations, or even custom designed for the application at hand. A common standard class of dedicated processors is the digital signal processor (DSP).
现代嵌入式系统通常基于微控制器(即具有集成内存或外围接口的CPU(中央处理器)),但是普通微处理器(使用用于存储器和外围接口电路的外部芯片)也是常见的,特别是在更复杂的系统中。 在任一情况下,所使用的处理器可以是从通用的到专门用于某些计算类别的那些类型,或者甚至是针对当前应用而定制的类型。 数字信号处理器(DSP)就是一种通用标准类别的专用处理器。

Since the embedded system is dedicated to specific tasks, design engineers can optimize it to reduce the size and cost of the product and increase the reliability and performance.
由于嵌入式系统专用于特定任务,设计工程师可以对其进行优化,以减小产品的尺寸和成本,并提高可靠性和性能。

Embedded systems range from portable devices such as digital watches and MP3 players, to large stationary installations like traffic lights, factory controllers, and largely complex systems like hybrid vehicles and avionics. Complexity varies from low, with a single microcontroller chip, to very high with multiple units, peripherals and networks mounted inside a large chassis.
嵌入式系统存在于当今的很多设备里,小到数码手表、mp3 播放器,大到交通灯、工业控制器、混合汽车、航空航天设备。嵌入式系统的复杂性也千差万别,简单的嵌入式系统可能只有一个微控制器芯片;复杂的则有很多个计算单元、外设、网络,这些都被“镶焊”在一个大“底板”上。

2. 什么是交叉编译


在嵌入式编程中还有一个交叉编译的概念。

那么,什么是交叉编译呢?

交叉编译,英语是 cross-compiling。cross 表示“交叉”,compiling 是 compile(表示“编译”)这个动词的现在分词。

简单来说,就是“在一个平台上生成另一个平台上的可执行代码”。

普通的软件开发过程中,如果是编译型的编程语言,例如 C语言,C++,Java,等等。你想要运行你写的程序,需要用编译器将代码编译成可执行程序(当然,中间还有几个步骤,比如预处理、汇编、链接,在此省略)。

但是嵌入式系统的计算能力有限、内存有限、储存空间有限,因此无法完成比较需要资源和速度的编译过程。

比如在 Android 嵌入式开发中,你不可能在 Android 手机里直接让它编译自己的系统或软件吧(臣妾做不到啊)。

因此,我们会先在普通电脑(比 Android 手机的计算能力更强,内存更大,储存空间更大)里将程序编译(需要不同于我们编译普通软件的编译器,称为“交叉编译器/软件”,比较常见的有 arm-linux-gcc 一族)成适配 Android 手机的特定可执行文件(一般会打包成镜像文件),然后通过专门的工具“烧录”到 Android 手机里。

相信经过这些解释,大家对嵌入式应该有一个初步的了解了吧。
但是光看这些解释是不可能了然于胸的,还必须要学习。在实践当中你就会更深入理解嵌入式编程是什么了。

3. 入门和提高嵌入式


现代这个匆忙时代,假如你不好好利用网上那么多的优秀资源(大多数是免费的)来自学的话,就有点亏了。
如果花大钱去读培训班,可能更亏了(如果没有自制的能力,去了培训机构基本也是“浪费”)。

  1. 嵌入式软件的话不一定需要学很多硬件知识的(有的话当然是多多益善)。会用一些烧写工具,编译,调试工具(比如 JTAG)就可以了,到时候要用了现学。开发工具也没什么固定的,一般也不一定要用 IDE,用文本编辑器(比如 Vim,Emacs,Nano,VS Code,等等)就可以写代码。编译一般用 GCC 的变种。

  2. 嵌入式一般都要学 C语言(可以看我的系列教程 C语言探索之旅 。以及《C语言深度解剖》,《C程序设计语言》这两本书。也可以继续深入看《C语言专家编程》,等等)。C++ 也是常用语言之一。

  3. Linux 是必须要学习的。因为交叉编译经常要用到 Linux 系统,即使在 Windows 下也要用到 Cygwin 之类的。
    可以学习我在慕课网的实战课程《Linux核心技能与应用》和专栏《Linux命令行与Shell脚本编程大全》。也可以看来自台湾的鸟哥的 鸟哥的Linux私房菜 。可以逛逛 中国Linux公社 。看《Unix环境高级编程》这本书。猪哥的嵌入式Linux公房菜 还行,我没看完,感觉有点乱(当然作者比我厉害多了),没有鸟哥的文笔那么流畅清晰。

  4. 最好花点时间学习一下汇编,对理解计算机的原理,特别是内存、指针、二进制、十六进制都有很好帮助,不需要学很深。推荐王爽老师的《汇编语言》一书, 是入门绝佳教材。

  5. 嵌入式目前主流的处理器架构是 ARM(以前是 ARM7,ARM9,ARM11,现在都 Cortex 系列了)。手机,平板,大部分开发板都是 ARM 的天下。所以需要学一下 ARM 架构,有个了解。一开始对 ARM 不需要太深入,视以后情况而定。ARM 的集成开发环境有 ADS(ARM Developer Suite),是 ARM 处理器主要的开发工具。

  6. 可以去买一块便宜的开发板来开始学习(我觉得自学嵌入式唯一比较花钱之处。几十,几百元就很好了)。树莓派(https://www.raspberrypi.org ;http://www.raspberrypi.com.tw ),Arduino ,等等,都可以。也可以买国内一些厂商自己的开发板,不要买太差的就行。

  7. 如果你买了开发板的话,可以去开发板对应的论坛。比如我以前学生时代买的是天嵌的 TQ2440(现在早就升级到不知道什么了吧,天嵌的论坛 有很多不错的资料。嵌入式Linux论坛 。华清远见的论坛 。电子工程世界论坛 。当然了,国内最大的 IT 社区 CSDN 的 论坛 和 博客 也都是不错的学习区。51CTO 也不错,ChinaUnix 也可以。实验楼 有很好的在线实验环境,使用的实验环境大多是 Ubuntu 这个 Linux 发行版。

  8. 把英语学好,对编程很有裨益,所以千万不要荒废英语。
    还有,数学也需要还过得去吧,毕竟底层有很多位移,与或非运算,十六进制,二进制,十进制转换,等等。可以参看我的这篇文章:对于程序员, 为什么英语比数学更重要? 如何学习 。

  9. 可以看的书很多,主要要选好书,看得有效率。
    《深入理解计算机系统》 非常好,算是入门的。其他也有很多嵌入式书籍。慢慢来,先把基础打好了。嵌入式这个领域太广了,可以学的东西太多,现在技术又日新月异,把基础打好学什么新知识都快。有一本《Orange’S:一个操作系统的实现》的书很推荐,跟着作者一步步写自己的操作系统,热血沸腾。

  10. 假如以后学更有难度的嵌入式实时(Real Time)系统(VxWorks,ecos,ucos,等等。驱动开发之类的,那就要 C语言(和汇编)的功底比较强,要看更深入的书。不过暂时先入门嵌入式,这些更艰深的领域看兴趣,不学也可以。

  11. 需要什么编程的资料,可以关注我的微信公众号「程序员联盟」(微信号:coderhub)(程序员联盟的 QQ 群文件,还有程序员联盟的百度云盘(2T 容量)中,有非常多编程资料)。

  12. 不要害怕,当年我也是从对嵌入式一窍不通努力自学,到现在“只通了一窍”的。自学,从来没有像现在这个时代这般容易。所以,站在这么多巨人(网上有很多大牛的博客)的肩膀上,你还怕入门不了吗? 少年,你离成功只差逼一下自己。

有些点可能没谈到,希望不要误导大家。有什么问题欢迎在留言区交流, 指教。

声明:文章中提到的公司或产品,绝无广告之意。


我是 谢恩铭,公众号「程序员联盟」(微信号:coderhub)运营者,慕课网精英讲师 Oscar 老师,终生学习者。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」


http://chatgpt.dhexx.cn/article/ToCu7KvV.shtml

相关文章

嵌入式编程语言c++,嵌入式开发通常采用哪种编程语言

描述 目前在嵌入式开发领域比较常见的编程语言是C,另外C、Python、JavaScript等语言也可以进行嵌入式开发。总的来说,这几门编程语言并不难学。 嵌入式开发是物联网开发领域的重要组成部分,物联网系统通常涉及到设备、网络、平台、分析和应用…

物联网的嵌入式编程

嵌入式编程在使设备满足人们的需求方面具有悠久的历史。但是,它在很大程度上仍然被应用程序编程所掩盖。当应用程序程序员采用相对高级的面向对象的语言(如C 或Java)或图形化应用程序开发环境(如MATLAB)时,…

嵌入式编程 交通灯显示

要求: 实验平台:MDK5 Proteus8 单片机:AT89C51 1、当A、B道均有车时轮流放行。A道放行10秒,B道放行10秒,转换时黄灯亮0.5秒。时间显示采用数码管显示。 2、一道有车时,另一道无车时,立即让有车的…

嵌入式编程规范及注意事项

嵌入式系统已经在各行各业中得到了广泛的应用,随着人们的生活向信息化,智能化的发展,嵌入式技术将彻底融入到我们的生活,在我们的生活当中扮演越来越重要的角色。对于嵌入式系统来讲,嵌入式软件相当于嵌入式系统的灵魂…

嵌入式编程学习路线图-精心总结

大家好!我是木荣君,今天给大家分享一下嵌入式软件开发学习路线图。这是我按照自己最开始学习嵌入式的时候的学习路线,并且结合自己在多年开发工作中所涉及的知识精心总结的嵌入式软件开发思维导图。这是木荣君精心总结的,花费了不…

嵌入式软件编程模式

文章目录 嵌入式软件编程模式基于周期调用的运行模式基于中断的前后台运行模式基于事件队列的运行模式带时间信息的事件队列运行模式周期任务运行框架 整理自:《AI嵌入式系统:算法优化与实现》 本章介绍嵌入式软件编程模式和通用软件优化方案。嵌入式软件…

其实嵌入式编程还是很难很复杂的

关注、星标公众号,直达精彩内容 来源:coolbacon 能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC的思想和嵌入式的思想结合在一起,应用于实际的项目&#xff0c…

嵌入式开发常用技巧及编程知识

嵌入式开发常用技巧及C/C知识 引言查询程序占据的内存大static 静态变量介绍static在函数中的用法 ‘##’连接符断言函数宏定义与条件变量#if...#else...#endif选择是否使用串口调试 memcpy函数void 指针指针大小 字符串小写转大写字符串大写转小写字符串命令处理将某几位清0&a…

嵌入式程序编写方法与规范

嵌入式程序编写方法与规范 前言 本文主要讲解嵌入式单片机程序的编写方法以及编写规范,以MSP430单片机作为例子,无论是51,AVR还是STM32单片机都同样适用,本文对C语言各种语法各种关键字进行详细解释,对操作物理地址的方法进行剖析…

嵌入式系统C语言编程基础

目录 关于本环节前言专栏为什么进行本环节 小测验解答 C语言复习1.循环与分支2.作用域与存储类3.内存与指针指针 4.位操作(1)位操作的用途(2)位运算符(3)用法:掩码(4)用法:打开位、关闭位、转置位(5)用法:查看某一位的值(6)用法:移…

密码学学习笔记三:同余定理

同余定理 我们在《密码学学习笔记二:RSA加密法》里面提到过同余,此处把同余作为补充知识,单独写一篇文章讲解一下。 同余定理是数论中的重要概念。给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除&a…

简单理解-同余定理

本文章仅用于笔记。部分知识点来源于网络,授权请联系作者(947043511qq.com)。 直接抛出自己的理解: 2个不同的整数a、b,被一个整数m相除时,得到相同的余数,那么我就可以称a、b同余。 因为a、b同…

以太坊EVM源码注释之执行流程

以太坊EVM源码分析之执行流程 业务流程概述 EVM是用来执行智能合约的。输入一笔交易,内部会将之转换成一个Message对象,传入 EVM 执行。在合约中,msg 全局变量记录了附带当前合约的交易的信息,可能是为了一致,这里也…

【密码学探秘】EVM链和并行执行交易

概述 在web3.0世界中,交易的处理性能一直是公链面临的一大技术挑战,如何在不降低安全性和去中心化程度的前提下显著的提升区块链交易的TPS无疑成为众多公链技术专家追逐的目标。以Solana、Aptos为代表的新一代公链的出现更是吹响了通过并行执行交易来攻…

MATLAB计算EVM函数

function [rmsEVM,maxEVM,pctEVM,numSym] EVMcalculate(RxSig,TxSig)%RxSig为接收信号解调后复基带信号;TxSig是发射信号的复基带信号。 %计算接收信号EVM和画星座图 %RxSig,TxSig长度要一样; evm comm.EVM(‘MaximumEVMOutputPort’,true,… ‘XPerce…

通信算法之149:EVM测量

1.星座图 h scatterplot(sqrt(sps)*txSig(sps*span1:end-sps*span),sps,offset); hold on scatterplot(rxSigFilt(span1:end-span),n,offset,bx,h) scatterplot(dataMod,n,offset,r,h) legend(Transmit Signal,Received Signal,Ideal,location,best) 2. 眼图 Eye Diagram D…

以太坊虚拟机 EVM(2)Solidity运行原理

作者:储雨知|FISCO BCOS 核心开发者 引 言 作为一门面向智能合约的语言,Solidity与其他经典语言既有差异也有相似之处。 一方面,服务于区块链的属性使其与其他语言存在差异。例如,合约的部署与调用均要经过区块链网…

IMA/EVM完整性检测代码分析

IMA/EVM完整性检测 IMA(Integrity Measurement Architecture)是一个内核安全子系统,用于检测文件或数据的完整性和安全性。IMA的hook机制指的是内核接口钩子(kernel interface hooks),用于向IMA注册和实现…

为何Cable Loss没补好 EVM会变差

当EVM不好 或是灵敏度不好时 先别急着找硬件问题 先检查Cable Loss 先说结论 先谈谈标题 为何Cable Loss没补好 EVM会变差 多数射频功放输出 会接一个耦合器 将输出功率 耦合到收发器 用意是校正时 侦测输出功率的正确性与否 假设天线头为20dBm Cable loss为5dB 假设天线头…

TI毫米波级联雷达评估板 MMWCAS-DSP-EVM 和MMWCAS-RF-EVM

1. 前言 本文主要是TI的MMWCAS-DSP-EVM 和MMWCAS-RF-EVM 两块评估板的一些使用心得和毫米波雷达的学习总结。 2. 相关原理 毫米波(mmWave)是一类使用短波长电磁波的特殊雷达技术。通过捕捉反射的信号,雷达系统可以确定物体的距离、速度和角度。毫米波雷达可发射波…