文章目录

  • 一、什么是单片机
  • 二、什么是嵌入式
    • 嵌入式的硬件层
    • 嵌入式的软件层
    • 嵌入式的中间层
  • 三、嵌入式和单片机的区别和联系
    • 一、什么是嵌入式
    • 二、什么是单片机
    • 三、嵌入式和单片机的区别
  • 四、51单片机和STM32单片机
  • 五、有无操作系统的区别,程序启动流程
    • 单片机有无操作系统有什么区别
    • 嵌入式/单片机有哪些操作系统
    • 关于单片机程序运行的一些理解
    • 带操作系统的嵌入式系统的启动过程
  • 六、嵌入式学习路线,单片机学习路线?到底该怎么学
    • 嵌入式方向
      • 嵌入式硬件方向
      • 嵌入式软件方向
    • 学习嵌入式需要那些内容?
      • C语言
      • 基本的硬件原理
      • 数据结构与算法
      • 计算机基础
    • 学习路线推荐
      • 应用开发
      • 驱动开发
      • 大神:各类复杂驱动
    • 总结
  • 七、学习资料及开发板
  • 八、嵌入式单片机开发常用的IDE

在有关嵌入式单片机等相关内容时,我们会碰到很多名词概念,这些名词概念的定义比较模糊,不同的名词概念之间又有交叉和不同,因此本文对嵌入式单片机领域的一些相关概念做一个比较全面的总结和归纳。如果觉得这篇文章有帮助到你,请点个赞吧!

一、什么是单片机

首先明确概念,什么是单片机,单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,广泛应用在工业控制领域。

从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。比如最经典的51系列单片机,外观只是一块一个拇指大小的长方体芯片,共40个引脚,里面包含了逻辑运算单元。实际上也就是一个CPU。

在最开始接触单片机的时候,还曾经有过一个疑问,为什么单片机是黑色的而不可以是别的颜色,后来才知道是单片机材料的限制。

对单片机而言,其实一个芯片就是全部,其他的比如单片机最小系统都是为了单片机的正常运作而加入,比如晶振,5v电源,电感电阻等。当然最小系统只能保证单片机正常运行,几乎实现不了基于单片机的任何应用。

为了使单片机实现应用,必须要加入其他外设。比如按键,led灯,led屏,蜂鸣器,各种sensor。这也就是市面上很多公司都在做的单片机开发板。

总结,单片机就是完成运算、逻辑控制、通信等功能的单一模块。也就是单片机真的姓“单”。DSP芯片也可以认为是一个单片机。当然它们性能很强大,但是功能依然很单一,总之就是处理数据、逻辑。

总结

单片机可以看成是一个小型的计算机,和我们平时用的电脑,手机有点类似,只不过单片机的性能以及用途和电脑手机会有很大的不同。

二、什么是嵌入式

那么什么是嵌入式呢,一般说嵌入式都是指嵌入式系统,IEEE(InsTItuteof Electrical and ElectronicsEngineers,美国电气和电子工程师协会)对嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。

嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。

嵌入式系统是将应用程序、操作系统、和计算机硬件连接在一起的系统,是指以应用为中心,以计算机技术为基础,软硬件可裁剪,其针对的用户应用对功能、可靠性、成本、体积、功耗和使用环境有特殊要求的专用计算机系统。

事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。这是因为嵌入式系统一般用于工业控制,也就是说对外设的控制都是写死的,并不需要人工干预,同时也为了保证系统的稳定和可靠。

我们经常可以听到公司招聘的要求是嵌入式软件工程师或者嵌入式硬件工程师,也就是说嵌入式系统包括软件和硬件,其实仔细想想也能明白,都已经跑系统了,当然有软件也有bsp硬件。

也就是说嵌入式系统是软硬件结合体,国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

可以看到嵌入式一般是一般包括软硬件的。

嵌入式的硬件层

硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。其中操作系统和应用程序都可以固化在ROM中。

其中核心就是微处理器,嵌入式处理器和一般的电脑CPU还有区别,嵌入式微处理器大多工作在特定设计的系统中,比如TI或者Atmel公司都有很多定位不同的处理器,atmel的SAM系列是专门为物联网设计的,AVR则由于性能突出,广泛应用于工业领域。

嵌入式微处理器有各种不同的体系,即使在同一体系中也可能具有不同的时钟频率和数据总线宽度,或集成了不同的外设和接口。据不完全统计,全世界嵌入式微处理器已经超过1000多种,体系结构有30多个系列,其中主流的体系有ARM、MIPS、PowerPC、X86和SH等。

但与全球PC市场不同的是,没有一种嵌入式微处理器可以主导市场,仅以32位的产品而言,就有100种以上的嵌入式微处理器。嵌入式微处理器的选择是根据具体的应用而决定的。

在嵌入式领域,可以说ARM架构的处理器占据了半壁江山,而ARM公司也成为著名的科技公司,而它却没有生产任何处理器,而只是提供了IP,可以看出一流公司做标准。而其他用的比较多的架构就是MIPS,sparc、powerpc等。

比如ARM公司有各种各样的处理器架构,最经典的cortex系列,它属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。ARMv7架构定义了三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用;“R”系列针对实时系统;“M”系列对微控制器。

嵌入式系统和外界交互需要一定形式的通用设备接口,如A/D、D/A、I/O等,外设通过和片外其他设备的或传感器的连接来实现微处理器的输入/输出功能。每个外设通常都只有单一的功能,它可以在芯片外也可以内置芯片中。外设的种类很多,可从一个简单的串行通信设备到非常复杂的802.11无线设备。

嵌入式系统中常用的通用设备接口有A/D(模/数转换接口)、D/A(数/模转换接口),I/O接口有RS-232接口(串行通信接口)、Ethernet(以太网接口)、USB(通用串行总线接口)、音频接口、VGA视频输出接口、I2C(现场总线)、SPI(串行外围设备接口)和IrDA(红外线接口)等。这一点其实和单片机类似。

嵌入式的软件层

也就是操作系统了,包括内核和文件系统,还有就是更为顶层的应用程序,嵌入式操作系统一般都是Linux或者其他类Unix,还有一些实时操作系统(RTOS)比如VxWorks、RTEMS、ucOS等。

其中Linux还包括不同的distribuTIon,比如Ubuntu、Redhat、Debian、centos等,他们都是采用Linux的内核,不同的是上面的software和tools,当然不用太过于担心标准问题,这些Linux发行版选择的软件几乎都是比较通用的,比如网页服务器的Apache、电子邮件服务器的postfix、sendmail、文件服务器的Samba等。此外还有Linuxstandard base等标准来规范开发者。类Unix主要是FreeBSD以及Solaris等。

嵌入式领域最常用的之一是实时操作系统,实时操作系统的核心就是实时性,本质就是任务处理所花费的时间的可预测性,即任务需要在规定时限内完成。IEEE对实时系统的定义是“那些正确性不仅取决于计算的逻辑结果也取决于产生结果所花费时间的系统”。

实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的; 软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。

实时操作系统和Linux这种分时操作系统的区别列举如下:

(1)多路性。实时信息处理系统与分时系统一样具有多路性。系统按分时原则为多个终端用户服务; 而对实时控制系统,其多路性则主要表现在经常对多路的现场信息进行采集以及对多个对象或多个执行机构进行控制。

(2)独立性。实时信息处理系统与分时系统一样具有独立性。每个终端用户在向分时系统提出服务请求时,是彼此独立的操作,互不干扰;而在实时控制系统中信息的采集和对对象的控制,也彼此互不干扰。

