2.5|物联网iot应用系统设计|嵌入式Linux操作系统EOS|思维导图|归纳整理·下部分

上部分: https://blog.csdn.net/m0_57656758/article/details/128888575?spm=1001.2014.3001.5501

1 建立基于arm+linux的嵌入式开发工具链的过程

根据生成嵌入式开发工具链的流程图简述在redhat linux9.0环境下建立基于arm+linux的嵌入式开发工具链的过程。

(1)选定软件版本

选用适当的版本,找到适合主机和目标板的组合。

(2)建立工作目录

(3)设置输出环境变量

(4)内核头文件的配置

内核头文件的配置是建立工具链的第一步。它与后面将要执行的其他步骤有着类似性,大多需要执行下面几步操作:

解压缩包、为跨平台开发设定包的配置、建立包、安装包;

其中,进行配置时,变量ARCHCROSS_COMPILE的值与目标版的架构类型有关;

如果使用PPC目标板,则:ARCH=ppc CROSS-COMPILE=pcc-linux-

如果使用i386目标板,则:ARCH=i386 CROSS-COMPILE=i386-linux-

本例中,配置的具体参数是:

$make ARCH=arm CROSS-COMPILE=arm-linux- menuconfig

配置工具选择:

make menuconfig是以文本菜单方式配置;

make xconfig是以图形界面方式配置;

make config是纯文本界面方式配置;

(5)设置binutils二进制工具程序

binutils句中的工具常用来操作二进制目标文件。该包中最重要的两个工具就是GNU汇编器as链接器ld。因为是交叉编译器,还不需要目标板的系统头文件,所以需要使用-without-headers这个选项。

-enable-language=c用来告诉配置脚本,需要产生的编译器支持何种语言,现在只能支持c语言。

(6)初始编译器的建立

开始只能建立支持c语言的引导编译器,因为缺少c链接库(glibc)的支持。等到glibc编译好之后,可以重新编译gcc并提供完整的c++支持。

(7)建立c库(glibc)

这一步是最为繁琐的过程。目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为c链接库,但是glibc实际产生很多链接库,其中之一是c链接库libc。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找c链接库的替代品,比如uclibc。

(8)完整编译器的设置

为目标板安装支持c和c++的完整编译器。这个步骤相对于前面的建立过程需要简单一些。

(9)完整工具链的设置

2 编写程序、开发链编译、gdb调试

在文本编辑器emacs中编写一个简单的c程序,使用嵌入式开发工具链编译,并用gdb调试的例子。

$cd $PRJROOT/program

$emacs hello.c

在文本编辑器emacs中编写:

#include
int main()
{
    int i;
    for(i=1;i<9;i++)
        printf("Hello World%d times!\n)
}

保存退出!

$gcc -g hello.c -o hello
$gdb
(gdb)file hello
(gdb)l


include
int main()
{
    int i;
    for(i=1;i<9;i++)
        printf("Hello World%d times!\n",i);
}
(gdb)r
(gdb)q
$arm-linux-gcc -g hello.c -o hello-linux
$file hello-linux
hello-linux:ELF 32-bit LSB excutable,ARM,version 1(ARM),for GNU/Linux2.0.0,
dynamically linked(uses shared libs), not stripped

上面的输出说明已成功编译了一个能在arm体系结构下运行的hello-linux,证明编译工具安装成功了。

3 一套完整的开发工具

一套完整的开发工具应至少包括以下三种工具:编辑工具、编译工具和调试工具。如果是大型项目,还要有配置工具项目管理工具

4 开发环境种类

开发环境分为基于文本的开发平台:vim/emacs+gcc+gdb;

集成开发平台(ecipse+CDT插件)

5 登陆Linux系统

当登陆Linux系统,并打开终端。根据登入的身份,进入终端后会看到如下提示符:

[root@tty/]# 或pear@ubuntu:~$

其中,root和pear表示登陆用户。其中,root表示登陆用户是超级用户,pear表示登陆用户是普通用户。Tty和ubuntu均表示网络中主机名,/和~均表示登陆用户的当前目录(当登陆用户,登陆主机名以及进入目录不同时,相应的项也会改变),#表示超级用户root,$表示一般用户。

6 普通pc的引导装载程序组成

普通pc的引导装载程序组成:BIOS和BootLoader。

BIOS负责完成硬件检测和资源分配。BIOS完成任务后,会将控制权交给系统的BootLoader;

BootLoader将操作系统内核从硬盘上读入RAM中,然后跳转到内核的入口点,从而启动操作系统。

BootLoader就是在运行操作系统内核所运行的一段小程序。将系统的软硬件设置为一个合适的环境,以便为最终调用操作系统内核做好准备。

嵌入式系统由于硬件资源的限制,通常没有像BIOS那样的固定程序,有的嵌入式cpu也会内嵌一段短小的启动程序。整个系统的加载启动全部由BootLoader来处理。

7 BootLoader相关

BootLoader定义

BootLoader就是运行在操作系统内核之前所运行的一段小程序。将系统的软硬件设置为一个合适的环境,以便最终调用操作系统内核做好准备。

BootLoader基本功能

对系统的软硬件进行初始化;

建立内存空间的映射图;

将系统的软硬件设置为一个合适的环境,以便为最终调用系统内核做好准备。

BootLoader操作模式

大多数BootLoader包含两种不同的操作模式:“启动加载模式”和“下载模式”。

(1)启动加载(bootloading)模式:也称为“自主”autonomous模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。在嵌入式产品发布的时候,BootLoader必须工作在这种模式下。

(2)下载(down loading)模式:该模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机(host)下载文件。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。

BootLoader与主机间的通信方式

主机和目标机之间一般通过串口建立连接,BootLoader软件在执行时通常会通过串口来进行输入输出。传输协议通常是xmodem/ymodem/zmodem协议中的一种。但是串口传输的速度是有限的。因此可通过以太网连接并借助TFTP协议来下载文件。

BootLoader总体流程

由于BootLoader的实现依赖于 cpu的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。

依赖于cpu体系结构的代码通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,一般不会超过256byte;由于是在内核启动前运行的第一个程序,因此它是在flash上运行的;有的文献把这一阶段称为“Flashloader”阶段。

stage2的代码量大,有上千行;通常用c语言来实现,多数时候需要嵌入汇编语言,可以实现复杂的功能;代码具有更好的可读性和可移植性;在SDRAM等随机存储器中运行;这一阶段是真正的“BootLoader”阶段。

8 arm体系中控制程序的执行流程

在arm体系中通常有3种方式控制程序的执行流程:

(1)在正常程序执行过程中,每执行一条arm指令,程序计数器pc的值加4个字节;每执行一条thumb指令,程序计数寄存器pc的值加2个字节。整个过程按序执行。

(2)通过跳转指令,程序可以跳到指定的地址标号处执行。或者跳转到相应的异常中断处理程序处执行。

(3)当异常中断处理程序执行完成后,程序返回到发生中断的指令的下条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。

2.5|物联网iot应用系统设计|嵌入式Linux操作系统EOS|思维导图|归纳整理·下部分_第1张图片

9 对arm-linux内核裁剪的原因

进行嵌入式系统开发时,由于受到硬件资源和环境等因素的影响,必须对linux内核进行裁剪,以适应硬件的需求或者某些环境特殊的实际要求。

10 linux内核的配置系统由以下3部分组成:

(1)makefile:linux内核源代码中的makefile定义linux内核的编译规则;

(2)配置文件config.in:给用户提供配置选择的功能;

(3)配置工具:包括配置命令解释器和配置用户界面。这些配置工具都是使用脚本语言,如Tcl/TK、Perl编写的。

11 内核空间和用户空间的概念以及空间内应用程序开发的差异

内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间称为内核空间

应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,不能直接访问硬件,还有其他一些使用限制。

(1)内核编程时不能访问c库;

(2)内核编程时必须使用gnu c;

(3)内核编程时缺乏像用户空间那样的内存保护机制;

(4)内核编程时浮点数很难使用;

(5)内核只有一个很小的定长堆栈;

(6)内核支持异步中断、枪战和smp(smp,symmetric multi-processor,对称式多处理器),因此须注意同步和并发;

(7)要考虑可移植性的重要性。

12 BootLoader启动流程示意图

2.5|物联网iot应用系统设计|嵌入式Linux操作系统EOS|思维导图|归纳整理·下部分_第2张图片
2.5|物联网iot应用系统设计|嵌入式Linux操作系统EOS|思维导图|归纳整理·下部分_第3张图片

13 linux c程序开发的流程

以“Hello World!”程序为例。简述进行嵌入式linux c语言简单应用程序开发的流程。

编写源程序、编译、调试并在嵌入式设备上运行。

2.5|物联网iot应用系统设计|嵌入式Linux操作系统EOS|思维导图|归纳整理·下部分_第4张图片

(2023年2月14日 21:46首次发布)

你可能感兴趣的:(操作系统operating,sys,linux,运维,服务器)