固件开发:简介

哈Ha!我向您介绍克里斯·斯维克(Chris Svec)的文章译本,原文在这里经作者许可,以CC-A-NC-ND许可发布

嵌入式软件工程101:简介


我正在启动一系列有关固件开发的教程。我们将首先描述一个简单的微控制器,在您了解了它的工作原理之后,我们将对其进行开发,以了解其在复杂系统(例如Fitbit或Nest)上的工作方式。
我将其称为“嵌入式软件工程101”系列,该课程本周从本博客开始。

请继续阅读以获取更多说明和详细信息。


其他构件上的一些构件。

我从事嵌入式系统开发和微芯片开发已超过14年。我喜欢嵌入式系统-硬件,软件以及将它们绑定在一起的限制。
诸如ArduinoAdafruitSparkfun之类的业余电子产品和创意使人们可以在周末(或一个月或一个学期)内轻松地从硬件和软件中抛出一些东西,从而创造出一些新颖,有趣甚至有用的东西。

这很棒!给人们创造的机会是一件了不起的事情。如果我想苛刻地表达自己,我会立志称其为“民主化技术”。

大多数业余项目都是一次性的。您收集一些东西,使其变得足够有时间或精力,然后继续前进。
我的职业生涯是在另一端进行的-创建数十万或数百万甚至更多副本的产品-这需要完全不同的思维方式和系统的方法。

我想教人们如何为这类系统编写固件。我长期在嵌入式软件工程101课程/指南/书籍/博客中培养了这种想法,并且由于Embedded.fm博客,我现在开始实施它。

我是一个基本型的人,所以我的计划是从基础知识开始,简单地描述一个简单的微处理器,然后发展这个基础,直到您了解一个相对复杂的嵌入式系统是如何工作的。

我的目标是,在本周期结束时,您可以弄清楚Fitbit是如何工作的,Nest温控器或类似的嵌入式系统。您可以使用专业经验开始使用嵌入式软件系统。

嵌入式软件工程101设计用于:

  1. 对嵌入式系统感兴趣的计算机科学,计算机工程或电子领域的大学毕业生。
  2. 想要更深入地了解他们的系统如何在Arduino上工作的业余电子爱好者,并了解他们的前进方式(以及是否有必要!)。
  3. , , .
  4. , , -.

我说我是“基本类型的人”是什么意思?理查德·费曼Richard Feynman)是诺贝尔奖获得者,出色的讲故事者,他用最好的方式说:“我无法再现的东西,我不理解的东西。”

因此,我不是Feynman,但我敢肯定,理解系统的最佳方法是从基础开始。有了这种理解,您就可以使用简单的软件创建简单的嵌入式系统。首先,您已经了解了一个非常简单的程序,然后可以随着经验的增长,通过创建更复杂的软件来进行开发。

首先是基础知识-当然,这只是我个人的信念。许多人在不了解任何基础知识的情况下使用Arduino做出了有用的事情。本系列文章供那些仍希望了解基础知识和基于其构建的一切的用户使用。

当然,我们必须问自己-从这些非常“基础”开始的正确水平是什么?晶体管和逻辑门?不,这太低了,无法从固件开始。连接到普通传感器?不,这是一个很高的层次,因此需要太多的知识。

我认为正确的基础知识是内置微处理器。无需了解物理或电子学知识即可使用内置微处理器;也无需成为编程专家。

因此,这是我们将在下一篇文章中开始的地方。

偏见警告:在过去的生活中,我是一名架构师/处理器开发人员。通过了解CPU的工作方式开始这一周期可能不是了解嵌入式系统的最佳方法,但这就是我的大脑如何工作。如果几篇文章后您不理解,请务必尝试其他课程/手册等。

嵌入式软件工程101:微控制器基础


我们将使用适度的微控制器开始嵌入式软件工程101的旅程。微控制器(或微处理器)是所有嵌入式和其他计算系统的主要组成部分。

MK看起来相当复杂,但是它由三部分简单的内容组成:指令,寄存器和存储器。指令是微控制器知道如何执行的那些事情。一个简单的MK不能执行太多任务-例如,可以包含20或30条指令。在本周期的后期,我将使用德州仪器(TI)的MSP430微控制器,该微控制器只有27条指令。


只是MK的照片(TI MSP430F5529)

这27条指令是MSP430只能执行的操作。他可以将两个数字相加,从一个数字中减去另一个,将数字从一个地方移到另一个地方或执行其他24个简单的操作。 27个操作似乎不足以做任何有用的事情,但实际上,这些操作足以执行任何可能的程序。

好吧,这意味着微控制器具有执行数字操作的指令。但是这些数字在哪里?寄存器和内存!指令使用存储在寄存器和存储器中的数字进行操作。

寄存器是一个非常快速的存储库,其中包含对指令进行操作的数字。您可以将它们视为说明使用的记事本。 MK包含很少的寄存器,通常为8-32。例如,MSP430有16个寄存器。