(3)及时性。实时信息系统对实时性的要求与分时系统类似,都是以人所能接受的等待时间来确定;而实时控制系统的及时性,则是以控制对象所要求的开始截止时间或完成截止时间来确定的,一般为秒级、百毫秒级直至毫秒级,甚至有的要低于100微秒。

(4)交互性。实时信息处理系统具有交互性,但这里人与系统的交互,仅限于访问系统中某些特定的专用服务程序。它不像分时系统那样能向终端用户提供数据处理服务、资源共享等服务。

(5)可靠性。分时系统要求系统可靠,相比之下,实时系统则要求系统高度可靠。因为任何差错都可能带来巨大的经济损失甚至无法预料的灾难性后果。因此,在实时系统中,采取了多级容错措施来保证系统的安全及数据的安全。

由于更加可靠和及时。嵌入式实时操作系统更加广泛应用于工业控制、航空航天、军工等领域,比如美国航天局NASA近几年发射的火星探测器等都是采用的RTEMS实时操作系统。

嵌入式的中间层

所谓的中间层就是软件层和硬件层之间的接口层,其实严格而言也属于软件层。一般开发者称之为BSP,这一层主要负责的是向下提供硬件的驱动,硬件的配置等操作,向上则向软件开发者提供标准API,进行中间层开发的开发者通常称为嵌入式驱动工程师。

从这里也可以看出来,嵌入式设计和软硬都分不开,既要掌握底层硬件的特性以及如何驱动其工作,也要了解操作系统的相关知识,才可以编写相应功能的应用。

因此看一个操作系统是否支持某个芯片或者某个开发板,只要看其源码中是否包含相应芯片或开发板的板级支持包。

三、嵌入式和单片机的区别和联系

凡是从事计算机或电子信息相关领域工作的童鞋,一定都听说过嵌入式和单片机吧?

很多人应该知道,这两个名词和硬件系统有着非常密切的关系。一听到它们,就容易让人联想到插满芯片和针脚的电路板:

但是,如果要问具体什么是嵌入式,什么是单片机,它们之间究竟有什么区别,我相信大部分人并不能解释清楚。

今天,小枣君就给大家做一个入门科普,揭秘上述问题的答案。与此同时,我还会给大家介绍一下,我们经常听说的51、STM32,究竟是什么。

什么是嵌入式

首先,我们来看看什么是嵌入式。

嵌入式,一般是指嵌入式系统,英文叫作:embedded system。嵌入式开发,其实就是对嵌入式系统的开发。

IEEE(美国电气和电子工程师协会)对嵌入式系统的定义是:“用于控制、监视或者辅助操作机器和设备的装置”。

国内学术界的定义更为具体一些,也更容易理解:

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

以应用为中心,说明嵌入式系统是有明确实际用途的。以计算机技术为基础,说明它其实就是一种特殊的计算机。软硬件可裁剪,说明它有很强的灵活性和可定制能力。

专用计算机系统,“专用”所对应的,就是“通用”。我们常用的个人PC、笔记本电脑、数据中心服务器,可以用于多种用途,就是“通用计算机系统”。

嵌入式系统究竟具体应用于哪些“专用”方向呢?

举例如下:

  • 个人通信与娱乐系统:手机、数码相机、音乐播放器、可穿戴电子产品、PSP游戏机
  • 家电类产品:数字电视、扫地机器人、智能家电
  • 办公自动化:打印机,复印机、传真机
  • 医疗电子类产品:生化分析仪、血液分析仪、CT
  • 网络通信类产品:通信类交换设备、网络设备(交换机、路由器、网络安全)
  • 汽车电子类产品:引擎控制、安全系统、汽车导航与娱乐系统
  • 工业控制类产品:工控机、交互式终端(POS、ATM)、安全监控、数据采集与传输、仪器仪表
  • 军事及航天类产品:无人机、雷达、作战机器人

▲嵌入式系统的应用领域

上述这些领域,都使用了嵌入式系统。这还只是冰山一角。

可以说,嵌入式系统完完全全地包围了我们,时刻影响着我们的工作和生活。

嵌入式系统,既然是一个计算机系统,那么肯定离不开硬件和软件。

一个嵌入式系统的典型架构如下:

▲注意,最重要的就是嵌入式操作系统和嵌入式微处理器。

从硬件角度来看,嵌入式系统就是以处理器(CPU)为核心,依靠总线(Bus)进行连接的多模块系统:

▲和个人PC是一样的方式

下面这张图,就是一个嵌入式系统的实物样例:

中间偏左上角,S3C2440,是CPU,中间是RAM,然后还有ROM、网卡、串口、电源等等。可以看出,嵌入式系统麻雀虽小,五脏俱全。

什么是单片机

嵌入式系统的核心,就是嵌入式处理器。嵌入式处理器一般分为以下几种典型类型:

嵌入式微控制器MCU(Micro Control Unit)

MCU内部集成ROM/RAM、总线逻辑、定时/计数器、看门狗、I/O、串口、A/D、D/A、FLASH等。典型代表是8051、8096、C8051F等。

嵌入式DSP处理器(Digital Signal Processor)

DSP处理器专门用于信号处理,在系统结构和指令算法进行了特殊设计。在数字滤波、FFT、频谱分析中广泛应用。典型代表是TI(德州仪器)公司的TMS320C2000/C5000系列。

嵌入式微处理器MPU(Micro Processor Unit)

MPU由通用处理器演变而来,具有较高的性能,拥有丰富的外围部件接口。典型代表是AM186/88、386EX、SC-400、PowerPC、MIPS、ARM系列等。

此外,还有嵌入式片上系统SoC(System on Chip)和可编程片上系统SoPC(System on a Programmable Chip)。

我们的单片机,就属于上述的第一种——MCU(嵌入式微控制器)。

我们来详细介绍一下它。

单片机,又称为单片微控制器,英文叫Single-Chip Microcomputer。

它其实就是一种集成电路芯片,是通过超大规模集成电路技术,将CPU、RAM、ROM、输入输出和中断系统、定时器/计数器等功能,塞进一块硅片上,变成一个超小型的计算机。

这么说来,单片机不就是一个嵌入式系统?别急,我们往下看。

“单片机”其实是一种古老的叫法。以前半导体工艺技术不成熟,不同的功能无法做进一个芯片(Chip),所以会有多片机。现在半导体技术早已非常发达,所以不存在多片机。但是,“单片机”的叫法却一直延用至今。

很多高校老师喜欢强调单片机姓“单”,除了指单片机只是一个硅片之外,更多是指单片机的功能单一,它是完成运算、逻辑控制、通信等功能的单一模块。即便它性能再强大,功能依然是单一的。

单片机技术从上世纪70年代末诞生,早期的时候是4位,后来发展为8位,16位,32位。它真正崛起,是在8位时代。8位单片机功能很强,被广泛应用于工业控制、仪器仪表、家电汽车等领域。

我们在研究单片机的时候,经常会听到两个词——51单片机、STM32。我来介绍一下它们究竟是什么。

51单片机,其实就是一系列单片机的统称。该系列单片机,兼容Intel 8031指令系统。它们的始祖,是Intel(英特尔)的8004单片机。

注意,51单片机并不全是英特尔公司的产品。包括ATMEL(艾德梅尔)、Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)、STC(国产宏晶)等公司,也有很多产品属于51单片机系列。

▲ATMEL公司的51单片机,AT89C51

▲这是一个51单片机的开发板,中间那个芯片才是51单片机

