裸机工程开发调试

x6818开发板 sudo tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local/arm 交叉编译工具的路径:/usr/local/arm/arm-2014.05/bin。得到这个文件:/home/china/x6818_linux_180209/linux/bootloader/u-boot-2014.07/tools/mkimage。华为设计芯片的公司:麒麟 990 ,麒麟1000 (找台积电生产) 阅读详情

裸机工程开发调试

嵌入式系统的组成

嵌入式系统设备遵循自底向上的基本结构

嵌入式微处理器

image-20200630163206835

嵌入式操作系统

image-20200630161820279

外围硬件设备

image-20200630163419089

用户应用程序

image-20200630163326782 image-20200630164423794 image-20200630164440760

###s5p6818系统主要资源

s5p6818是三星公司推出的64位RISC微处理器, 其CPU采用的是ARM CortexA53内核, 基于ARMv7和ARMv8指令集架构

八核, 保守主频1.4GHZ, 向下完全兼容4418核心, 可以做到嵌入式产品硬件的无缝升级

s5p6818结构框图如下:

image-20200630164541935

s5p6818试验仪介绍

s5p6818核心板资源介绍:

image-20200630164859509 image-20200702212432829

s5p6818寻址空间介绍

s5p6818寻址空间采用统一编址方式进行管理

寻址空间映射图:

image-20200630164715355

image-20200630165452080

Normal I/O就是我们常说的特殊功能寄存器

GPIO等内容在这里进行配置

image-20200630170151008

iROM和iRAM具体分布:

image-20200630170121195

Internal ROM启动, 是可以由BootMode相关引脚选择的多种程序加载方式, 即是从内部还是从外部等途径来加载程序(P94)

image-20200630170108754

P93和P95决定了外部程序的加载顺序

RST_CFGn对应的引脚通过查表和原理图来最终确定程序加载启动流程

裸机开发调试

常用GNU工具介绍

GNU组织不仅给我们带来了许多开源软件工程, 还带来了强大的GNU编译工具

GNU提供的常用工具包括:

  • 预处理器 cpp

  • C编译器 gcc

  • C++编译器

  • g++汇编器 as

  • 链接器 ld

  • 二进制工具集 objcopy、 objdump、 ……

  • ls /usr/local/arm/4.3.2/bin/

下面介绍几个常用的工具

nm : 符号显示器

显示符号 $nm -n main_elf

显示内容:

  • 第一列为 符号地址

  • 第二列为 符号所在段

  • 第三列为 符号名称

image-20200630170831625

各段含义 :

段描述
b / B.bss(b静态 / B非静态)未初始化变量
d / D.data(d静态 / D非静态)已初始化变量
r / R.rodata(r静态 / R非静态)只读数据段
t / T.text(t静态 / T非静态)函数
A不可改变的绝对值
C.o中未初始化非静态变量
N调试用的符号
U表示符号只有声明没有定义
W一个弱符号,尚未被明确标记为弱对象符

nm符号显示器总结 ;

静态变量和非静态的全局变量, 所分配的段只和是否初始化有关, 如果初始化了则被分配 在.data段中, 否则在.bss段中

函数无论是静态还是非静态的, 总是被分配在.text中,小写 t 表示静态, 大写 T 表示非静态

函数内的局部变量由于是分配在栈上的, 所以在 nm 中是看不到他们的

objdump: 显示二进制文件的信息

  • 查看所有段信息 $objdump -h main_elf

  • 查看文件头信息 $objdump -f main_elf

  • 查看反汇编 $objdump -d main_elf

  • 查看内嵌反汇编 $objdump -S -d main_elf

objcopy : 段剪辑器

  • 去除 elf 格式信息 $objcopy -O binary -S main_elf main.bin
LMA和VMA

从源代码到可执行的代码,一般要经过一下几个过程:

源代码编辑 -> 编译 -> 链接 -> 装载 -> 执行

编译

简单的说就是用编译工具,将你的源码变成可以执行的二进制文件,即目标文件,当然只是对应某一种硬件平台,比如x86,arm

链接

就是将多个目标文件合并为一个目标文件,称作可执行文件。

每个目标文件都包含一连串的section,最常见,最基础的有:

.text: 代码段, 就是cpu要运行的指令代码

.data: 数据段, 程序中的一些数据,如初始化的全局变量,静态变量等都放在这个段里

.bss: 未初始化段,记录了程序里未初始化的全局变量,就相当于只记录对应的名字,留着程序运行前去初始化为0,所以此处不占用具体空间。打个比方,只记录人名,没有人站在这里.

而对应的.text 和.data段,都是既有人名(函数或者变量名),又占用对应的地方(包含具体空间记录到底, 是什么指令代码和数据的数值是多少)

section一般分为loadable和allocatable 通俗点说就是:

