物联网3(嵌入式系统裸机开发)

1.嵌入式系统裸机

        嵌入式系统裸机是指只有硬件部分,没有安装任何软件的嵌入式系统。

2.裸机开发概念

        裸机开发是指在没有操作系统支持的情况下,直接对硬件进行编程的开发方式。在裸机开发中,开发者使用汇编语言或高级语言直接编写程序,这些程序将直接运行在硬件平台上,没有操作系统的介入。

        裸机开发由于没有操作系统的支持,开发者需要直接管理硬件资源,包括内存、CPU、外设等,以及需要自行解决开发中的错误处理、任务调度、资源管理等问题,这意味着开发者需要了解硬件的特性和工作原理,这为开发者增加了开发的复杂性和难度。

        尽管裸机开发具有一定的局限性,但裸机开发的程序通常具有较小的体积和较高的执行效率,因为它们不需要与操作系统进行交互,也没有额外的系统开销。同时,在一些对实时性要求极高、资源受限或需要直接控制硬件的场合,裸机开发能够提供更好的性能和灵活性。

3.裸机开发的特点

  • 直接操作硬件

        裸机没有操作系统,开发者需要直接操作硬件的寄存器以控制硬件。

  • 不能使用系统调用

        系统调用是操作系统提供给应用程序的一组编程接口,但裸机是没有安装操作系统的,因此系统调用无法被使用。

  • 使用物理内存地址操作数据

        如S5P6818开发板使用寻址空间0x40000000 ~ 0xBFFFFFFF范围内的地址对DDR3进行读写操作。

  • 使用Normal I/O地址控制与外设的数据传输

        如S5P6818开发板使用寻址空间0xC0000000 ~ 0xDFFFFFFF范围内的地址控制与外设的数据传输。

  • 编译和链接分步完成

        程序的编译链接过程分为预处理、编译、汇编和链接四个过程,为方便通常会将四步合成一步。但在裸机开发中,由于裸机没有操作系统管理内存,因此需要在链接时手动指定程序在内存的起始地址,这样预处理、编译和汇编可以三步合成一步执行,链接单独一步执行。

  • 不支持ELF格式

        程序编译链接成功后,会生成ELF格式的可执行文件,但裸机不可运行ELF文件,这是因为ELF文件包含了许多与操作系统交互的信息,如动态链接、符号解析等,这些在裸机环境中是不可用的。

4.交叉编译器

        交叉编译器是一种特殊的编译器,它用于在一个平台上生成可在另一个平台上运行的代码。这意味着,开发人员可以在一个操作系统(例如,Linux)上使用交叉编译器来编译代码,而生成的可执行文件或库则可以在完全不同的操作系统或硬件架构(例如,ARM架构的嵌入式系统)上运行。这种能力使得交叉编译器在裸机开发、嵌入式系统开发、操作系统开发以及跨平台软件开发中非常有用。下面是交叉编译器的安装步骤:

第1步:获取交叉编译器

        交叉编译器下载地址:点击下载  提取码:7lyd

第2步:安装交叉编译器

  • 执行如下命令解压压缩包,并移动交叉编译器文件
tar xvf arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2
mkdir /usr/local/arm-linux-gcc-4.6.4
cd opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4
cp -r * /usr/local/arm-linux-gcc-4.6.4
  • 执行vim ~/.bashrc命令,并在文件尾部添加如下配置
export PATH=/usr/local/arm-linux-gcc-4.6.4/bin:$PATH
  • 执行source ~/.bashrc命令使新添加的配置生效

第3步:执行arm-linux-gcc -v命令验证交叉编译器是否安装成功,安装成功如下图:

5.SecureCRT

        SecureCRT是一款用于链接远程系统的工具。可以使用SecureCRT链接开发板,通过SecureCRT操作开发板。

        SecureCRT下载地址:点击下载

SecureCRT的安装和破解教程请自行百度。

5.1.SecureCRT链接开发板

第1步:链接电脑与开发板

  • 使用9针串口线或USB转9针串口线一端链接电脑和另一端链接开发板UART0串口

  • 查看使用的端口,查看步骤如下

第2步:配置串口

  • 打开SecureCRT,点击“File” → “Quick Connect…”

  • 配置参数,如下图

Port请选择第①步使用的端口。参数配置完成后点击“Connect”按钮。

第3步:启动开发板验证SecureCRT与开发板是否链接成功

开发板启动后,SecureCRT若是打印信息,则说明连接成功。

打印信息如上图(上图只是部分信息的截图)

5.2.SecureCRT常用操作介绍

5.2.1.SecureCRT与开发板快速链接

        在串口配置成功后,会在如下图处记录。双击“Serial-COM1”会打开会话窗口并链接。