内存也可以存储数字,但是它比寄存器大得多且慢得多。微控制器可以具有64 kB,256 kB甚至超过1 MB的内存。 MSP430F5529具有大约128 kB的内存;这是其寄存器数量的8000倍以上!

在我们开始看示例之前,我敦促您拿一张纸和一支钢笔或铅笔,并在阅读时研究这些示例。在纸上学习它们比阅读我写的内容更加困难。因此,您将认真对待这一过程,背诵已学知识的机会将会更高。

让我们看一个虚构的但微控制器的典型示例。

假设我们的MK有4个寄存器和8个存储单元。通常以创造性的方式调用寄存器,例如“ R0”,“ R1”等,我们将这样做。内存单元通常由其编号(也称为内存地址)来引用,从编号0开始。这就是我们的寄存器和内存的外观:



现在我将在其中输入一些值:



现在我们的虚拟微控制器需要一些指令。
MK知道的指令集称为其指令集。假设集合中有3条指令:ADD(加),SUB(“减”的缩写-减去)和MOVE(移动)。指令必须从某处获取它们的编号,并将其结果放在某处,因此其中一些包含有关输入和输出数据的位置的信息。

例如,让我们的ADD指令有两个源和一个数据接收器,它们都必须是寄存器。手册可以这样描述该指令:
ADD regist,regPrm
ADD指令将regGist寄存器的值加到regPrm寄存器的值,并将结果保存在regPrm寄存器中
摘要:regPrm = regGist + regPrm
示例:ADD R1,R2执行运算R2 = R1 + R2
指令中通常接受将一个源也用作接收器,就像ADD指令一样,使用regPrm作为数据的源和接收器。

“ ADD R1,R2”是微控制器的汇编语言,它是本机编程语言MK。

让我们以相同的样式定义SUB:
SUB regist,regrpm
SUB指令从regprm寄存器的值中减去registr寄存器的值,并将结果存储在regprm寄存器中。
摘要:regPrm = regPrm-regist
示例:SUB R3,R0执行操作R0 = R0-R3
最后,让MOVE指令具有一个源和一个接收器,并且其中之一:

  • 这两个参数都是寄存器
  • 一个是寄存器,一个是存储器位置。

指令集指南将显示为:
1. MOVE寄存器,寄存器
2. MOVE寄存器,寄存器
3. MOVE寄存器,rem
MOVE指令将数据从参数East复制到参数Prm中。
摘要:共有三种MOVE指令:
1. regPrm =
regist 2.regPm = memist
3. memPm = reg
示例:我将在本文后面的示例中显示MOVE指令的示例。
关于该指令使用的“移动”一词的注释:大多数指令集都使用它,尽管实际上数据是复制的而不是移动的。

名称“ move”可能给人一种印象,即指令的操作数源已被破坏或清除,但实际上它仍然是单独的,仅修改了接收器。
让我们使用虚构的微控制器来浏览一些示例。
首先,我们的寄存器和存储器如下所示:



现在,我们在MK上执行以下指令:

ADD R1, R2

它获取R1的值,将其添加到R2的值,然后将结果存储在R2中。处理器在一个操作中执行大多数指令,但是我将把每个ADD,SUB和MOVE指令的执行分为几步,并用“ =>”箭头引导替换(寄存器/内存=>值):

R2 = R1 + R2 =>
R2 = 37 + 100 =>
R2 = 137

执行完该指令后,内存不变,但寄存器现在看起来如下,更改后的值用红色表示:



注意,R1不变;只有接收器寄存器R2已更改。
接下来让我们尝试SUB语句:

SUB R3, R0

她获取R3的值,从R0的值中减去它,然后将结果存储在R0中:

R0 = R0 - R3 =>
R0 = 42 - 2 =>
R0 = 40

执行完该指令后,内存不变,但寄存器现在看起来像这样:



最后,让我们尝试几个版本的MOVE指令:

MOVE R2, R0

此MOVE指令将R2的值复制到R0:

R0 = R2 =>
R0 = 137

现在寄存器如下所示:



接下来,我们将寄存器复制到内存中:

MOVE R3, [3]

该MOVE指令将R3复制到存储器位置3。我们的指令集中的方括号是存储单元。

[3] = R3 =>
[3] = 2

寄存器没有改变,但是内存发生了变化:



对于最后一个示例,我们将值从内存复制到寄存器:

MOVE [6], R0

此处,存储单元6的值被复制到寄存器R0:

R0 = [6] =>
R0 = 1

存储器是不可变的,寄存器现在看起来像这样:



信不信由你,但是如果您了解了我们刚才讨论的有关指令,寄存器和存储器的大部分内容,那么您将了解微控制器和汇编语言的基础。

当然,我省略了许多细节。例如,MK如何获得执行指令?

除了简单的数学和复制指令,还有其他有趣的指令吗?内存是否与RAM或闪存相同?

我们将在下一篇文章中回答这些问题。

All Articles