loadable,可加载 , 就是,原来目标文件里面包含对应的代码或数据,所以,装载器要把这些内容,load 到对应的地址,以便程序可以运行;

allocatable, 可分配的 ,最简单理解就是上面的**.bss段**,那里记录了人名,到时候,你要给这些人名分配空间给你站的地方,对应着也就是变量所要的具体内存空间。

对于目标文件中的 loadable 或 allocatable的section,其都有两个地址:VMA 和 LMA

LMA(Load Memory Address):内存装载地址

load, 装载

如果想要使你的程序(即由你的源码,通过编译器的编译,链接器的链接,形成的可执行文件), 能做内存里面运行,那么肯定要涉及到一点,就是,把你的程序从常见的存储硬盘里面搬到内存里面,然后才有可能运行。而这里的装载就是这这个意思。就是把程序从硬盘里面装载到内存里。

对应的,放到内存的什么地方?就是LMA。详细点说,就是把其中的.text代码段,.data数据段等内容,搬到,也就是copy到内存的LMA地址处。

内存

程序运行的本质,就是cpu读取到指令,然后执行。

如果想要运行你的程序,首先,你应该把你对应的指令放到合适的位置,cpu才能读到,才能执行。此处合适的地方,有人想到,直接放到硬盘里,cpu过来读取,然后执行不就可以了嘛,还不用这么麻烦将(指令)代码搬来搬去的,多省事。但是实际上,系统就是这么“笨”地搬来搬去,原因在于,从硬盘上直接读取指令,速度比直接从内存要慢很多倍(一般pc上的内存是各种各样的RAM,如ddr,但此处统称为memory/内存),所以系统才会不嫌麻烦,把代码拷贝到内存里面去,然后从内存里面读取指令,再执行,这样速率会高很多。

所以简单的说就是,为了总体效率,对于普通系统,比如pc,程序的执行都是在memory,内存里面执行的。

总结:

代码被装载到内存的某个地方,那个地方的地址,就是LMA

VMA:Virtual Memory Address 虚拟内存地址

简单的说就是,你程序运行时所对应的地址。

此处所谓的虚拟,一般来说,指的是启用了MMU之后,才有了虚拟地址和实地址。此处,我们可以简单的理解为,就是内存的实际地址即可。

程序运行前,要把程序的内容,拷贝到对应的内存地址处,然后才能运行。

总结:

代码运行的时候,此时对应的地址,就是VMA

在多数情况下,LMA和VMA是相等的

理解:

如果是普通pc电脑,也就是上面说的,大多数情况下,LMA和VMA是一样的,也就是,程序被加载到内存的什么地方,也就在什么地方运行。

程序被放到了ROM中,比如设置位只读的Nor Flash中,那么LMA的地址就是Nor Flash的地址。

随便举例为0x1000000,而程序要运行时的地址是内存地址,比如0x30000000,也就是VMA是0x30000000,这时候,就要我们自己保证,在程序运行之前,把自己的程序,从LMA = 0x10000000拷贝到VMA = 0x30000000 处,然后程序才可以正常运行。

有人会问,反正对应ROM来说,CPU也是可以直接从ROM里面读取代码,然后运行。为何还要前面提到的,弄个LMA和VMA不同,搬来搬去呢?因为ROM,顾名思义,是只读的,只能读取,不能写入。

而程序中的代码段,由于只是被读取,不涉及到修改写入,是没问题的。但是对于数据段和bss位初始化段来说,里面的所有的程序的变量,多数都是在运行的时候,不仅要读取,而且要被修改成新的值,然后写入新的值,所以,如果还是放到ROM里面,就没法修改写入。

而且,另一个原因是,cpu从ROM,比如常见的Nor Flash中读取代码的速度,要远远小于从RAM,比如常见的SDRAM中读取的速度,所以,才会牵涉到将代码烧写到ROM里面,然后代码的最开始,将此部分程序reaload,重载,也就是从此处的ROM的地址,即LMA,重新拷贝到SDRAM中去,也就是VMA的地方的地方,然后从那里运行。

关于LMA和VMA

Linker,连接器的作用:

1、将LMA写到(可执行的)二进制文件里面去

2、解析符号。即,把不同的符号,根据符号表中的信息,转换成对应的地址。此处只涉及VMA,即程序运行时的地址。

Loader,装载器的作用:

1、从二进制文件中读出对应的段的信息,比如text,data,bss等段的信息

将内容拷贝到对应的LMA的地址处,所谓,装载(对应内容)到装载地址(LMA)

2、如果发现VMA != LMA, 即 程序运行时候的地址和刚刚把程序内容拷贝到的地址LMA不一样,那么就要把对应的内容,此处主要是data,数据段的内容,从刚刚装载到的位置,LMA处,拷贝到VMA处,这样,程序运行的时候,才能够在执行的时候,找到对应VMA处的变量,才能找到对应的值,程序才能正常运行。