51单片机曾经在很长时间里都是市面上最主流、应用最广泛的单片机,占据大量的市场份额。

51单片机其实放在现在毫无技术优势,是一种很老的技术。之所以它的生命力顽强,除了它曾经很流行之外,还有一个原因,就是英特尔公司彻底开放了51内核的版权。

所以,无论任何单位或个人,都可以毫无顾忌地使用51单片机,不用付费,也不用担心版权风险。

此外,51单片机拥有雄厚的存量基础和群众基础。很多老项目都是用的51单片机,出于成本的考虑,有时候只能继续沿用51单片机的技术进行升级。而且,很多老一辈的工程师,都精通51单片机开发技术。所以,51单片机的生命力得以不断延续。

再来看看STM32。

STM32,是意法半导体公司推出的基于ARM Cortex-M内核的通用型单片机。

▲STM32单片机

意法半导体(STMicroelectronics)是世界最大的半导体公司之一,于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。

▲意法半导体LOGO

ARM公司以前小枣君给大家介绍过。它是目前全球做芯片设计最厉害的公司之一,利用手机芯片的快速发展而崛起,占有物联网市场极大的份额。

在单片机领域,ARM的Cortex-M内核拥有压倒性的优势,已经成为绝对的主流。很多半导体公司都放弃了自己原先的架构,转做ARM架构的单片机。

▲STM32单片机开发板

STM32的硬件配置可以满足大部分的物联网开发需求,开发工具和相关的文档资料齐全,已经成为目前单片机学习的首选对象。

嵌入式和单片机的区别

说到这里,我们来看看,嵌入式和单片机的区别到底是什么。

从前文的介绍来看,嵌入式系统是一个大类,单片机是其中一个重要的子类。嵌入式系统像是一个完整的计算机,而单片机更像是一个没有外设的计算机。

以前单片机包括的东西并不算多,两者的硬件区别较为明显。但是,随着半导体技术的突飞猛进,现在各种硬件功能都能被做进单片机之中。所以,嵌入式系统和单片机之间的硬件区别越来越小,分界线也越来越模糊。

于是,人们倾向于在软件上进行区分。

从软件上,行业里经常把芯片中不带MMU(memory management unit,内存管理单元)从而不支持虚拟地址,只能裸奔或运行RTOS(实时操作系统,例如ucos、华为LiteOS、RT-Thread、freertos等)的system,叫做单片机(如STM32、NXP LPC系列、NXP imxRT1052系列等)。而把芯片自带MMU可以支持虚拟地址,能够跑Linux、Vxworks、WinCE、Android这样的“高级”操作系统的system,叫做嵌入式

在某些时候,单片机本身已经足够强大,可以作为嵌入式系统使用。它的成本更低,开发和维护的难度相对较小,尤其是针对一些针对性更强的应用。而嵌入式系统理论上性能更强,应用更广泛,但复杂度高,开发难度大。

嵌入式和单片机的学习价值

最后我们来说一说嵌入式和单片机的学习价值,到底有没有必要学习嵌入式和单片机。

最近这些年,有一句话被广泛传播,那就是——“软件为王”。人们普遍认为软件知识的价值远远大于硬件,而学习软件,从事软件方向,会更容易找到工作,找到更高收入、更有前途的工作。

而嵌入式和单片机,往往被归为“硬件”方向,遭人“嫌弃”。加上嵌入式和单片机的学习难度较大,学习周期很长,需要漫长的“煎熬”,所以越来越多的人放弃这条路。

小枣君认为这种想法是不正确的。

首先,嵌入式和单片机并不是纯“硬件”类方向。前面我也说了,它们是软件和硬件的紧密结合。

如果你想学好嵌入式和单片机,只懂数字电路和微机接口这样的硬件知识是不够的,你更需要学习的,是汇编、C/C++语言、数据结构和算法知识。

拥有软硬结合的能力,远远比单纯掌握某种程序开发语言更有价值。

其次,嵌入式和单片机拥有广泛的应用场景,在各个领域都有项目需求和人才需求。

根据权威部门统计,目前我们国家每年的嵌入式人才缺口高达50万。尤其是嵌入式软件开发,是未来几年最热门和最受欢迎的职业之一。具有10年工作经验的高级嵌入式工程师,年薪可以达到30-50万元左右。

而且我们国家现在正在大力发展芯片产业,也会带动嵌入式人才的就业,提升待遇。

随着5G的全面启动,整个社会正在向“万物互联”的方向发展。物联网技术也将迎来前所未有的历史机遇。嵌入式和单片机技术是物联网技术的重要组成部分,也将进入发展的快车道。

因此,尽管学习过程会比较艰辛,仍然建议有志青年关注这一赛道。技术越难,过程越苦,越有利于构建竞争壁垒。到了后期,个人价值可以得到进一步的体现。


想要弄清楚嵌入式和单片机有什么联系,首先就要弄明白什么是嵌入式,什么是单片机。今天四强科技针对这些问题整理了一篇文章,希望能够加深大家对单片机和嵌入式之间的理解。

一、什么是嵌入式

根据历史的、本质性的、普遍性的要求,嵌入式系统应该定义为:“嵌入在对象系统中的专用计算机系统”。嵌入式、专用式和计算机系统是构成嵌入式系统三大基本元素。对像系统是指嵌入嵌入式系统的主机系统。

嵌入式系统特点:

  • 可裁剪性。支持开放性和可伸缩性的体系结构。
  • 强实时性。EOS实时性一般较强,可用于各种设备控制中。
  • 统一的接口。提供设备统一的驱动接口。
  • 操作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。
  • 强稳定性,弱交互性。嵌入系统在运行过程中不需要太多用户干预,而 EOS系统要对其进行管理,具有较强的稳定性。嵌入操作系统的用户界面一般不提供操作命令,它通过系统的调用命令为用户程序提供服务。
  • 代码固化。嵌入系统的 ROM中,嵌入式操作系统和应用软件都是固化在嵌入式系统的 ROM上。
  • 嵌入式系统与具体应用有机地结合,其升级换代也与具体产品同步进行,所以嵌入式系统产品一旦进入市场,其生命周期也很长。

二、什么是单片机

一般我们将单片微型计算机简称为单片机,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。是一种典型的嵌入式微控制器。

单片机硬件特性

  • 主流单片机包括CPU、4KB容量的RAM、128 KB容量的ROM、 2个16位定时/计数器、4个8位并行口、全双工串口行口、ADC/DAC、SPI、I2C、ISP、IAP。
  • 系统结构简单,使用方便,实现模块化;
  • 单片机可靠性高,可工作到10^6 ~10^7小时无故障;
  • 处理功能强,速度快。
  • 低电压,低功耗,便于生产便携式产品6、控制功能强7、环境适应能力强

