嵌入式设备和嵌入式系统开发--概述

发表于2021年8月11日
由Secure Code Warrior
案例研究

嵌入式设备和嵌入式系统开发--概述

发表于2021年8月11日
由Secure Code Warrior
查看资源
查看资源

在Secure Code Warrior ,我们一直在寻求扩大我们的培训范围。为了使嵌入式开发人员和安全管理人员能够构建安全的嵌入式系统,我们正在挖掘嵌入式系统的安全世界。在这篇文章中,我们将分享开发人员和架构师在构建安全嵌入式系统方面应该知道的关键事项。 

嵌入式设备是一个独立的计算单元,有自己的基于微处理器的硬件和软件。它们通常被用来执行专门的功能,可以是独立的,也可以是作为较大系统的一部分。

什么是嵌入式设备和系统?

嵌入式设备是专门建造的计算系统,具有最小化的硬件和软件,通过编程来执行特定功能。根据其目的,嵌入式设备的复杂性可能有所不同。 

如果一个嵌入式系统必须执行复杂的、资源密集型的操作,其硬件可能包括多个处理器,以及各种互连的外设。然而,如果它被设计用来做一个简单的任务,它可能只包含一个单一的微控制器。 

一些嵌入式系统是没有用户界面的黑盒子,而另一些则可以有详细的、图形化的用户界面。

嵌入式设备的例子

嵌入式设备在多个行业都有应用;从航空航天到计算机,从家用电器到医疗保健。这里有几个例子。

  • 空调内的温控器。 
  • 一个健身追踪器,用小的电子元件运行一个微小的操作系统,除了记录和同步你的健康统计数据外,什么也做不了。
  • 数字气候控制系统。
  • 飞机内的导航系统。
  • 数字手表。
  • GPS设备。
  • 微波炉和其他消费电子产品内的Wi-Fi组件。
  • 血压和心跳监测器。
  • 核磁共振机器内的网络组件,将数据发送到云端。

笔记本电脑是一种嵌入式设备吗?

简短的回答。长答案:不。

根据定义,一个嵌入式设备封装了它所需要的所有软件和硬件来执行其功能。一台笔记本电脑确实将各种硬件组件包裹在一个金属机身中,并包含了它所需的所有软件以提供其功能集。

然而,与典型的嵌入式系统不同,它有一个预先定义的、最小的功能集,笔记本电脑的用途更广泛,可以用来做各种各样的活动。

物联网中的嵌入式设备

嵌入式系统是物联网的核心。你的智能冰箱可以通过你的移动设备控制,因为有一个嵌入式设备。是你的安全系统中的一个嵌入式设备,让你在千里之外查看闭路电视录像。而当你按下一个按钮,让你的汽车处于自动驾驶状态时,在幕后,是一个嵌入式设备完成了所有的魔法。

嵌入式软件开发生命周期

在一个嵌入式设备的典型软件开发生命周期中,涉及以下步骤。

步骤1:目的和要求

一个嵌入式设备有一个独特而精确的功能集。这就是为什么在开始开发之前明确说明其目的和要求是非常重要的。建议为该系统创建一个详细的设计文件。回答这样的问题。

  • 该设备将执行哪些功能?
  • 它将成为另一台机器的一部分,还是将独立运作?
  • 该设备应该有一个用户界面吗?如果有,是用命令行就够了,还是需要一个图形用户界面?
  • 设备必须遵守哪些尺寸、成本或功耗限制?
  • 是否有任何性能基准?例如,是否期望设备能实时响应,或在某些阈值内响应?

第2步:系统结构

一旦我们确定了独特的系统要求,我们就可以准备设计系统结构了。回答这样的问题。

  • 开发该设备将需要哪些硬件组件?这包括确定电路、处理器芯片和微控制器,以及任何所需的内部和外部外围设备。 
  • 这些组件需要多大的功率? 
  • 设备是否会连接到互联网?
  • 哪些接口必须被添加/开发,以允许设备连接到其他设备,或更大的机器上?
  • 你将如何实现加密?(考虑算法、密钥存储等)
  • 你将如何识别和避免任何潜在的漏洞、漏洞和恶意软件?

第3步:选择操作系统