程序的编译链接过程

最后一步是将目标文件交给链接器链接生成可执行文件

  • gcc -E -o main.i main.c
  • gcc -S -o main.S main.i
  • gcc -c -o main.o main.S
  • gcc -o main_elf main.o
image-20200630174113078 image-20200630174207491

一个标准应用程序通常都由链接器采用默认链接脚本(arm-linux-ld --verbose)将“ 用户程序” 和“ 库” 共同链接生成可执行程序

假如不采用系统给定的默认链接脚本, 我们应该怎样进行链接 :

ld -o main main.o

结论:

链接过程中需要一个标号( _start ) 作为程序入口

标号(_start)的作用是: 将用户程序从汇编带到了C语言程序入口, 即main()函数, 从此开始我们的应用程序之旅

_start标号所在的汇编文件在编译工具链下面:

4.3.2/arm-none-linux-gnueabi/libc/usr/lib/crt1.o

我们可以自己实现**_start入口, 或者重新指定一个新的入口**

手动链接并生成可执行文件过程如下:

直接通过参数指定程序入口和段地址:

arm-linux-ld -Ttext=0x30000 -Tdata=0x40000 -e main -o app head.o main.o

通过链接脚本来指定程序入口和段地址:

arm-linux-ld -Tapp.lds -o app head.o main.o
//连接文件app.lds为:
ENTRY(main)
SECTIONS
{	//“*”号指所有目标, 可以指定.o目标文件, 多个用空格隔开
    .=0x30000;	//“.”指的是当前位置
    .text:{*(.text)}
    .=0x40000;
    .data:{*(.data)}
    .bss:{*(.bss)}
}
裸机工程构建及调试

裸机程序完整编译过程:

  • gcc -c -o main.o main.c
  • gcc -c -o uart.o uart.c
  • ld -Tapp.lds -o app_elf main.o uart.o
  • objcopy -O binary -S app_elf app.bin

裸机工程管理文件

  • 各目录Makefile

  • 链接脚本app.lds

  • 规则文件Rules.mk

最后将app.bin下载到裸板内存中并执行

  • 工程实例: 00-pro-demo
  • 下载命令: update app
  • 运行命令: go
  • 退出程序: crtl+c

基础代码中的Makefile文件

# 剪除elf格式信息, 这样才能在裸机状态下执行
app.bin:$(OBJS)
	$(LD) -v $(LFLAGS) -o app_elf $(OBJS) $(ARMLIBS)
	$(OBJCOPY) -O binary -S app_elf $@
	$(OBJDUMP) -D -m arm app_elf > app.dis
	$(NM) -v -l app elf > app.map

构建嵌入式开发平台

嵌入式 linux 软件系统由 bootloader、kernel、root filesystem 构成,如下:

Bootloader(一次固化) + 内核(多次更新) + 根文件系统制作

资料拷贝:

资料存放路径如下:

6_平台\linux_resource\3.4.39_tools_

6_平台\3.4.39_tools

将上面路径下用到的文件拷到自己虚拟机中,存放在自建目录下:

例如(推荐):/home/edu/share/linux_platform2.6.35.7/

注意: 以上资料一定要拷贝放入 linux 虚拟机目录下, 且目录有一切权限,一定不能放到 /mnt/hgfs 所映射的磁盘中

安装交叉编译器 arm-linux-gcc-4.3.2

进入虚拟机中找到你上步自建的目录中, 找到 arm-linux-gcc-4.3.2.bz2 文件:

cd /home/edu/share/linux_platform2.6.35.7/  

查看自己的虚拟机是否安装交叉编译工具链:

echo $PATH

image-20200702223501699

安装以下交叉编译工具: (4.3.2: 用于交叉编译各种镜像)

# 如果有这个目录就不用建了
mkdir –p /usr/local/arm 

sudo tar jxvf arm-linux-gcc-4.3.2.bz2 –C /usr/local/arm

# 或 将 arm-linux-gcc-4.3.2.bz2 拷贝到/usr/local/arm 直接解压
cd /usr/local/arm
sudo tar jxvf arm-linux-gcc-4.3.2.bz2

其中 4.3.2 需要假加入环境变量

sudo vim ~/.bashrc
# 在最后加入下面这行
export PATH=/usr/local/arm/4.3.2/bin:$PATH

# 使环境变量设置立即生效
source ~/.bashrc

配置编译 u-boot

# 在虚拟机中解压 u-boot-2014.07.tar.bz2 文件
tar jxv 7.tar.bz2

# 进入解压后的文件目录中
cd u-boot-2014.07

# 编译前清除旧的配置文件
make distclean

# 生成新的配置文件
make x6818_config