三、嵌入式和单片机的区别

  • 单片机与嵌入式在系统组成结构上的区别:单片机由运算器、控制器、存储器、输入输出设备构成。
  • 嵌入式系统成部分:嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、特定的应用程序组成。
    嵌入式系统设计的第一步是结合具体的应用,综合考虑系统对成本、性能、可扩展性、开发周期等各个方面的要求,确定系统的主控器件,并以之为核心搭建系统硬件平台。
  • 单片机与嵌入式在硬件组成上的区别:单片机是在一块集成电路芯片中包含了微控制器电路,以及一些通用的输入输出接口器件。从构成嵌入式系统的方式看,根据现代电子技术发展水平,嵌入式系统可以用单片机实现,也可以用其它可编程的电子器件实现。其余硬件器件根据目标应用系统的需求而定。
  • 单片机与嵌入式在软件组成上的区别:厂家出货的通用单片机中没有应用程序,因此无法直接运行。在加入应用后,可独立运行单片机。嵌入系统必须有控制软件,控制逻辑的实现方式可以完全使用硬件电路,或者使用软件程序。
  • 单片机与嵌入式在主次关系方面的:区别目前,单片机已被视为通用电子设备,以单片机本身为主体。嵌入系统以物理结构关系为主,嵌入式系统被嵌入于目标应用系统中。而嵌入式系统则以控制关系为主,是控制目标应用系统运行的逻辑处理系统。虽然嵌入式系统的组成方式可能有所不同,但组成嵌入式系统后,它就是一个专门的系统。在专用系统中,可编程设备软件可植入系统构造阶段或直接在器件制造过程中产生,以降低制造成本。控制论中复杂的控制逻辑需要操作系统软件的支持;简单控制逻辑的嵌入式系统也可以没有操作系统软件。
  • 单片机与嵌入式系统的联系:嵌入系统是一种用于控制和监控诸如机器、设备、工厂等大型系统的设备。由定义上来看,实际上,先前的控制设备、单片机系统都应属于嵌入式系统的范畴。嵌入式系统是一个很大的类别,单片机就是其中的一个重要子类。顾名思义,嵌入式系统就是嵌入在其它系统中的系统。比如,在汽车系统中嵌入了姿态控制系统,可以使驾驶汽车更加安全和高效;在电源系统中引入自动控制系统,使电源工作更加平稳。姿态控制系统与电源自控系统都属于嵌入式系统。

单片微机系统一般是用于自动化、工业控制功能的,这些功能一般不会单独使用,而是需要与其它系统协同使用,所以从广义上说,单片机应用通常属于嵌入式系统的一个分支。现在嵌入式系统应用很广,所以没有单片机的嵌入式系统,比如手机,就是在手机的基本功能(电话、短信)中加入了应用处理器,使得它的功能更加强大,但由于制造工艺的问题,手机无法做到全部一片集成(电话、短信)。

四、51单片机和STM32单片机

如果在几年前,你说没听过单片机那很正常,如果放到今天,你没听过,那只能说你有点落伍了。

因为你每天接触单片机的应用,比接触你女朋友还多。

比如说家里的电饭煲、冰箱、空调、洗衣机,去上班路上的公交地铁闸口、共享单车、到公司用的鼠标、键盘、咖啡机等等。

1.单片机到底是什么?

单片机其实就是一个芯片。

这个芯片它有一些特性,比如说可编程,也就是可以写程序下载到芯片里面去,有点类似电脑cpu的感觉。

大家也可以理解成是拼多多版的CPU,这里指的是性能,稳定性还是妥妥的。

单片机一般是用来做带智能控制的电子产品的,不同的电子产品由不同的程序搭配不同的电路完成。

所以,单片机的应用可以说是铺天盖地,随处可见。

再加上最近几年,在物联网的赋能之下,单片机应用场景更加丰富智能,比如智能家居、车联网、共享单车、共享充电宝、充电桩等等。

我从事了这个行业10年,这两年感觉这个行业趋势也越来越猛,最直接的体现就是工资涨幅。

还有就是最近有几个企业也找到我们无际单片机编程,问有没有学员介绍到他们公司做开发。

在未来,随着5G和物联网技术不断成熟,我相信发展会更好。

2.51单片机和stm32有什么区别?

51单片机和stm32就是单车和摩托车的区别,同样都是单片机,STM32的性能比51单片机强悍很多。

比如说内存大小、频率、封装引脚等等都不同。

我们不妨来看一下两者芯片内部的资源。

51单片机内部资源:

STM32单片机内部资源:

可能你看起来有点烧脑,也看不懂,没关系,都是正常的现象。

等你学会了以后,再去理解就简单了,这里就不做过多的介绍了。

3.入门选哪个单片机最好?

新手入门的话我建议是先学习51单片机,比较简单,比较适合系统去学习。

单片机是需要c语言编程,这块可以去看无际单片机编程的那个单片机c语言编程,这样就不用自己去规划学习内容和顺序,直接每节课按顺序学就行了。

在以前很多单片机都是用汇编来编写程序的,但是由于汇编写的代码很难维护,也很难移植,所以现在主流还是用C语言。

我们只需要学习一门语言就够了,不需要把汇编和C语言全学。

单片机开发是一门偏向实战的技术,我们在学习的过程中必须要配套开发板去学习。


51单片机是对所有兼容Intel 8031指令系统的单片机的统称。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。

两者的主要区别如下:

1、内核:**51单片机采用的是51 Core,8Bit@2MHz Max(分频后),0.06DMIPS;STM32采用的是ARM Cortex-M3,32Bit@72MHz ,1.25DMIPS

2、地址空间:**51单片机只有64KB;STM32有4GB

3、片上储存器:**51单片机ROM只有2K-64K,RAM仅为128B-1K;STM32的ROM为20K-1MB,RAM有8K-256K

4、外设:**51单片机仅有三个定时器和一个串口;STM32却拥有AD,DA,Timer,WWDG,IWDG,CRC,DMA,IIC,SPI,USART等众多外设

5、开发工具:**51单片机采用的是早期的UV2;而STM32使用的是UV4,甚至更高

6、操作系统:**51单片机连RTOS都很难能跑;STM32采用的是uClinux,uC/OS

总的来说51有51的轻巧 ,STM32有STM32的强大。 首先51是入门最简单, 相对来说好学, 功能少 ,控制比较方便。但是速度 、功能都没有STM32强大 ,STM32是32bit的, 外围接口丰富, 但是入门就有点难度了。 再就是51的速度能快点 ,但是毕竟是8bit的, 51大多是冯诺依曼结构 ,STM32是哈弗结构的, 数据处理起来很快。

五、有无操作系统的区别,程序启动流程

我们知道,一般51单片机是没有操作系统的,有的STM32单片机可以移植实时操作系统(RTOS),单片机有无操作系统有什么区别,有无操作系统的程序启动流程有什么区别。

单片机有无操作系统有什么区别

随着通信、电子物联网的飞速发展,每天都有各种各样的芯片被研发出来,而要想知道这些芯片怎样工作以及工作后的作用,则离不开软硬件工程师的努力,任何一个计算机系统都是系统中软硬件协作的结果,没有硬件的软件是空中楼阁,没有软件的硬件是一堆废铁,硬件是软件运行的基础。软件上所有操作最终都会被硬件以硬件工作的时序进行工作,硬件建造出来是固定的,而软件则很灵活,可以根据场景适应多种应用,两者相辅相成,缺一不可。

​ 设备驱动,顾名思义就是"驱使硬件设备行动",设备驱动直接与硬件打交道,按照硬件datasheet要求的方式上下电、读写寄存器、中断处理、通信、DMA搬运等等。驱动充当着硬件和应用之间的桥梁,所以驱动有时候既要和硬件工程师沟通设备的运行方式,又要和应用工程师讨论调用方法。

一、无操作系统

