您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    OS开发快乐喜欢者福利:树莓派上编译C言语,特地掌握一波硬件知识
    时间:2020-09-29 21:10 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    树莓派虽小,小到仅有信誉卡大小,但功用却和普通电脑无异,可以将其衔接电视、显示器、键盘鼠标等设备运用。也可以处置文字、电子表格、媒体甚至是游戏。那么这个神奇的小电脑,怎样用它来停止编程呢?下面引见一篇应用树莓派停止裸机编程的教程,特地学习一下接口、硬件等知识。

    OS开发快乐喜欢者福利:树莓派上编译C言语,特地掌握一波硬件知识

    近日,有人在 GitHub 上开源了一个关于树莓派的教程。不同于以往的树莓派开发,这篇教程的中心内容是讨论如何在树莓派上停止裸机编程。

    教程地址:https://github.com/bztsrc/raspi3-tutorial

    在树莓派 3 上停止裸机编程

    该系列教程面向那些想要编译本人的树莓派裸机运用顺序的人,详细目的受众是那些对树莓派硬件不熟习,但在专业时间又快乐喜欢 OS 的开发人员。在这篇教程里,作者给出了一些示例来完成基本的操作,比如:将代码写入串行控制台、从串行控制台中读取按键、设置屏幕分辨率并绘制到线性帧缓冲区。此外,作者还展现了如何获取硬件的序列号、硬件支持的随机数,以及如何从启动分区读取文件。

    需求留意的是:这篇教程没有触及编写 OS。诸如内存管理、虚拟文件系统、完成多义务处置之类的主题也不会引见。该教程将重点引见与硬件的接口,而不是关于 OS 的实际。此外,该教程假定你具有一定的 GNU/Linux 知识,对编译顺序、创立磁盘和文件系统镜像有一定的了解。

    关于为何选择树莓派 3,作者给出了解释:首先,它既便宜又容易买到。第二,它是 64 位的,拥有十分大的地址空间。第三,它只运用 MMIO,这使得编程更容易

    该教程运用 C 言语停止开发,由于 C 言语可以直接对硬件停止开发。

    预备知识

    在末尾前,你将需求在 FAT 文件系统上运用交叉编译器(有关详细信息,请参见 00_crosscompiler 目录)和带有固件文件的 Micro SD 卡。

    每个目录都有一个 Makefile.gcc 以及 Makefile.clang。确保 Makefile 符号链接依据你本人选择的交叉编译器指向版本。

    作者给出的建议是买一个 Micro SD 卡 USB 适配器(许多制造商都会提供这种适配器的 SD 卡),这样就可以像 USB 一样将该卡衔接就任何台式计算机上,而不需求特殊的读卡器接口(虽然如今很多笔记本电脑都有这种接口)。假设你不喜欢 dd 命令,你也可以选择 USBImager,这是一个复杂的 GUI 运用顺序,具有可移植的可执行文件,可用于 Windows、MacOSX 和 Linux 操作系统。

    Micro-SD 卡 USB 适配器。

    在带有 LBA FAT32(类型 0x0C)分区的 SD 卡上创立 MBR 分区方案,并对其格式化,然后将 bootcode.bin、start.elf 以及 fixup.dat 复制到其中。或许,你可以下载一个 raspbian 镜像,dd 命令烧写到 SD 卡,mount 挂载并删除不必要的. img 文件。不管你喜欢哪种办法,重点是你将运用这些教程创立 kernel8.img,而且必须复制到 SD 卡的根目录中,后者不应该存在其他. img 文件。

    建议运用 USB 串行调试电缆。把它衔接到 GPIO 引脚 14/15,然后在电脑上按如下方式运转 minicom:

    USB 串行调试电缆

    仿真

    不幸的是,官方的 qemu 二进制文件还不支持树莓派 3。但作者曾经完成了,并将很快发布(更新:在 qemu2.12 中提供)(https://wiki.qemu.org/ChangeLog/2.12#ARM)。在此之前,你必须从最新的源代码编译 qemu。编译后,可停止如下操作:

    或许:

    -M raspi3:让 qemu 仿真树莓派 3 硬件。

    -kernel kernel8.img:告知要运用的内核文件名。

    -drive file=$(yourimagefile),if=sd,format=raw:在第二种状况下,该参数为 SD 卡镜像,它也可以是标准的 rasbian 镜像。

    -serial stdio

    -serial null -serial stdio:将模拟的 UART0 重定向到运转 qemu 的终端的标准输入 / 输入,以便显示发送到串行线路的一切内容,并且 vm 会接纳终端中键入的每个键。该操作仅适用于教程 05 及更高版本,由于默许状况下不会重定向 UART1。为此,必须添加一些相似于 - chardev socket,host=localhost,port=1111,id=aux -serial chardev:aux 的参数,或许复杂地运用两个 -serial 参数。

    硬件资源

    下面复杂引见一下所需硬件资源,BCM2837 SoC 芯片。包括:

    VideoCore GPU;

    ARM-Cortex-A53 CPU (ARMv8);

    MMIO 映射外部设备。

    幽默的是,CPU 不是主板上的主处置器。当它通电后,第一个 GPU 运转。现在始化完成时,经过执行 bootcode.bin,它将加载并执行 start.elf。这不是一个 ARM 可执行文件,而是专门为 GPU 编译的。比较有意思的是,start.elf 寻觅不同的 ARM 可执行文件,都以 kernel 扫尾,以. img 开头。由于要在 AArch64 形式下对 CPU 停止编程,因此只需求 kernel8.img,这也是最后一个要查找的。加载后,GPU 触发 ARM 处置器上的复位线,末尾在地址 0x80000(或更准确地说是 0)处执行代码。

    RAM(1G Raspberry Pi3)在 CPU 和 GPU 之间共享,这意味着一个可以读取另一个写入内存的内容。为了避免混杂,需求定义好 mailbox 接口。CPU 将音讯写入 mailbox,并通知 GPU 读取它。GPU(知道音讯完全在内存中)解释它,并将照应音讯放在同一个地址。CPU 必须循环拜访内存以知道 GPU 何时完成,然后它才能读取照应。

    (责任编辑:admin)