# 编译生成 u-boot 可执行文件
make
# 在当前目录下会生成一个 ubootpak.bin 的文件
# 将 tools 目录下生成的 mkimage 文件拷贝到/bin 目录中, 后面用于制作 u-boot 所需格式的内核
# 这一步也可以不做, 主要用于生成 uImage
cp u-boot-2014.07/tools/mkimage /bin 

配置编译内核

# 在虚拟机中解压 kernel6818_3.4.39.tar.gz 文件
tar zxvf kernel6818_3.4.39.tar.gz
# 进入解压后的文件目录
cd kernel-3.4.39
# 清除旧的内核配置文件
make distclean
# 重命名内核配置文件
cp sp_config_2017.03.20 .config
# 配置内核
make menuconfig
# 注意: 如果执行“make menuconfig” 提示找不到“ncurses 库”, 那么执行更新命令:
sudo apt-get install libncurses5-dev

# 如果无法连接到 172.20.220.71 , 将虚拟机设置成了静态 IP, 首先将 IP 设置为自动获取, 然后禁用一下虚拟机网络连接再启动即可
# 由于采用的是配置好的脚本, 因此对配置界面不用做任何修改, 直接保存退出即可。

image-20200702225217478

# 生成内核镜像文件
# 在 arch/arm/boot 下会生成 uImage 文件
make uImage
# 或 
make uImage -j2

# 进入内存镜像所在目录
cd arch/arm/boot

# 拷贝 temp.tar.bz2 到内存镜像所在目录 arch/arm/boot 并解压
tar jxvf temp.tar.bz2

# 进入解压出来的 temp 目录
cd temp

# 执行脚本生成 boot.img 下载镜像文件
./mkboot.sh

Ext4 根文件系统的制作

# Ext4 格式的根文件系统是可读可写的文件系统
# 解压根文件系统文件
tar jxvf gtk_rootfs.tar.bz2

# 给 mkyaffs2image 添加可执行权限
chmod +x mkfs_ext4/make_ext4fs

# 拷贝 mkyaffs2image 文件到/bin 下
sudo cp mkfs_ext4/make_ext4fs /bin

# 生成根文件系统镜像
make_ext4fs -s -l 314572800 -a root -L linux gtkfs.img gtk_rootfs

使用 USB 方式进行烧写

先拷贝以下路径的 fastboot 文件夹到本机:

执行步骤:

首先连接上 USB 线,串口线,电源线

然后给开发板上电,并进入 U-boot 命令行模式

在 U-boot 命令行中输入 fastboot 命令后点击回车键

image-20200702230812757

桌面上会自动弹出对话框,提示安装驱动

image-20200702230841005

选择从列表或指定位置安装,单击下一步

image-20200702230914053

选择在搜索中包括这个位置,单击浏览按钮,选择路径

image-20200702230929305

选择完后点击确定,然后点击下一步

image-20200702230939630

弹出此对话框时单击确定即可

image-20200702231019467

安装完成出现下面图片,点击完成即可完成驱动安装

image-20200702231032069

在 fastboot 文件夹中创建文件夹 all_image,把刚才制作的三个镜像文件拷贝到 all_image 中

image-20200702231041155

【注意】红色方框圈起来的 all_image 文件夹中的内容为:

image-20200702231056340

右键编辑上面文件夹中的"sp_linux_image_down.bat"(方框标识的批处理文件),将其内容由

fastboot flash ubootpak ../sp_linux_image/ubootpak.bin
fastboot flash boot ../sp_linux_image/boot.img
fastboot flash gtkfs ../sp_linux_image/gtkfs.img
fastboot flash userdata ../sp_linux_image/userdata.img
fastboot flash cache ../sp_linux_image/cache.img
fastboot flash recovery ../sp_linux_image/recovery.img 
# 改为:
fastboot flash ubootpak ./all_image/ubootpak.bin
fastboot flash boot ./all_image/boot.img
fastboot flash gtkfs ./all_image/gtkfs.img
# 其他内容使用 rem 注释掉即可
# 保存关闭

双击批处理文件"sp_linux_image_down.bat",这时会在我们的 u-boot 命令行中由串口打印出相关信息

镜像安装办法

Ubuntu 下制造 TF 卡

第一步: 准备一张不小于 4GB 的 TF 卡, 启动 ubuntu 虚拟机, 插入 TF 卡到 PC机, 然后点击下图中的红框按钮将 TF 卡连接到虚拟机。

image-20200702213453216
# 安装 gparted 命令
sudo apt-get install gparted

# gparted 工具删除里面所有分区
sudo gparted /dev/sdb

选中列表中的磁盘分区, 右键删除, 再点击菜单上的勾, 应用刚才的操作。

image-20200702213629470

第二步: 新建分区。 选中列表中未分配的磁盘, 再点击分区->新建, 在弹出的对话框中, 在文件系统中选择 fat32, 在之前的空余空间中输入 256, 预留256M 空间, 可用于后面烧写 uboot, 方便后续 TF 卡更新。