操作系统的选择往往决定了你的嵌入式应用的功效,所以要明智地选择。用于物联网的Windows可能在图形方面得分很高,但缺乏硬件支持。嵌入式Linux和安卓是免费的,而VxWorks和Windows for IoT有许可费用。 

对于像Linux和安卓这样的开源系统,你的开发者对内核有更多的控制权;然而,对于专有系统,内核的默认功能集是你可以使用的全部。 

在选择操作系统时,考虑安全问题也很重要。在发现任何漏洞的情况下,安全补丁是否能迅速发布?是否有针对最常见的网络安全攻击的任何内置保护?

第四步:开发工具

不同的编程语言和框架有各种优点和缺点。根据你的功能、速度和可靠性要求,你可以选择一种语言/框架而不是其他。 

如果你的应用程序是基于网络的,并且你想要高性能,就用Java。
然而,如果你想要最快的吞吐量,就用C/C++。如果你想要最好的第三方库支持,就用Python。

第五步:编码、重构、测试、再编码

一旦你决定了开发平台,你就可以开始编码了。请记住,嵌入式系统是敏感的设备,硬件和软件资源有限。因此,牢记有关应用程序安全和性能的最佳实践是至关重要的。

代码审查有助于优化代码和识别任何潜在的错误。你还需要尽可能地严格测试。确保你编制一份详尽的清单,列出设备在生产中使用时可能遇到的所有测试案例。

第6步:维护和支持

就像任何其他的应用程序/设备一样,生命周期并没有在嵌入式设备被运送和安装后结束。随着设备在生产中的使用,新的用例被发现,这就需要增加新的功能。任何报告的错误也可能需要发布新的固件更新。

顶级嵌入式编程语言

有许多著名的组织,如IEEE和TIOBE,按流行和使用情况对编程语言进行排名。然而,无论你是查看TIOBE指数,还是查看IEEE Spectrum,你都会注意到一个共同的主题。

排名前三的语言始终是C、Python和Java。2021年7月的TIOBE指数中,C排名第一,Java排名第二,Python排名第三。根据IEEE Spectrum对嵌入式编程语言的排名,其顺序是。Python、Java,然后是C。

用Java、C或Python编写的固件有什么不同?

不同的语言以不同的方式管理内存、与操作系统的交互以及运行时间。例如,Java应用程序在一个专门的运行时环境中执行,称为Java虚拟机,或JVM。 

C/C++中的内存管理是手动的,然而,在Java或Python中,你不必担心自己管理内存;语言为你做这些。更重要的是,在C语言中,你必须自己收集垃圾;也就是说,如果你动态地分配了一块内存,你必须自己明确地释放它。如果你不这样做,就会导致内存泄漏。在Java或Python中,垃圾收集是自动完成的。然而,C语言在本质上要比Java或Python快得多。

与Python相比,C和Java(但特别是C)缺少的一点是第三方库的可用性。Python有一个更丰富的库数据库,这使得开发者更容易增加某些功能。

总的来说,如果选择C。

  • 你想要一个与操作系统和硬件的低级别接口。
  • 你想获得尽可能好的性能。
  • 你的开发人员熟练掌握C/C++。
  • 不需要太多的外部/第三方支持。

如果是这样,就用Python吧。

  • 你想实现数据科学或机器学习算法。
  • 你想要丰富的、第三方的库支持。
  • 你可以接受以速度换取易用性的做法。
  • 你在嵌入式开发方面的经验有限。
  • 你不需要一个与操作系统或硬件的低层次接口。

如果是这样,就用Java吧。

  • 你正在构建网络应用。
  • 你希望比C语言更容易开发,但仍然希望比Python有更高的性能。
  • 不需要太多的外部/第三方支持。

C语言会不会慢慢地不再是嵌入式开发的首选?

高级语言通过抽象化那些在C语言中根本无法避免的复杂问题,使编码变得更加容易。然而,几十年来,尽管有更高级的语言和框架的发布,C语言仍然是嵌入式开发的首选。 

这是因为它所提供的速度、性能和可靠性仍然是无可比拟的。Python和Java生态系统的大部分(包括运行时、语言和编译器)都是用C语言编写的,这一事实充分说明了该语言的效率和持久性。

尽管如此,不可否认的是,C语言对于新的开发者来说更难学习,他们更喜欢像Python这样简单的语言。这就造成了C语言开发者社区规模的明显下降。人工智能和ML应用开发的兴起也促使人们选择Python而不是C语言,仅仅是因为它提供了更大的库支持。