在早期的软件中,程序不在复杂的情况下工作比较单一,控制着不太复杂的系统,例如食堂刷卡机、公交刷卡机、微波炉、冰箱等,功能都比较简单,并不需要多任务调度、文件系统、内存管理等复杂功能,单任务架构完全可以很好地支持它们的工作。可能一个无限循环加上按键、中断的处理就能完成功能设计。在这种情况下,应用和驱动分割的不是那么清楚,一般可能就是一个人完成了应用和驱动,每种芯片可能根据工作方式写了一组接口,比如A芯片读寄存器AreadReg,B芯片读寄存器BreadReg,应用需要根据芯片使用进行接口调用,在这种情况下,设备驱动的接口被直接提交给了应用软件工程师, 应用软件没有跨越任何层次就直接访问了设备驱动的接口。 设备驱动包含的接口函数也与硬件的功能直接吻合, 没有任何附加功能。甚至把应用和驱动写在同一文件中,不符合软件设计的高内聚低耦合的要求。

二、有操作系统

嵌入式开发中操作系统并不总是必须的,因为程序完全可以在裸板上运行。尽管如此,但对于复杂的系统,为使其具有任务管理、定时器管理、存储器管理、资源管理、事件管理、消息管理、队列管理和中断处理的能力,提供多任务处理,更好地分配系统资源的功能,很有必要针对特定的硬件平台和实际应用移植操作系统。Linux操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小、可裁减、运行速度高、良好的网络性能等优点,可以作为嵌入式操作系统。

不管有无操作系统,设备驱动都是必须的,有了操作系统后,驱动程序需要融入到内核,应用和驱动直接的纽带是固定的,驱动工程师需要按照操作系统规定的接口进行设计,所以存在操作系统时,驱动变成了硬件和内核直接的桥梁,它对外呈现的是统一的接口,例如:write()、read()、驱动程序有Aread()、Bread(),操作系统会根据实际使用的设备调用相应的驱动,不用每次都重新匹配,应用工程师也完全不必关心硬件变化。

有了操作系统后,驱动会变得稍显复杂,但是和它能带来的好处而且无足轻重,不用关心内存管理、文件系统管理等等,更加高效、快速、方便的管理嵌入式硬件的有限资源,能完成很复杂的的控制,并且对于应用开发来说十分方便。

当然,要根据实际情况去选择是否需要操作系统,比较简单的单任务环境中,就完全没有必要了。

在8位或16位嵌入式系统应用中,由于CPU资源量比较少,任务比较简单,程序员可以在应用程序中管理CPU资源,而不一定要专用的系统软件。如果嵌入式系统比较复杂并且采用32位CPU时,情况就完全不同了。32位CPU的资源量非常大,处理能力也非常强大,如果还是采用手工编制CPU的管理程序,面对复杂的应用,很难发挥出32位CPU的处理能力,并且程序也不可靠。
举个例子:我们平时用的电脑,有比较丰富的外设资源,如果不使用操作系统,你自己用开发工具从底层开始写程序,搞个一年半载的,或许也可以让电脑跑起来,在显示器上搞个类似的windows界面。然而,如此的裸程序根本无法让PC机发挥出强大的处理能力,要想在已有的程序上加个应用功能,必须要熟悉其余程序的流程,或许还要去熟悉硬件知识,看硬件的datasheet。如果想移植到另外一台配置不同的电脑上,估计大部分程序都得推倒重来!

从我目前的认知水平来看,我觉得在嵌入式上使用操作系统有两个方面的好处:

1、操作系统的一个强项就是它可以使应用程序编码在很大程度上与目标板的硬件和结构无关。使程序员可以将尽可能多的精力放在应用程序本身,而不不必去关心系统资源的管理。

2、使系统开发变得简单,缩短开发周期。使应用系统更加健壮、高效、可靠。
当然,对于很简单的单片机应用,大可不必去跑操作系统。操作系统虽然听起来很好,很强大,但不论什么东西都往上移植的话就显得很傻、很天真了。


嵌入式/单片机有哪些操作系统

单片机上的操作系统和我们平常使用操作系统(MacOs、Windows、Android、IOS)不同。

常见嵌入式/单片机操作系统可以参考这篇博客:与嵌入式RTOS大不同,主流物联网操作系统中哪款适合你?


关于单片机程序运行的一些理解

参考于:https://blog.csdn.net/c12345423/article/details/53045863

关于程序的执行,以前想的不多,没有意识到一个程序在运行时,从哪里读指令,数据又写在哪里。

最近在看CSAPP时这个念头经常在脑袋中晃荡。

从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多,很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。这一点看,它们在流程上是很相似的。

如果是系统上的程序启动呢?它们是由系统来决定的。Linux上在shell下输入./p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设他是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然这里边还有内存映射,虚拟内存,连接与加载,等一些其他东西),准备执行。

由以上可知,单片机上的程序和平时在系统上运行的程序,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的)。因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。

由此,以前的一些疑惑也就解开了。为什么在单片机上的程序不怎么使用malloc,而PC上经常使用?因为单片机上没有已经写好的内存管理算法的代码,而在PC上操作系统里运行的程序,libc已经把这些都做了,只需要调用就可以了。如果在单片机上想用动态内存,也可以,但是这些代码要自己去实现,并定义一个相应的malloc,有时候一些公司会给提供一些库函数可能会实现malloc,但是因为单片机上RAM内存十分有限,如果不知道它的运行方式,估计会很危险。同样,因为在PC的系统上运行的程序与逻机程序的不同,裸机程序不会有动态链接,有的只是静态链接。

关于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是单片机上只有几K的RAM,而flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗(这里指的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存)?这不可能,因为课上老师只说内存,但是PC上内存一般就是DDR RAM,不会是硬盘,硬盘是保存数据的地方;由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以现在CPU工作频率最快是在2003左右。一个瓶颈出现了。为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)存放代码,只读数据段。本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写(当然现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM,一个Flash低,更节省成本,对于生产商更划算)。

对于单片机的程序执行时指令和数据的存放与读取,理解如下:
对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。
无论是单片机也好,PC也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。

注:参见《ram,rom and flash》


片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行,即取指令-----分析指令-----执行指令。

取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。

分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。

计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。

下面我们将举个实例来说明指令的执行过程:

开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。

例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:

1、程序计数器的内容(这时是0000H)送到地址寄存器;

2、程序计数器的内容自动加1(变为0001H);

3、地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;

4、CPU使读控制线有效;

5、在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。

至此,取指阶段完成,进入译码分析和执行指令阶段。

由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。

指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。


带操作系统的嵌入式系统的启动过程

一. 引言:
对于PC机,其开机后的初始化处理器配置、硬件初始化等操作是由BIOS(Basic Input /Output System)完成的,但对于嵌入式系统来说,出于经济性、价格方面的考虑一般不配置BIOS,因此我们必须自行编写完成这些工作的程序,这就是所需要的开机程序。而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序,启动时用于完成初始化操作的这段代码被称为Bootloader程序,因此整个系统的加载启动任务就完全由Bootloader 来完成。简单地说,通过这段程序,可以初始化硬件设备、建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境设定在一个合适的状态,以便为最终调用操作系统内核、运行用户应用程序准备好正确的环境。Bootloader依赖于实际的硬件和应用环境,因此要为嵌入式系统建立一个通用、标准的Bootloader是非常困难的。Bootloader也依赖于具体的嵌入式板级设备的配置,这也就是说,对于两块不同的嵌入式主板而言,即使它们是基于同一 CPU 而构建,要想让运行在一块板子上的 Bootloader 程序也能运行在另一块板子上,通常都需要修改 Bootloader 的源程序。