image-20200702213728493

第三步: 点击添加, 再点击菜单栏的勾, 稍等之后完成新的分区创建。

image-20200702213828315

第四步: 将 bootpak.bin 拷贝到 Ubuntu 虚拟机下, 执行如下命令制作 TF 卡:

sudo dd if=ubootpak.bin of=/dev/sdb1 bs=512 seek=1 conv=sync

硬件连接

将制作好的 TF 启动卡插入开发板的 TF 卡槽中。

X6818 开发板默认首先从 SD0 通道启动, 如果 SD0 卡槽放有能够启动 6818的 TF 卡, 则从 TF 卡启动, 否则从 EMMC 启动。 当我们将裸机程序烧写到 TF 卡后, 只需要插到 SD0 通道, 即 X6818 开发板右侧的 TF 卡槽, 开机即可运行 U-boot程序, 而不必理会开发板上是否已经烧有映像, 也无需进行任何的跳线设置。

将串口线的一端连接到开发板上, 另一端连接到 PC 机的 USB 口上, 同时准备好 OTG 下载线, 连接好硬件之后就可以进行下一步操作了。

建立超级终端

双击运行超级终端, 或者 Xshell5.exe 等等终端如下所示:

image-20200702214147377

点击新建, 然后设置串口相关信息, 将名称和协议设置好, 协议设置为 SERIAL

image-20200702214210417

设置好之后, 点击左边类别拦中的连接选项, 点击 SERIAL, 设置端口号和波特率

image-20200702214232263

确定之后点击连接, 进入终端界面

image-20200702214251421

进入 U-Boot, 烧写系统镜像文件(USB 线烧模式)

为系统上电后打印的一段信息。 红色框处是自动引导倒计时, 我们设置的默认时间是 3 秒钟, 在 3 秒后系统将会进入自动引导区。 在倒计时完成之前,我们按下 PC 机任意键就可以停止自动引导, 进入 U-Boot 界面。

image-20200702214416523

在 U-Boot 命令行模式下输入“fast” 命令, 并回车;

image-20200702214515757

将预先准备好的 OTG 下载线的一段连接到开发板上, 另一端连接到 PC 机的USB 口上;

找到资料 sp_linux_image_down.bat(注: 烧写 Linux 镜像时, 选择 fast.bat) , 双击运行批处理文件

image-20200702214815198

烧写过程中会提示一下打印信息, 说明正在正常烧写系统镜像文件

image-20200702214706701

可以观看试验仪的显示屏是会显示烧写进度, 等待系统镜像烧写完成。

烧录(Linux/Android) 双系统步骤:

需要制作 android 和 gnu/linux 双系统,但两者各需要三个分区和一些非必要分区,如果我们用原来的分区方法,可能会出现分区数不够 或 分区空间不够的情况,因此我们需要对设备存储空间进行统一的重新分区。

A53 板子上电启动, 进入 U-boot 界面:

image-20200702215032310
 # 查看分区
 fdisk 2 

七个分区 :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 查看 fastboot 支持的下载内容
fastboot  

要在里面加一个 gtkfs

image-20200702220217083

另外原来的 uboot 不支持我们要的 9 分区数,因此我们需要重新烧写新的 uboot。程序已经改好,我们只需下载新的 uboot 即可,因此,更新

修改下载脚本

fastboot flash ubootpak ./ubotpak.bin
REM fastboot flash boot ./boot.img
REM fastboot flash gtkfs ./gtkfs.img
REM fastboot flash cache ./image6818/android/cache.img
REM fastboot flash userdata ./image6818/android/userdata.img
REM fastboot flash system ./image6818/android/system.img

下载好新的 uboot 后重启设备。

烧写双系统的要求: 都是将文件烧写到 emmc 上, 烧写双系统得重新分区, 所以先分区, 用 fdisk 命令, 命令如下:

fdisk 2 8 100000:4000000 4100000:2f200000 33300000:1ac00000 4e000000:800000 4e900000:1600000 50000000:0xc800000 0x5c900000:0x1f400000 0x7be00000:0x0

image-20200702215107637

 # 查看分区
fdisk 2

9 个分区了,足够双系统使用

image-20200702220917460

fastboot

后仍然看不到 gtkfs 项目,因为这些内容并不会随 uboot 而改变,我们需要手动清除,这样 uboot 才会对其进行重新设置。

# 擦写分区
mmc erase 0x400 0x40
image-20200702215136035

之后重启一下。

fastboot

出现了 gtkfs 选项,表示我们能够把这个镜像下载到新的分区中了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述步骤完成之后, 重启板子, 再次进入 U-boot 界面, 用 fast 命令(USB 线烧模式)进行烧写。

由于我们进行了重新分区,因此除了 uboot 以外的内容很可能都不能使用了,因此我们先烧写内核,也就是 boot.img 镜像。

