关于嵌入式开发的一些信息汇总:开发模型以及自托管开发(一)

关于嵌入式开发的一些信息汇总:开发模型及自托管开发(一)

  • 1 开发模型
    • 1.1 跨平台开发
    • 1.2 自托管开发
    • 1.3 混合开发模型
  • 2 自托管开发
    • 2.1 安装树莓派

这篇文章是关于嵌入式开发的一些基本信息,供想入行的人参考。有一些作者本人的想法,以及来自外网的大拿的文章翻译而来,原文链接在此Learning Linux for embedded systems,再次感谢,支持原创。

1 开发模型

本期讨论开发模型。嵌入式 Linux 开发有两种不同的模型:跨平台自托管

1.1 跨平台开发

嵌入式 Linux(以及所有嵌入式系统开发)的传统模型是跨平台开发
在这种开发风格中,您功能强大的主机系统(如台式计算机)上创建软件然后将二进制映像传输到小得多的目标系统

  • 您的主机具有许多使其成为出色开发环境的功能:快速处理器、大量内存和磁盘空间、大显示屏以及您需要的所有工具。
  • 拥有文档并可以访问 Internet 以获取文章、支持或软件
  • 您的目标系统可能是为特定应用而设计的,例如路由器、媒体播放器、文件服务器、控制器或其他一些用途。处理器通常在功率和速度方面受到限制,选择以满足应用程序的要求。
  • 通常,目标系统的处理器架构与您的主机系统不同,后者是为低价或集成外设而选择的。目标的系统内存,包括 RAM 和持久内存,都是有限的,只是运行应用程序所需的数量
  • 从目标系统到“外部世界”的连接只是运行应用程序所需的连接。例如,文件服务器有网络连接和硬盘连接,但没有显示器或键盘连接。

在主机系统上使用交叉编译器将内核和应用程序编译成二进制映像,然后将其传输到目标系统交叉编译器和交叉调试器的版本可能不同于主机系统编译器和调试器,旨在支持目标处理器。在大多数情况下,它们的工作方式与主机系统上的相应工具完全相同。
除了交叉开发工具,您还可以使用主机工具进行其他所有操作,从编辑文件到构建内核或应用程序。
目标系统使用的内核或应用程序的版本可能与开发系统上的不同。你的开发系统可能有一个标准的发行版,比如 Ubuntu 或 RHEL,

跨平台开发模型增加了一些复杂性

  1. 当您为目标编译程序时,重要的是使用目标的系统头文件,而不是主机的系统头文件。您可以想象,如果您的某个编译错误地使用了主机系统标头,该标头将 int 定义为 64 位,而目标使用 32 位 int,则可能会出现的问题。大多数时候,交叉编译器负责确保在为目标编译程序时使用目标系统的标头
  2. 您将需要构建一个完整的文件系统,包括内核、应用程序以及填充 Linux 文件系统所需的所有目录。有多种工具可以帮助完成此操作,例如 buildroot、OpenEmbedded 或 Yocto。我们将在以后的文章中讨论这些。
  3. 另一个复杂性是目标上的文件系统可能与主机上的不同。许多目标使用闪存进行存储,这可能使用日志闪存文件系统 (JFFS) 而不是主机上硬盘驱动器上使用的 EXT 文件系统。您需要将主机上的文件系统转换为传输到目标并写入闪存所需的二进制格式
  4. 根据目标的启动方式,您可能需要在主机上配置 TFTP 服务器和 DHCP 服务器。这通常意味着您将在主机系统上使用不同的网络连接来连接到目标,而不是您用来连接到 Internet 的网络连接。(当公司 IT 部门发现流氓 DHCP 服务器响应公司网络上的请求时,他们会很不高兴,这是可以理解的。)
  5. 最后,还有主机系统和目标系统之间的通信问题。您可以通过多种方式在主机系统和目标系统之间创建连接。这些包括 JTAG 或与处理器的其他低级连接,这可能允许也可能不允许您传输二进制图像。有一个古老的串行端口,通常用作系统控制台,它在目标硬件上仍然很常见,即使它们在开发系统上似乎很少见.(您可以使用 USB 转串口适配器)许多目标系统都有网络端口,可以让您将它们连接到网络。这些目标可能支持使用 TFTP 从主机上的二进制映像启动,而不是必须将映像写入闪存文件系统.我们将在以后的文章中讨论所有这些额外的复杂性。

1.2 自托管开发