重要的是要记住,Python最近才成为顶级嵌入式编程语言 辩论的一部分。是的,它的采用率在未来几年可能会继续上升,但我们并不期望C语言会停止成为嵌入式开发的首选。

为什么安全编码在C/C++中很重要?

在用C/C++编写代码时,可能会出很多问题。访问一个不再指向有效数据的内存地址,或者在线程之间不正确地共享数据,都可能导致你的整个应用程序崩溃。 

对于嵌入式设备来说,这些影响要大得多,因为它们内部的崩溃会导致一个更大的机器停止运作。例如,如果汽车中的自动驾驶模块关闭,汽车将不再能够避免障碍物。

以下是C/C++应用程序的安全编码如此重要的更多原因。

  • 不安全的内存处理(空指针、内存损坏、堆栈溢出、缓冲区和堆溢出)导致整个应用程序崩溃。
  • 指针是C和C++的重要组成部分。处理它们需要极其小心,并深入了解基本概念。
  • 垃圾收集是手动的。这使得程序员必须明确删除任何动态分配的内存。未释放或不正确释放的内存会导致内存泄漏或损坏。
  • 对于高级数据结构(如哈希表、集合等)缺乏标准化的API,这迫使开发者重新发明车轮。

开发人员接受C/C++应用程序的安全编码培训绝对是至关重要的。Secure Code Warrior ,提供个性化的learning platform ,包括互动挑战、courses ,以及评估,可以使开发人员编写安全的C/C++代码。在这里,我们谈论的是针对语言:框架的内容,而不仅仅是对一般概念培训的调整。

看看我们如何帮助汽车和运输业。或者今天尝试一下以嵌入为重点的编码挑战,体验一下我们如何让开发人员编写安全的嵌入式应用程序

查看资源
查看资源

作者

Secure Code Warrior

Secure Code Warrior 通过向开发人员传授安全代码编写的技能,建立以安全为导向的开发人员文化。我们的旗舰产品敏捷Learning Platform 为开发人员提供了基于技能的相关途径、动手实践missions 以及上下文工具,帮助他们快速学习、构建和应用技能,从而快速编写安全代码。

想要更多吗?

在博客上深入了解我们最新的安全编码见解。

我们广泛的资源库旨在增强人类对安全编码技术提升的方法。

查看博客
想要更多吗?

获取关于开发者驱动的安全的最新研究

我们广泛的资源库充满了有用的资源,从白皮书到网络研讨会,让你开始使用开发者驱动的安全编码。现在就去探索它。

资源中心

嵌入式设备和嵌入式系统开发--概述

发表于2021年8月11日
通过Secure Code Warrior

在Secure Code Warrior ,我们一直在寻求扩大我们的培训范围。为了使嵌入式开发人员和安全管理人员能够构建安全的嵌入式系统,我们正在挖掘嵌入式系统的安全世界。在这篇文章中,我们将分享开发人员和架构师在构建安全嵌入式系统方面应该知道的关键事项。 

嵌入式设备是一个独立的计算单元,有自己的基于微处理器的硬件和软件。它们通常被用来执行专门的功能,可以是独立的,也可以是作为较大系统的一部分。

什么是嵌入式设备和系统?

嵌入式设备是专门建造的计算系统,具有最小化的硬件和软件,通过编程来执行特定功能。根据其目的,嵌入式设备的复杂性可能有所不同。 

如果一个嵌入式系统必须执行复杂的、资源密集型的操作,其硬件可能包括多个处理器,以及各种互连的外设。然而,如果它被设计用来做一个简单的任务,它可能只包含一个单一的微控制器。 

一些嵌入式系统是没有用户界面的黑盒子,而另一些则可以有详细的、图形化的用户界面。

嵌入式设备的例子

嵌入式设备在多个行业都有应用;从航空航天到计算机,从家用电器到医疗保健。这里有几个例子。

  • 空调内的温控器。 
  • 一个健身追踪器,用小的电子元件运行一个微小的操作系统,除了记录和同步你的健康统计数据外,什么也做不了。
  • 数字气候控制系统。
  • 飞机内的导航系统。
  • 数字手表。
  • GPS设备。
  • 微波炉和其他消费电子产品内的Wi-Fi组件。
  • 血压和心跳监测器。
  • 核磁共振机器内的网络组件,将数据发送到云端。