下载脚本修改 :

REM fastboot flash ubootpak ./ubotpak.bin
fastboot flash boot ./boot.img
REM fastboot flash gtkfs ./gtkfs.img
REM fastboot flash cache ./image6818/android/cache.img
REM fastboot flash userdata ./image6818/android/userdata.img
REM fastboot flash system ./image6818/android/system.img

再下载 gtkfs.img 文件系统镜像即可

下载脚本修改成:

REM fastboot flash ubootpak ./ubotpak.bin
REM fastboot flash boot ./boot.img
fastboot flash gtkfs ./gtkfs.img
REM fastboot flash cache ./image6818/android/cache.img
REM fastboot flash userdata ./image6818/android/userdata.img
REM fastboot flash system ./image6818/android/system.img

下载后重启,成功

现在具有下载并启动双系统的能力。

配置 U-Boot 环境变量

待系统镜像烧写完成后, 先拔去 OTG 下载线, 在给试验仪重新上电, 并进入U-Boot 界面;

如果板子烧写的是( Linux/Android) 双系统, 默认启动的是 Linux 系统, 板子上电之后不用任何操作, 启动起来就是 Linux 系统。 如果要启动 Android 系统,板子上电时按住下方按键从左往右的第四个按键, 就是启动 Android 系统, 在U-boot 界面显示如下:

image-20200702215353795
STM32F103嵌入式开发:CubeMX+Keil构建可调试裸机工程 嵌入式开发入门的核心在于建立从代码到硬件的可靠执行闭环,其基础是工具链配置、外设初始化与标准I/O重定向。理解STM32时钟树原理(如HSE+PLL倍频机制)和中断优先级分组(NVIC)是保障UART通信精度与实时响应的关键技术前提。通过STM32CubeMX图形化配置实现引脚分配、时钟规划与HAL初始化,再结合Keil MDK完成编译、下载与虚拟串口调试,可快速构建具备printf打印能力的裸机工程。该流程广泛适用于STM32F1系列学习与工业原型开发,是掌握ARM Cortex-M3嵌入式系统工程化实践 阅读详情

相关推荐

ZYNQ 7000系列PS端裸机开发实战(1)——从零搭建HelloWorld工程与Vitis调试全流程

本文详细介绍了ZYNQ 7000系列PS端裸机开发工作流,从零搭建HelloWorld工程的完整流程。涵盖Vivado硬件配置、Vitis环境搭建、代码编写、JTAG与UART联合调试技巧,以及FSBL生成与常见问题排查,为初学者提供了一套实用的开发指南。

agile9scrum的博客 662

液压器大数据分析 需求调研计划

液压器大数据分析 需求调研计划 1项目概述 液压站在工作过程中可能发生故障,造成液压器的温度和液位异常升高,液压器温度和液位升高到一定程度,会自动开启冷却水阀。液压器的温度和液位升高呈现一定趋势,现希望通过对温度升高和液位升高的变化趋势进行预测,从而提前对异常状况进行预警。 2调研目标 (1)了解液压器场景存在的问题; (2)了解数据相关字段的含义及其关系; (3)了解具体的预警需求与所要达到的技...

qq_43446278的博客 408

STM32裸机开发调试救星:用EasyLogger实现彩色分级日志输出(附Keil工程配置)

本文介绍了如何在STM32裸机开发中使用EasyLogger实现彩色分级日志输出,显著提升调试效率。通过详细的Keil工程配置步骤和实战案例,帮助开发者快速掌握这一技术,适用于各种嵌入式系统调试场景。

weixin_30394669的博客 304

【Liux下6818开发板(ARM)】触摸屏

对于6818开发板来说,使用触摸屏可以实现更加直观、方便的交互操作,为嵌入式系统提供了更加友好的用户界面。通过Linux输入子系统的支持,开发人员可以轻松获取触摸屏的输入信息,并根据具体应用场景实现不同的交互功能。

qq_64928278的博客 3744

基于GEC6818开发板+Linux系统设计的智能停车管理系统(197)

本智能停车管理系统的开发是面向未来智慧城市建设中智能化停车管理的重要一环,融合了嵌入式硬件技术、数据库管理、图形界面设计、无线射频识别技术、深度学习等多种先进技术手段,致力于解决日益严重的停车难题,为公众出行带来更加便捷、高效的停车体验。

1763

裸机开发:嵌入式Linux工程师的硬件直觉与调试元能力

裸机开发指不依赖操作系统、直接操作硬件寄存器的底层编程范式,其核心在于建立对时钟树、GPIO、中断控制器、UART和定时器等外设寄存器的精确理解与状态机思维。它并非过时技能,而是支撑Linux驱动调试、设备树配置、内核模块开发和实时性优化的底层基础。掌握裸机能力意味着能穿透glibc或HAL库封装,直抵硬件行为本质——例如通过NVIC寄存器定位中断丢失,借助RCC寄存器排查UART波特率漂移,或依据EXTI映射关系分析GPIO按键误触发。这种能力显著提升在工业网关、HMI、汽车电子等高可靠性场景中的故障根因