通过这种开发方式,您可以在目标上开发程序

  • 目标系统具有强大的处理器足够的内存来构建内核和应用程序时,自托管开发是一种合理的开发方法。内核和应用程序的源文件以及构建目录可能位于本地硬盘驱动器上使用 NFS 通过网络安装

  • 过去,这种开发模式只用于非常庞大和昂贵的嵌入式系统,例如电话总局的交换机现在有许多嵌入式系统将快速处理器、大量 RAM 存储器、用于文件系统的闪存、视频控制器和各种外围设备封装在一个小而便宜的板上,比较流行的有 BeagleBone 和 Raspberry Pi。这些板上有快速的 ARM 处理器(600 MHz 至 1GHz)、充足的 RAM(256-512Mb)、用作 4Gb 或更多文件系统的可移动 SD 卡、用于连接键盘或鼠标的 USB 端口以及用于监视器的视频输出。(将其与第一款 Linksys WRT54G 路由器中使用的硬件进行比较:125MHz 处理器16Mb RAM4Mb 闪存。)

  • 在许多方面,这种模型有很多优点,尤其是在高性能单板计算机上
    首先是预打包的 Linux 发行版可用。在某些情况下,您可以选择多个发行版,例如 Ubuntu,它们也可用于桌面系统。目标处理器的开发工具(编译器、汇编器和调试器)包含在发行版中为目标构建内核或应用程序与为桌面或服务器 Linux 系统构建非常相似。没有办法不小心混合主机头文件和目标头文件,因为目标上的编译器只引用目标头文件。

  • 也有缺点只有当目标系统是这些强大系统之一时,才能使用此模型。使用许多程序和库构建一个完整的根文件系统,即使在一个快速的桌面系统上也可能需要几个小时在较慢的目标上,如 Raspberry Pi,可能需要几天时间。这些目标系统可能拥有比计划的应用程序实际需要更多的硬件。可能很难将分发缩减为仅应用程序需要的那些组件,因为系统必须同时支持开发和应用程序环境。

  • 我们还将在以后的文章中探讨这种自托管开发。

1.3 混合开发模型

  • 有一些方法可以结合这两种开发模型的优点,同时避免一些缺点。您可以使用交叉开发模型在主机上构建根文件系统,并使用 NFS 将其提供给目标,同时使用自托管开发模型在目标上进行驱动程序或应用程序开发
  • 另一种选择是使用 QEMU 在主机系统上模拟目标硬件。QEMU 是一个处理器和系统仿真器,它支持许多不同的体系结构和系统设计。您在主机开发系统上运行 QEMU 并使用虚拟网络连接到它,具有在使用目标环境时在更强大的主机系统上获得更高性能的优势。此外,您可以启动 QEMU 等待 GDB 连接到它,这样您就可以从第一条指令开始跟踪代码,这对于自托管目标来说可能很困难或不可能。

2 自托管开发

自托管开发是在主机系统上开发的一个分支,类似于我们在本系列前几期中对 VM 安装所做的工作,但是存在一些差异,因为目标系统与大多数嵌入式系统一样,内存有限且处理器相对较慢。

2.1 安装树莓派

Raspberry Pi(B 型*)是一款价格低廉(35 美元)的单板计算机 (SBC),配备 700MHz Broadcom ARM 处理器、512Mb RAM、GPU 支持的高清视频输出、用于键盘和鼠标的 USB 连接器、SD 内存卡用于文件系统、以太网端口以及显着的扩展能力。
市场上还有许多其他单板计算机,其中一些可能更适合特定应用。
RPi(有时被称为)是为教育用途而设计的,因此它非常符合本专栏的目的。如果您需要用于商业应用的电路板,我建议您查看其他 SBC,这些 SBC 专为大多数嵌入式系统所需的严格环境而设计,并且更适合您应用的特定要求。
RPi 拥有巨大的支持基础,www.raspberrypi.org)、杂志、许多在线博客和操作指南,甚至视频。我按照www.raspberrypi.org上的快速入门指南及其建议使用预装的 NOOBS SD 卡安装基于流行的 Debian 发行版的 Raspbian 发行版

  1. 首先,我按照这张照片所示连接了 RPi。

    遵循了使用 NOOBS SD 卡的说明,

  • 当 RPi 从 SD 卡启动时,它会显示许多可用的发行版。我选择了 Raspbian,这需要一段时间。

  • Raspbian 安装完成后,需要进行配置。我错误地指定了所有区域设置,而不仅仅是我居住的美国本地设置,这比安装分发版花费的时间更长。

  • 一旦 Raspbian 完成配置,我就可以使用用户名“pi”和密码“raspberry”登录。我发现我使用的 USB 键盘没有被正确识别,并且某些键显示错误,例如显示英镑符号 (£) 而不是键帽上的字符。可能有一些方法可以使用 Debian 配置工具之一来解决这个问题:

    sudo nano /etc/default/keyboard
    

    更改XKBLAYOUT=“gb” 以指定正确的国家/地区代码,在我的例子中,改为us.

  • 为了完成 RPi 的设置,我需要配置以太网端口。默认情况下,Raspbian 使用 DHCP 获取 IP 地址。我的 DHCP 服务器被配置为在每次提交请求时为 RPI 提供相同的 IP 地址。如果您没有将 DHCP 服务器配置为分配相同的地址,则它可能会在 RPI 启动时分配不同的地址,这可能会造成混淆。或者,您可以按照此处的说明为您的 RPI 分配一个静态 IP 地址:

    http: //elinux.org/RPi_Setting_up_a_static_IP_in_Debian

    这是启动到控制台登录屏幕的 RPI,由 Yocto 项目提供的小型 USB 电池供电:
    关于嵌入式开发的一些信息汇总:开发模型以及自托管开发(一)_第1张图片

  1. 在 Raspberry Pi 上进行开发