笔记本电脑是一种嵌入式设备吗?

简短的回答。长答案:不。

根据定义,一个嵌入式设备封装了它所需要的所有软件和硬件来执行其功能。一台笔记本电脑确实将各种硬件组件包裹在一个金属机身中,并包含了它所需的所有软件以提供其功能集。

然而,与典型的嵌入式系统不同,它有一个预先定义的、最小的功能集,笔记本电脑的用途更广泛,可以用来做各种各样的活动。

物联网中的嵌入式设备

嵌入式系统是物联网的核心。你的智能冰箱可以通过你的移动设备控制,因为有一个嵌入式设备。是你的安全系统中的一个嵌入式设备,让你在千里之外查看闭路电视录像。而当你按下一个按钮,让你的汽车处于自动驾驶状态时,在幕后,是一个嵌入式设备完成了所有的魔法。

嵌入式软件开发生命周期

在一个嵌入式设备的典型软件开发生命周期中,涉及以下步骤。

步骤1:目的和要求

一个嵌入式设备有一个独特而精确的功能集。这就是为什么在开始开发之前明确说明其目的和要求是非常重要的。建议为该系统创建一个详细的设计文件。回答这样的问题。

  • 该设备将执行哪些功能?
  • 它将成为另一台机器的一部分,还是将独立运作?
  • 该设备应该有一个用户界面吗?如果有,是用命令行就够了,还是需要一个图形用户界面?
  • 设备必须遵守哪些尺寸、成本或功耗限制?
  • 是否有任何性能基准?例如,是否期望设备能实时响应,或在某些阈值内响应?

第2步:系统结构

一旦我们确定了独特的系统要求,我们就可以准备设计系统结构了。回答这样的问题。

  • 开发该设备将需要哪些硬件组件?这包括确定电路、处理器芯片和微控制器,以及任何所需的内部和外部外围设备。 
  • 这些组件需要多大的功率? 
  • 设备是否会连接到互联网?
  • 哪些接口必须被添加/开发,以允许设备连接到其他设备,或更大的机器上?
  • 你将如何实现加密?(考虑算法、密钥存储等)
  • 你将如何识别和避免任何潜在的漏洞、漏洞和恶意软件?

第3步:选择操作系统

操作系统的选择往往决定了你的嵌入式应用的功效,所以要明智地选择。用于物联网的Windows可能在图形方面得分很高,但缺乏硬件支持。嵌入式Linux和安卓是免费的,而VxWorks和Windows for IoT有许可费用。 

对于像Linux和安卓这样的开源系统,你的开发者对内核有更多的控制权;然而,对于专有系统,内核的默认功能集是你可以使用的全部。 

在选择操作系统时,考虑安全问题也很重要。在发现任何漏洞的情况下,安全补丁是否能迅速发布?是否有针对最常见的网络安全攻击的任何内置保护?

第四步:开发工具

不同的编程语言和框架有各种优点和缺点。根据你的功能、速度和可靠性要求,你可以选择一种语言/框架而不是其他。 

如果你的应用程序是基于网络的,并且你想要高性能,就用Java。
然而,如果你想要最快的吞吐量,就用C/C++。如果你想要最好的第三方库支持,就用Python。

第五步:编码、重构、测试、再编码

一旦你决定了开发平台,你就可以开始编码了。请记住,嵌入式系统是敏感的设备,硬件和软件资源有限。因此,牢记有关应用程序安全和性能的最佳实践是至关重要的。

代码审查有助于优化代码和识别任何潜在的错误。你还需要尽可能地严格测试。确保你编制一份详尽的清单,列出设备在生产中使用时可能遇到的所有测试案例。

第6步:维护和支持

就像任何其他的应用程序/设备一样,生命周期并没有在嵌入式设备被运送和安装后结束。随着设备在生产中的使用,新的用例被发现,这就需要增加新的功能。任何报告的错误也可能需要发布新的固件更新。

顶级嵌入式编程语言

有许多著名的组织,如IEEE和TIOBE,按流行和使用情况对编程语言进行排名。然而,无论你是查看TIOBE指数,还是查看IEEE Spectrum,你都会注意到一个共同的主题。