weixin_32456485的博客 46

S5P6818裸机开发(1)-启动过程分析

介绍了三星系列S3C2440和S5P6818两款CPU上电后,代码的启动方式和过程。

u014421051的博客 2357

STM32F103 Keil MDK环境搭建与裸机调试全流程

嵌入式开发中,构建稳定可靠的编译调试环境是裸机程序运行的前提。Keil MDK-ARM作为主流ARM Cortex-M开发工具链,集成了优化编译器、调试器及芯片支持包(DFP),其核心价值在于实现硬件抽象、Flash编程算法匹配与SWD在线调试能力。技术原理上,环境配置需满足路径字符约束、DFP离线安装、ST-Link驱动适配三大基础条件;工程实践层面,典型应用场景包括GPIO寄存器级控制、时钟使能验证与实时寄存器观测。本文聚焦STM32F103C8T6最小系统,覆盖从Keil安装、DFP配置、ST-Lin

weixin_35705784的博客 43

STM32MP1裸机开发:Eclipse工程构建与调试全流程

裸机开发是嵌入式系统启动与硬件控制的基础范式,其核心在于手动掌控编译、链接、加载与调试全链路。理解Makefile构建规则、链接脚本内存布局、汇编启动流程及OpenOCD硬件调试机制,是实现可复现、可移植、可调试工程的关键。这些技术构成嵌入式Linux底层开发与TrustZone安全世界开发的共性基础,广泛应用于STM32MP1等ARM Cortex-A系列SoC的Bootloader开发、固件验证与外设驱动原型设计。本文以Eclipse为集成平台,详解从工作区初始化、交叉编译配置到startup.S与li

weixin_42263617的博客 421

S3C44B0X IAR工程解析:ARM7裸机开发与调试完整指南

嵌入式系统开发中,理解底层硬件初始化与内存布局是构建稳定固件的基石。ARM7TDMI作为经典处理器内核,其无MMU架构和冯诺依曼总线设计,为开发者提供了直接操作硬件寄存器的裸机编程范式。S3C44B0X作为该内核的代表芯片,在工业控制与教学实验中仍广泛存在,其IAR工程结构涵盖链接脚本(xcl)、启动汇编、调试宏文件等关键环节。通过剖析工程内各文件的分工,开发者能掌握从存储区映射、段重定位到调试器初始化的一整套裸机工程搭建方法。这套知识不仅适用于老产线维护与设备复现,也为理解Cortex-M等现代ARM平台

weixin_29189363的博客 333

ArduPilot代码解析之四 — 姿态和位置控制

ArduPilot采用级联控制架构实现飞行器的姿态和位置管理。该系统通过位置→速度→加速度→姿态→角速率→电机指令的逐级转换,将高级指令转化为底层执行信号。位置控制采用三维独立控制,水平轴与垂直轴分别处理;姿态控制通过角度误差→角速率→电机输出的两层级联实现。系统支持多种输入模式,并内置运动学整形功能确保轨迹平滑。不同飞行器类型(多旋翼、直升机、潜艇等)有专门的调参方案,通过调整PID参数、加速度限制等实现最优控制性能。该架构兼顾控制精度与飞行稳定性,适用于各类自主飞行场景。

rainercool的专栏 826

ZYNQ 7000系列PS端裸机开发实战(1)——手把手搭建HelloWorld工程与Vitis调试全流程

本文详细介绍了ZYNQ 7000系列PS端裸机开发的完整开发工作流,从Vivado硬件配置、MIO与DDR设置,到Vitis软件工程创建与调试。通过手把手搭建HelloWorld工程,帮助开发者掌握ZYNQ PS端裸机开发的核心流程与常见问题解决方案,适用于嵌入式开发初学者。

uuu88的博客 261

AD620仪表放大器模组实战:从调零到信号放大的完整指南

本文详细介绍了AD620仪表放大器模组的实战应用,从调零到信号放大的完整指南。AD620模组以其专业级性能和易用性成为微弱信号放大的首选,集成了AD620芯片、LM358运放和7660电源转换芯片。文章提供了调零技巧、增益设置方法以及单端与差分输入的正确连接方案,并通过心电信号采集和称重传感器等实际案例展示了其广泛应用。

weixin_29290379的博客 378

Windows下搭建ARM11裸机开发环境(3):Eclipse+JLink调试代码

By: Ailson Jack Date: 2019.05.17 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/101.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。 之前,写过两篇文章,介绍了在Windows下搭建ARM11的裸机开发环境,以及使用Eclipse创...

Ailson Jack的专栏 1236