二. 启动流程
系统加电复位后,几乎所有的 CPU都从由复位地址上取指令。比如,基于 ARM7TDMI内核的CPU在复位时通常都从地址 0x00000000处取它的第一条指令。而以微处理器为核心的嵌入式系统通常都有某种类型的固态存储设备(比如EEPROM、FLASH等)被映射到这个预先设置好的地址上。因此在系统加电复位后,处理器将首先执行存放在复位地址处的程序。通过集成开发环境可以将Bootloader定位在复位地址开始的存储空间内,因此Bootloader是系统加电后、操作系统内核或用户应用程序运行之前,首先必须运行的一段程序代码。对于嵌入式系统来说,有的使用操作系统,也有的不使用操作系统,比如功能简单仅包括应用程序的系统,但在系统启动时都必须执行Bootloader,为系统运行准备好软硬件运行环境。
系统的启动通常有两种方式,一种是可以直接从Flash启动,另一种是可以将压缩的内存映像文件从Flash(为节省Flash资源、提高速度)中复制、解压到RAM,再从RAM启动。当电源打开时,一般的系统会去执行ROM(应用较多的是Flash)里面的启动代码。这些代码是用汇编语言编写的,其主要作用在于初始化CPU和板上的必备硬件如内存、中断控制器等。有时候用户还必须根据自己板子的硬件资源情况做适当的调整与修改。
系统启动代码完成基本软硬件环境初始化后,对于有操作系统的情况下,启动操作系统、启动内存管理、任务调度、加载驱动程序等,最后执行应用程序或等待用户命令;对于没有操作系统的系统直接执行应用程序或等待用户命令。
启动代码是用来初始化电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言,在商业实时操作系统中,启动代码部分一般被称为板级支持包,英文缩写为BSP。它的主要功能就是:电路初始化和为高级语言编写的软件运行做准备。系统启动流程如图1所示,主要的过程如下:

  1. 启动代码的第一步是设置中断和异常向量。

  2. 完成系统启动所必须的最小配置,某些处理器芯片包含一个或几个全局寄存器,这些寄存器必须在系统启动的最初进行配置。

  3. 设置看门狗,用户设计的部分外围电路如果必须在系统启动时初始化,就可以放在这一步。

  4. 配置系统所使用的存储器,包括Flash,SRAM和DRAM等,并为他们分配地址空间。如果系统使用了DRAM或其它外设,就需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息,初始化存储器系统。有些芯片可通过寄存器编程初始化存储器系统,而对于较复杂系统通常集成有MMU来管理内存空间。

  5. 为处理器的每个工作模式设置栈指针,ARM处理器有多种工作模式,每种工作模式都需要设置单独的栈空间。

  6. 变量初始化,这里的变量指的是在软件中定义的已经赋好初值的全局变量,启动过程中需要将这部分变量从只读区域,也就是Flash拷贝到读写区域中,因为这部分变量的值在软件运行时有可能重新赋值。还有一种变量不需要处理,就是已经赋好初值的静态全局变量,这部分变量在软件运行过程中不会改变,因此可以直接固化在只读的Flash或EEPROM中。

  7. 数据区准备,对于软件中所有未赋初值的全局变量,启动过程中需要将这部分变量所在区域全部清零。

  8. 最后一步是调用高级语言入口函数,比如main函数等。

六、嵌入式学习路线,单片机学习路线?到底该怎么学

嵌入式学习路线,在这里指的是有关嵌入式软件开发相关的学习路线,当然还有嵌入式硬件和嵌入式驱动开发。在嵌入式单片机领域,以时间的发展、系统的复杂度和学习的难度角度来看,51单片机->STM32单片机->嵌入式ARM+Linux是一个正常的学习路线。因此很多人就会问我可不可以不学51单片机直接学STM32,我可不可以不学STM32直接学嵌入式Linux。但以我现在的看法来说,我们最好还是安装正常的学习路线一路学下来,这样可以让我们熟悉一些基础知识。

下面就如何学习嵌入式说下我个人的看法。

嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统

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

从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。嵌入式系统作为装置或设备的一部分,它是一个控制程序存储在ROM中的嵌入式处理器控制板

事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。

嵌入式方向

嵌入式工程师需要掌握的内容非常广泛,主要包括嵌入式软件、嵌入式硬件、以及相关行业、产品的专业知识。作为嵌入式初学者,我们不可能,也没有那么多精力把所有的知识到搞的很精通,我们要学会抓住重点,学会取舍,达到一通百通,事半功倍的学习效果
首先嵌入式技术主要分为嵌入式软件和嵌入式硬件两大方向。

嵌入式硬件方向

嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件PCB板,选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力

因为现在集成电路发展迅速,大部分集成电路厂商都会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要体现在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在

要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU、多层PCB板的设计经验

嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析

嵌入式软件方向

嵌入式软件工程师的职责主要是根据产品的功能需求设计好软件,让硬件工作起来

嵌入式电子产品硬件部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 几大部分组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,一般来讲一个产品的实现,软件设计的工作量是硬件设计的4 ~ 5倍

所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的4~5倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些,所以这里我重点和大家谈一下嵌入式软件工程的学习路线。

学习嵌入式需要那些内容?

C语言

C语言是嵌入式的重中之重,Linux操作系统就是用C实现的,包括安卓系统的底层也是C语言实现的,基础不牢,地动山摇,一定要打好基础。

C语言学习过程中重点要放在指针,结构体,文件的处理,数组等。在学习过程中,一定要多写代码代码光看是看不会的

遇到错误不要怕麻烦,善于使用搜索工具,百度,google,stack overflow。要知道,你遇到的问题别人肯定也会遇到过,一般在网上一搜就会有答案。

最后,要多调试程序,熟悉调试的过程。程序三分写,七分调,没有谁的程序是可以一遍写对的。而且,多调试程序也可以让我们理解程序具体是如何执行的。

基本的硬件原理

嵌入式肯定要和硬件打交道的。如果做嵌入式的应用层的话,可能和硬件接触的少一点。但是很多企业在面试的时候,也会问一些基本的硬件知识。

比如,我同学在面试联发科的C++工程师的时候,就问到了他很多关于硬件的知识(中断是什么,轮询是什么,二者有什么区别,一个基本嵌入式系统有什么构成等),所以说硬件知识知道越多越好,就算做应用层,一些最基本的也要知道。

如果是打算做嵌入式底层的话,对于硬件知识的掌握要求就比较高了。比如,LCD是如何显示的,IIC协议/SPI协议是什么,如何收发数据,不同设备对于IIC的速度有什么要求,IIC协议上拉电阻一般是多少等等。只有明白了硬件原理,在看芯片手册的时候才能明白如何去配置各个寄存器。

此外,常用的设备仪器的使用能掌握就更好了,和硬件工程师扯皮的时候会用到。比如,万用表,示波器,逻辑分析仪等。不会也没关系,这部分不是必须的。

数据结构与算法