5.2.2.修改SecureCRT会话窗口的背景和字体

6.裸机烧写程序

        裸机烧写程序是指将裸机可运行的二进制文件烧写到开发板的过程。裸机烧写程序通常需要使用特定的工具,这些工具根据目标硬件、开发环境和需求的不同而有所差异。常见的裸机烧写程序工具有JTAG工具、SD卡烧写工具和U-Boot工具。

6.1.JTAG烧写工具

        JTAG是一种硬件调试接口标准,它允许开发者直接访问和控制目标硬件的寄存器和存储器。常用的JTAG工具有OpenJTAG、JLink等。

6.2.SD卡烧写工具

        对于某些开发板,可以通过SD卡来烧写裸机程序。例如,MiniTools工具可以用于烧写系统或裸机程序到TQ210等开发板的SD卡中。此外,也有专门的SD卡烧写工具,如SDCardWriter,它类似于Linux中的dd命令,可以将裸机程序烧写到SD卡的指定地址。

6.3.U-Boot烧写工具

        U-Boot是一个开源的引导加载程序(Bootloader),它可以在裸机上运行并加载操作系统或裸机程序,U-Boot的更多介绍请查看《物联网之嵌入式系统启动》文章的“嵌入式系统启动过程”、“Bootloader种类”和“U-Boot移植”章节。

        本文章使用此工具烧写裸机程序。

7.裸机开发过程

7.2.过程

第1步:创建C源文件,如native.c

第2步:编写裸机程序

第3步:执行如下命令编译C源文件生成目标文件

arm-linux-gcc -c -o <目标文件名称>.o <C源文件名称>.c

第4步:执行如下命令链接目标文件生成可执行文件

arm-linux-ld -o <可执行文件名称> <目标文件名称>.o -Ttext=<程序在内存的起始地址>

第5步:执行如下命令去除elf格式生成裸机运行的二进制文件

arm-linux-objcopy -O binary -S <可执行文件名称> <二进制文件名称>.bin

第6步:通过SecureCRT将裸机运行的可执行文件烧写到开发板

  • 启动开发板,在uboot三秒倒计时结束前按下空格键进入uboot模式

  • 在开发板的uboot模式下输入如下命令进入待烧写模式
loadb <二进制文件烧写到内存的地址>
// <二进制文件烧写到内存的地址>需与<程序在内存的起始地址>相同

若是开发板没有loadb命令,请查看本文章的“启用loadb命令”章节。

  • 选择二进制文件,步骤如下图

第7步:执行如下命令运行程序

go <程序在内存的起始地址>

第8步:查看运行结果

7.2.示例

第1步:创建native.c文件

第2步:编写裸机程序,代码如下

int _start(int argc, char *argv[])
{
    // 0xC00A1020地址映射到向UART0串口发送数据的寄存器
    // 使数据通过UART0窗口发送到SecureCRT
    // (如何查找寄存器的映射地址会在后续的文章中介绍)
    unsigned char *p = (unsigned char *)0xC00A1020;
    unsigned char *str = "hello world!\n";

    while(*str){
        *p = *str++;
    }

    return 0;
}

第3步:执行如下命令编译C源文件生成目标文件

arm-linux-gcc -c -o native.o native.c

第4步:执行如下命令链接目标文件生成可执行文件

arm-linux-ld -o native native.o -Ttext=0x48000000

第5步:执行如下命令去除ELF格式生成裸机运行的二进制文件

arm-linux-objcopy -O binary -S native native.bin

第6步:通过SecureCRT将裸机运行的可执行文件烧写到开发板

  • 启动开发板,在uboot三秒倒计时结束前按下空格键进入uboot模式

  • 在开发板的uboot模式下输入如下命令进入待烧写模式
loadb 0x48000000
  • 选择二进制文件,步骤如下图

第7步:执行如下命令运行程序

go 0x48000000

第8步:查看运行结果

8.启用loadb命令命令

8.1.查看开发板是否已启用loadb命令

第1步:启动开发板,在uboot三秒倒计时结束前按下空格键进入uboot模式

第2步:输入help命令查看是否有loadb命令

8.2.启用loadb命令

        loadb命令是U-Boot的命令之一,启用loadb命令需要先了解U-Boot,了解U-Boot请查看《物联网之嵌入式系统启动》文章的“U-Boot移植”章节。

第1步:执行vim common/cmd_load.c命令查看loadb命令的程序是否已实现

第2步:执行vim include/configs/x6818.h命令,添加如下代码

#define CONFIG_CMD_LOADB 1

第3步:根据《物联网4(嵌入式系统启动过程)》文章的“U-Boot编译”和“U-Boot烧写”章节对U-Boot编译并烧写

第4步:进入uboot模式下,执行help命令查看loadb命令是否已启用

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值