当您登录到 RPI 时,您会发现它是一个非常完整的发行版。为了与其教育目标保持一致,您会发现大多数开发工具都已经安装好了。它通常会启动到命令行模式,但您可以通过运行“startx”来启动 GUI。

让我们构建第 7 部分中的简单驱动程序

Raspbian 带有 Midori 和 NetSurf 网络浏览器。我使用 NetSurf 访问 Embedded.com 并导航到可以下载包含 myrandom.c 源代码的 ZIP 文件的位置。

http://www.embedded.com/design/embedded/source-code/4429789/myrandom-Linux-example-driver

  • 我将它保存在一个名为 myrandom 的子目录中,并使用“unzip myrandom.zip”来解压它。
  • 使用 vinano,在与第六部分所列目录相同的目录中创建一个新的 Makefile将“lkm.o”替换为“myrandom.o”。(我不建议从网页上剪切和粘贴文本,那样会拾取隐藏的字符。)
  • 然后我输入命令“make”。回应是“Make:对‘所有人’无事可做。”

您可能记得在第六部分中我提到您可能需要为您的库存内核安装内核开发文件如果没有安装这些,make 不知道该做什么

我们可以使用 Debian 的 apt-get 实用程序来安装内核头文件和构建目录

  • 首先,我想确保我运行的是最新版本的 Raspbian
  • 所以我先执行命令“sudo rpi-update”,等待它完成更新文件
  • 然后我重新启动树莓派

有许多网页讨论安装 Linux 头文件和内核源代码。一种简单的方法是使用 GitHub 上提供的 rpi-source 脚本。为了安装,我遵循了 rpi-source wiki [https://github.com/notro/rpi-source/wiki] 上的一组稍作修改的说明:

$ wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source$ sudo mv rpi-source /usr/bin/rpi-source$ sudo chmod +x /usr/bin/rpi-source $ rpi-source -q --tag-update

运行 rpi-source 之前,安装 ncurses 头文件,内核构建脚本需要这些标头。它们可以使用 apt-get 安装:

$ sudo apt-get install libncurses5-dev

现在运行 rpi-source:

$ rpi source

正如 wiki 上警告的那样,rpi-source 生成了一个投诉,即安装的 GCC 版本与构建内核所需的版本不同。我按照说明添加了 jessie 源存储库,并安装了 gcc-4.8:

$ sudo cat “deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi” > /etc/apt/sources.list.d/jessie.list
$ sudo apt-get update
$ sudo apt-install-y gcc-4.8 g++-4.8
$ sudo update-alternatives --install /usr/bin/gcc        gcc /usr/bin/gcc-4.6 20
$ sudo update-alternatives --install /usr/bin/gcc        gcc / usr/bin/gcc-4.8 50
$ sudo update-alternatives --install /usr/bin/g++      g++ /usr/bin/g++-4.6 20
$ sudo update-alternatives --install /usr/bin/g++      g++ /usr/ bin/g++-4.8 50

更新 GCC 后,我重新运行 rpi-source。运行了一段时间并下载了将近 120Mb 的源代码。幸运的是,我有一个快速的互联网连接。
然后Rpi-source 构建构建内核模块所需的支持程序
完成后,rpi-source 在 /home/pi 下创建了一个目录,在 /home/pi/linux 中创建了一个指向它的链接,并更新了 /lib/modules/uname -r/build 以指向 /home/pi/linux。
当所有这些设置完成后,我可以重新访问第七部分,并按照那里的说明进行操作:

$ cd ~/myrandom
$ make
$ sudo insmod myrandom.ko
$ sudo grep myrandom /var/log/messages

和以前一样,我使用 /var/log/messages 中列出的正确主编号(与以前不同)创建了 /dev/myrandom 节点。我对驱动程序进行了同样的小测试,它奏效了!

Raspberry Pi 与类似的单板计算机 (SBC)(如 BeagleBone 和许多其他计算机)一样,很像一台动力不足的笔记本电脑,具有独立的键盘和显示器。在 SBC 上进行 Linux 内核模块的应用或开发。优点是它是本机开发,就像在桌面系统上工作一样。缺点是 SBC 上可用的资源通常是有限的,这可能会导致构建时间过长或闪存卡上的空间不足。

上一篇:关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux
下一篇:关于嵌入式开发的一些信息汇总:开发模型以及自托管开发(二)

你可能感兴趣的:(c语言,mcu,c++,嵌入式硬件,单片机)