ruoyi-nbcio基于ruoyi的flowable前端支持自定义表单组件的自动获取方法

ruoyi-nbcio基于ruoyi的flowable前端支持自定义表单组件的自动获取方法

宁波阿成的博客 609

cefshap(C#)定义浏览器的右键菜单

菜单效果:复制(自带),搜索文本,打开链接,复制链接,刷新,检查,关于 public class MenuHandler : IContextMenuHandler { //public event Action<string> PopupRequest; void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrows

无线智能模块 可视DIY智能专家 1708

全志V3S裸机工程:开启嵌入式开发新篇章

全志V3S裸机工程:开启嵌入式开发新篇章 【下载地址】全志V3S裸机工程资源下载 全志V3S裸机工程资源下载 项目地址: https://gitcode.com/open-source-toolkit/62359 ...

gitblog_09795的博客 577

美团mtgsig 1.2算法分析

mtgsig1.2的一些算法总结

记录一些web逆向的过程 3506

【亲测免费】 全志V3S裸机工程:开启嵌入式开发新纪元

全志V3S裸机工程:开启嵌入式开发新纪元 【下载地址】全志V3S裸机工程资源下载 全志V3S裸机工程资源下载 项目地址: https://gitcode.com/open-source-toolkit/62359 ...

gitblog_09770的博客 707

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3203

6.4 直流无刷电机(BLDC):测试与性能评估

本文系统阐述了直流无刷电机(BLDC)的测试与性能评估方法,涵盖参数测量、性能测试、测试平台设计及可靠性评估。详细介绍了绕组电阻、电感和反电动势的测量原理与修正方法,以及转矩-转速特性、效率分析和动态响应测试的技术要点。通过搭建高精度测功机系统,结合自动化数据处理,实现对电机性能的全面评估。最后讨论了温升、振动、EMC等特殊测试方法,为BLDC电机的设计验证和质量控制提供了完整的技术路径。

技术工作者 446

ARM裸机程序开发14(JTAG与RealViewMDK搭建ARM开发环境)

JTAG接口信息 利用Jllink进行调试的图样 下载方式 keil嵌入式集成开发环境 MDK + Jlink + SDRAM 裸奔2440教程   1、背景 很多人学习嵌入式编程都是从裸机开始的(我个人也是)。这并不是偶然,想要零基础入门嵌入式开发,玩转裸机绝对是最好的入手点。这样至少可以培养以下必备技能: l  CPU体系结构,编程模式及汇编语言、

道法自然 4762

[Dify] -进阶13- 使用“知识库 + 工作流”打造智能推荐系统

本文介绍了在Dify平台上构建智能推荐系统的方法,重点阐述了知识库与工作流技术的结合应用。通过知识库管理RAG流程,实现文档上传、向量嵌入和检索优化;利用工作流设计节点化推荐逻辑,支持并行处理与条件分支。以电话销售话术推荐为例,展示了从数据收集到实时生成的完整流程。该方法具有准确性高、扩展性强、维护简便等优势,可广泛应用于各类推荐场景,实现从数据存储到智能推荐的闭环解决方案。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1069

MDK作为我的s3c2440裸机开发的IDE

用于arm裸机程序开发的IDE基本有 以下3个:MDK,IAR,还有ADS。具体它们的具体情况在这里我就不多说了,百度一下就明白了。由于之前开发c51,stm32时候都使用了MDK开发环境,而且MDK的界面确实看起来舒服多了,所以我选择了MDK作为我的s3c2440裸机开发的IDE。以下主要介绍一下如何使用MDK配合J-link来调试基于s3c2440的开发板。   首先,我们需要下载

Bobsweetie的专栏 2756

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Zynq学习笔记(二、zynq裸机程序之hello world)

(本系列笔记程序运行环境为xilinx官方开发板ZCU104) 1.学习目的 学习Zynq硬件设置流程 熟悉裸机开发流程 2.学习内容 Zynq裸机开发一般需要以下两步:Vivado硬件设计,SDK裸机程序开发 2.1Vivado硬件设计 建立vivado工程,打开vivado->新建工程->选择平台(例如:ZCU104,如果自己开发的板子就选对应芯片型号...

u012798746的博客 4149

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

5.Eclipse集成开发环境

5.Eclipse集成开发环境 Eclipse集成开发环境不仅可以编译裸机工程,还可以调试整个裸机工程,这样当程序异常的时候,可以更加有效的进行修改。接下来就是搭建整个eclipse集成环境:这个调试环境的框架如下图1-1: 图1-1 从上面的框架图看到,要实现eclipse在线调试裸机程序,需要安装的软件是eclipse+CDT、JLink驱动、GDB调试软件,需要连接的硬...

ashe9657的博客 324

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: Linux字符设备驱动设计
下一篇: 嵌入式文件系统
onnx
博客等级 码龄5年 1万+粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

onnx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值