这部分是程序员的必修课。在各大厂的秋招春招中,笔试面试都是必考的。常见的数据结构如链表,二叉树,堆,队列,常见排序算法及其改进(快排,归并,冒泡,插入)等都是要掌握的。如果是为了找工作,这部分内容有很多是要能达到手写的目的。(相关内容见我整理的嵌入式软件工程师笔试面试指南

虽然嵌入式对于数据结构与算法的要求不像传统互联网那么高,而且,这些数据结构在以后的工作中不一定可以用到,但是一些基本的我们还是要知道的。

像Linux内核中就用到了很多的链表,二叉树等。掌握这部分内容对于我们以后跳槽,深入研究操作系统都有很大的帮助

计算机基础

这部分直接决定了我们以后是否能走的更远,像操作系统的基本概念,计算机组成原理的内容都是需要我们去了解的。比如自旋锁,信号量,阻塞与非阻塞等。

学习任何技术一定要学到这门技术的边界,对于嵌入式来讲,它的边界就是汇编。汇编语言不要求会写,但是一定要能看懂(其实就是Arm指令集)。在很多情况下,看反汇编文件对于bug的调试会更方便

学习路线推荐

入门:51+STM32

主要学习内容

中断、定时器、串口、NAND FLASH、网络控制器、LCD屏、触摸屏等的工作原理。

学习资源推荐

视频:野火,正点原子

书籍:野火,正点原子

学习建议

如果你以后的方向是驱动开发,这部分学习的话重点放在硬件知识的理解。买个开发板,学习下他们的例程是如何写的,常用嵌入式外围设备的硬件工作原理,以及如何使用C语言来编程、控制这些硬件。把基本的外设都学习一遍,不求都会写,但是硬件原理一定要搞清楚

进阶:ARM-A+Linux

这部分主要分为两个方向:Linux应用开发,Linux驱动开发。下面我会对这两个方向分别进行说明。

有了之前的单片机基础,上手Linux开发就会快一点。可以买个ARM-A内核的开发板,ARM-A和stm32很多地方都是相通的,理解起来不难,二者最大的差别在于开发环境,很多新手入门Linux开发在搭建环境时就被劝退了。学习ARM-A前可以先看下 《ARM体系结构与编程》,再去看韦老师视频的话会理解快一点,视频中讲到的难理解的这里基本都有。

推荐一个 github仓库,上面放了上百本经典的嵌入式,计算机书籍,可以star一下,下次找书直接在上面搜索就可以了

github 书籍宝藏仓库

github访问不了可以访问这个:gitee 书籍宝藏仓库

应用开发

主要学习内容

Linux系统调用概念,多进程,多线程实现多任务开发,多任务的同步互斥开发:互斥锁、信号量,网络数据通信过程,TCP/IP协议,Socket编程、TCP网络编程、UDP网络编程,QT编程。

学习资源推荐

书籍:《Unix环境高级编程》,《Unix网络编程》,《Qt Creator快速入门》

视频:这部分视频没看过,可以在哔哩哔哩搜索下,找播放量高的就可以。

驱动开发

主要学习内容

Bootloader的工作流程、UBOOT的编译、裁剪与移植、Linux内核的编译、裁剪与移植,根文件系统的构建、BootLoader、内核和根文件系统的烧写。

重点驱动框架如:字符设备驱动、块设备驱动、LCD设备驱动、触摸屏设备驱动,总线设备驱动模型,输入子系统模型等。

学习资源推荐

书籍:《Linux设备驱动开发详解》《Linux设备驱动程序》

视频:强烈推荐韦东山老师!!

学习建议

对照视频一点一点学习的过程中,刚开始第一遍看的话会有很多地方不明白,不要紧。如果在查阅了一些资料后还是不明白,可以先往后放放,不用深究。内核的许多东西一旦深究起来,越陷越深。

作为初学者,学习驱动开发主要学习驱动的框架(比如,输入子系统模型常用的一个函数input_attach_handler()这个函数,刚开始我们只需要知道他是用来匹配dev设备和驱动软件就可以,暂时可以不用知道这个函数内部是如何实现的)。有一定基础之后,可以再去深究其中的某个点,思考他们为什么这么写。

大神:各类复杂驱动

一般自学能到第二个阶段就已经相当不错了。复杂驱动部分一般是在工作中学习的。像Android驱动,音视频驱动,usb驱动,wifi,蓝牙协议,内核开发等都是比较深入一点的东西了,随便拿出一块内容,深入钻研下都可以成为这个领域的专家。

学习资源推荐

书籍:这部分方向很多,我自己对很多方向也不了解。分享几本不错的内核书籍,《Linux内核设计与实现》《深入理解LINUX内核》《深入Linux内核架构》

视频:哔哩哔哩搜索【Linux内核精讲】

总结

  1. 在学习的过程中,我们应该抓住不变的东西,考虑下这些不变的内容是否对我们以后掌握变化的东西有帮助
  2. 不管是学习任何技术,一定要学到这门技术的边界。对于嵌入式开发来讲,汇编,这就是软件的边界
  3. 经常会在往上看到有人讨论,嵌入式有35岁危机吗?不能说没有,只能说压力相比于互联网可能会小点。
  4. 嵌入式相对于互联网来讲,技术的更新迭代没有那么快。如果能在嵌入式某个领域深入研究,建立起技术的护城河,或许职业生涯会长一点。
  5. 聪明,好奇,协作,忠诚,随遇而安。

https://aijishu.com/a/1060000000247839

上面这些只是一个学习路线的总览,后续我也会不断完善充实每一个阶段的学习路线,学习方法,学习资料以及我的学习过程。

七、学习资料及开发板

学习无操作系统的单片机,一般只是我们学习过程中的一个起点,随着应用复杂度和需求的不断变化,未来的嵌入式开发都会逐渐转向带操作系统的开发。

触动我整理这篇文章的一个文档是来自国产实时操作系统RT-Thread的文档,觉得内容非常的不错,因此也产生了一个想法:系统的学习嵌入式/单片机开发。

RT-Thread的文档链接:https://www.rt-thread.org/document/site/#/

然后在B站的推送中找到了几个不错的学习资料:

51单片机入门教程-2020版 程序全程纯手打 从零开始入门

STM32入门教程-2022持续更新中

铁头山羊STM32(寒假训练营)

这些教程都是主要在讲无操作系统的单片机开发,因此主要关注的内容是硬件知识,而这对于我这种没有硬件知识基础的人来说还是非常有用的。

当然后面会整理一些相关的文章来记录一下学习过程。

开发板的话,应该后面等再了解一点之后买一个来玩玩。

八、嵌入式单片机开发常用的IDE

推荐一篇文章:https://mp.weixin.qq.com/s?__biz=MzUxNjgxMDE4OQ%3D%3D&idx=1&mid=2247489906&scene=21&sn=3ea2faaef085413eb985ef0577607318#wechat_redirect

IDE:Integrated Development Environment,集成开发环境。

IDE指用于软件开发的工具,通常包含编辑器、编译器、调试器、图形用户界面等集成多种工具的应用程序。

开发单片机的集成开发环境工具(IDE)有很多,下面给大家罗列一些常用的IDE,包含:

  • “通用”IDE
  • “专用”IDE
  • “搭建”IDE

“通用”IDE

通用IDE是指支持多种芯片的一种IDE工具,比如:支持STM32xx、 GD32xx、LPC18xx、 PIC32xx等各种不同厂家的单片机。

1.Keil

开发单片机一代经典的集成开发环境,非Keil莫属,Keil支持市面上绝大部分常见单片机的开发。

网址:

https://www.keil.com/

(公号不支持外链接,请复制链接到浏览器打开)

Keil针对不同内核分为四种不同类型的IDE:

  • Keil C51
  • Keil C166
  • Keil C251
  • Keil MDK-Arm

前不久发布了Keil Studio,或将Keil MDK 升级为 Keil Studio

更多介绍可以关注公众号,后台回复关键:Keil系列教程

2.IAR

IAR同样是一款经典的开发工具,和Keil类似,支持市面上大部分单片机的开发。

网址:

https://www.iar.com/

同样,针对不同类型单片机,IAR分为多种不同类型IDE:

  • IAR EWARM
  • IAR EW8051
  • IAR EWSTM8
  • IAR EWAVR32
  • IAR EWMSP430
  • IAR EWRH850
  • ······

更多介绍可以关注公众号,后台回复关键:IAR系列教程

3.Embedded Studio

Embedded Studio是一款主要针对 ARM 和 RISC-V处理器的开发环境。

网址:

https://www.segger.com/products/development-tools/embedded-studio/

同样,针对 ARM 和 RISC-V处理器分为多种两种类型IDE:

  • Embedded Studio for ARM
  • Embedded Studio for RISC-V

4.其他

通用IDE绝大部分都是收费工具(当然,也有部分免费,像Keil针对部分单片机免费使用)。

通用的开发工具还有很多,比如:Arm Development Studio、CrossWorks、 TASKING等。

“专用”IDE

专用IDE是指支持特定型号芯片/特定环境的一种IDE工具,比如:只支持STM32xx这一系列的单片机,而不支持STM32xx之外的其他单片机。

1.STM32CubeIDE

STM32CubeIDE是一款支持STM32(各大系列)的集成开发环境。

网址:

https://www.st.com/en/development-tools/stm32cubeide.html

早在2017年,ST 收购了 Atollic 公司的 TrueSTUDIO 工具,2019年推出了 STM32CubeIDE 集成开发环境(可以说是 TrueSTUDIO + STM32CubeMX的“升级版”)。

请参看文章:STM32CubeIDE下载安装,配置生成代码,在线调试

2.RT-Thread Studio

RT-Thread Studio 和 STM32CubeIDE类似,集成了 RT-Thread 这套RTOS的一款集成开发环境。

网址:

https://www.rt-thread.org/page/studio.html

RT-Thread Studio主要是推荐使用 RT-Thread 这款RTOS,目前主要支持STM32、AT32、 ES32单片机,将来应该会增加(适配)更多单片机型号。

3.Arduino IDE

Arduino IDE主要是针对 Arduino 系列开发套件的一款集成开发环境。

网址:

https://www.arduino.cc/en/software

Arduino 其实核心也是一款单片机(Atmel推出的ATmega**,请看《Arduino和单片机区别》),只是这款IDE是开发更上一层(应用层)的工具。

Arduino IDE 是一款支持三大主流操作系统(Windows、 Linux、 Mac)的工具:

4.MPLAB IDE

MPLAB IDE是Microchip(微芯)公司针对自家单片机设计的一款开发环境。

网址:

https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-x-ide

说实话,MPLAB 相对通用IDE难用很多,前些年用PIC16、24等多个系列单片机开发过好几款产品,这个工具用了差不多3年,依然觉得难用(当时主要看中了PIC单片机)。

5.其他

专用IDE其实有很多,比通用IDE要多,比如:SW4STM32、 Atmel Studio、 e² studio等。

专用IDE资料更少,需要花费更多时间精力学习,通常情况下,如果你的单片机支持通用IDE,建议选择通用IDE。

“搭建”IDE

如果你觉得市面上的通用、专用IDE都不是你喜欢的类型,那么还有一种方式,就是自己搭建开发环境。

自己搭建开发环境,首先你要明白开发环境中包含哪些内容(编辑器、编译器、链接器等),然后自己用几个工具集成在一起。

因为搭建开发环境还是需要一定基础,对于新手来说,不建议自己搭建开发环境(建议先用通用IDE,了解IDE之后,可以试着自己搭建)。

下面罗列几个常见的搭建环境的工具:

Eclipse

https://www.eclipse.org/

VS Code

https://code.visualstudio.com/

GCC

http://gcc.gnu.org/

由于篇幅有限,具体搭建过程这里就不描述了,争取后面抽时间单独整理相关文章。

最后,推荐几款非常优秀且常用的代码编辑器

有关嵌入式、单片机、51单片机、STM32、的一些概念详解相关推荐

  1. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  2. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  3. 单片机-bmp280大气压强与温度传感器使用详解

    单片机-bmp280大气压强与温度传感器使用详解" 转载: https://blog.csdn.net/sunshinebooming/article/details/79637822 最近 ...

  4. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  5. AT89C51单片机流水灯c语言程序及详解(扫盲教程)

    AT89C51单片机是我们学习单片机必学的一个单片机,也是单片机入门的教材,下面给大家展示一下流水灯的编写方法适合初学者 首先先在proteus画出仿真图,方便仿真程序 下面来编写程序,先来写入头函数 ...

  6. STM32—— AHB、APB详解

     STM32-- AHB.APB详解 2016-07-14 20:35 590人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.概括 首先 ...

  7. STM32开发 -- 低功耗模式详解

    很多单片机都有低功耗模式,STM32 也不例外.当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗. 这部分不是我负责,但是也是有必要看一下的. 参看: STM32F1开发指南-库函数版本_ ...

  8. linux 蓝牙 手机遥控器,嵌入式Android小项目之万能手机遥控器详解

    原标题:嵌入式Android小项目之万能手机遥控器详解 在很久很久以前,手机是有红外功能的,后来随着蓝牙技术的成熟,红外逐渐被蓝牙取代,不再是标配了. 红外本身还是有些优点,比如操作简便,成本低.要想 ...

  9. 如何用c语言编写stm32的程序吗,STM32入门C语言详解

    <STM32入门C语言详解>由会员分享,可在线阅读,更多相关<STM32入门C语言详解(6页珍藏版)>请在人人文库网上搜索. 1.最新 料推荐阅读 flash : 芯片内部存储 ...

  10. STM32开发 -- 蓝牙开发详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...

最新文章

  1. jQuery——获取当前索引值
  2. 关于UseSubmitBehavior和OnClientClick同时使用,导致无法触发后台事件的问题
  3. MySQL索引原理及慢查询优化 美团
  4. 高等数学-微分方程知识点
  5. 如何用二进制表示一个小数
  6. kafka原理_kafka入门(原理搭建简单使用)
  7. java lambda循环_在Java 8 Lambda中创建自己的循环结构
  8. 西建大历年电子与通信工程复试真题_学姐分享2020年西安电子科技大学电子与通信工程考研初复试经验指导...
  9. 5-格子染色(递推)
  10. 从入门到入土:Python爬虫学习|实例练手|爬取百度产品列表|Xpath定位标签爬取|代码注释详解
  11. iOS NSString追加字符串的方法
  12. conda h5py_修改conda安装路径
  13. dataguard如何实现切换_ORACLE dataguard 切换
  14. [转]CString类型的头文件、CString的输出、CString的常用用法
  15. Windows XP下Dynamips模拟器的安装与使用
  16. Robocode 超级机器人 “波”统计瞄准算法
  17. 极域课堂忘记密码,解决方法,万能密码
  18. Delphi Sender对象的使用
  19. 查看Windows凭据和普通凭据的密码(查看Windows中存储的密码)——mimikatz
  20. SQLServer视图:视图简介

热门文章

  1. 计算机财务管理中的函数,浅析几种常用的Excel函数在财务管理中的应用
  2. AD16操作技巧笔记
  3. Qt Sqlite中替换部分字符串
  4. SQL常用替换字符串值的5种方法
  5. jsp实现简单购物车页面
  6. (附源码)计算机毕业设计SSM基于图书管理系统
  7. 酷q服务器未响应,酷Q怎么了,停运后,其他机器框架,该怎么版
  8. python 数据结构包括三方面_Python数据结构:数据框
  9. 计算机视觉 | 面试题:26、LBP算法原理
  10. 精解闪电网络如何打开BTC支付时代 | 火星总编时刻No.7