排名前三的语言始终是C、Python和Java。2021年7月的TIOBE指数中,C排名第一,Java排名第二,Python排名第三。根据IEEE Spectrum对嵌入式编程语言的排名,其顺序是。Python、Java,然后是C。

用Java、C或Python编写的固件有什么不同?

不同的语言以不同的方式管理内存、与操作系统的交互以及运行时间。例如,Java应用程序在一个专门的运行时环境中执行,称为Java虚拟机,或JVM。 

C/C++中的内存管理是手动的,然而,在Java或Python中,你不必担心自己管理内存;语言为你做这些。更重要的是,在C语言中,你必须自己收集垃圾;也就是说,如果你动态地分配了一块内存,你必须自己明确地释放它。如果你不这样做,就会导致内存泄漏。在Java或Python中,垃圾收集是自动完成的。然而,C语言在本质上要比Java或Python快得多。

与Python相比,C和Java(但特别是C)缺少的一点是第三方库的可用性。Python有一个更丰富的库数据库,这使得开发者更容易增加某些功能。

总的来说,如果选择C。

  • 你想要一个与操作系统和硬件的低级别接口。
  • 你想获得尽可能好的性能。
  • 你的开发人员熟练掌握C/C++。
  • 不需要太多的外部/第三方支持。

如果是这样,就用Python吧。

  • 你想实现数据科学或机器学习算法。
  • 你想要丰富的、第三方的库支持。
  • 你可以接受以速度换取易用性的做法。
  • 你在嵌入式开发方面的经验有限。
  • 你不需要一个与操作系统或硬件的低层次接口。

如果是这样,就用Java吧。

  • 你正在构建网络应用。
  • 你希望比C语言更容易开发,但仍然希望比Python有更高的性能。
  • 不需要太多的外部/第三方支持。

C语言会不会慢慢地不再是嵌入式开发的首选?

高级语言通过抽象化那些在C语言中根本无法避免的复杂问题,使编码变得更加容易。然而,几十年来,尽管有更高级的语言和框架的发布,C语言仍然是嵌入式开发的首选。 

这是因为它所提供的速度、性能和可靠性仍然是无可比拟的。Python和Java生态系统的大部分(包括运行时、语言和编译器)都是用C语言编写的,这一事实充分说明了该语言的效率和持久性。

尽管如此,不可否认的是,C语言对于新的开发者来说更难学习,他们更喜欢像Python这样简单的语言。这就造成了C语言开发者社区规模的明显下降。人工智能和ML应用开发的兴起也促使人们选择Python而不是C语言,仅仅是因为它提供了更大的库支持。

重要的是要记住,Python最近才成为顶级嵌入式编程语言 辩论的一部分。是的,它的采用率在未来几年可能会继续上升,但我们并不期望C语言会停止成为嵌入式开发的首选。

为什么安全编码在C/C++中很重要?

在用C/C++编写代码时,可能会出很多问题。访问一个不再指向有效数据的内存地址,或者在线程之间不正确地共享数据,都可能导致你的整个应用程序崩溃。 

对于嵌入式设备来说,这些影响要大得多,因为它们内部的崩溃会导致一个更大的机器停止运作。例如,如果汽车中的自动驾驶模块关闭,汽车将不再能够避免障碍物。

以下是C/C++应用程序的安全编码如此重要的更多原因。

  • 不安全的内存处理(空指针、内存损坏、堆栈溢出、缓冲区和堆溢出)导致整个应用程序崩溃。
  • 指针是C和C++的重要组成部分。处理它们需要极其小心,并深入了解基本概念。
  • 垃圾收集是手动的。这使得程序员必须明确删除任何动态分配的内存。未释放或不正确释放的内存会导致内存泄漏或损坏。
  • 对于高级数据结构(如哈希表、集合等)缺乏标准化的API,这迫使开发者重新发明车轮。

开发人员接受C/C++应用程序的安全编码培训绝对是至关重要的。Secure Code Warrior ,提供个性化的learning platform ,包括互动挑战、courses ,以及评估,可以使开发人员编写安全的C/C++代码。在这里,我们谈论的是针对语言:框架的内容,而不仅仅是对一般概念培训的调整。

看看我们如何帮助汽车和运输业。或者今天尝试一下以嵌入为重点的编码挑战,体验一下我们如何让开发人员编写安全的嵌入式应用程序

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。