系统移植第一天

【移植】轻量系统STM32F407芯片移植案例 介绍基于芯片在拓维信息 Niobe407 开发板上移植 OpenHarmony LiteOS-M 轻量系统,提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,实现了lwiplittlefshdf等子系统及组件的适配,开发了配套应用示例代码,支持通过 Kconfig 图形化配置编译选项。 阅读详情

一、什么是系统移植

1.1 系统移植就是给开发板搭建一个Linux操作系统

1.2 从官方获取源码,进行配置和编译,生成板子需要的镜像文件

二、为什么学习系统移植

2.1 为后面学驱动开发课程打基础

2.2 驱动开发工程必备技能

三、如何学习系统移植

3.1 重点掌握配置和编译的流程

3.2 不要深追源码中的内容

四、课程安排

1.环境搭建 + gnu二进制工具集 + Makefile ----->1天
2.uboot移植和TF-A移植 ----->3天
3.内核移植 ----->1.5天
4.根文件系统 ----->1.5天

五、安装tftp服务器

5.1 安装步骤

重要内容:需要让ubuntu连接外网
tftp服务器:基于UDP协议完成简单文件的传输
作用:通过网线下载程序到开发板中
​
1.安装tftp服务器安装包
    sudo apt-get install tftpd-hpa tftp-hpa
    tftpd-hpa:tftp服务器端
    tftp-hpa:tftp客户端
2.在家目录下,创建一个文件夹,文件夹名字为tftpboot
        cd ~
        mkdir tftpboot
        chmod 777 tftpboot
3.配置tftp服务器
    1)打开配置文件 sudo vi /etc/default/tftpd-hpa 
    2)需要配置如下内容   
        3 TFTP_USERNAME="tftp"  #tftp服务器名字
        4 TFTP_DIRECTORY="/home/linux/tftpboot/"        #tftp服务器下载路径,大家需要更改为自己的路径                                                                
        5 TFTP_ADDRESS="0.0.0.0:69" #tftp服务器下载ip地址和端口号
        6 TFTP_OPTIONS="-c -l -s"  #保持默认的参数
 4.重启配置文件
     source /etc/default/tftpd-hpa 
5.重启tftp服务器
    sudo service tftpd-hpa restart
6.测试tftp服务器是否安装成功
    1>在家目录创建huyue.c,在~/tftpboot目录下创建1.c
    2>实验目的:将~/huyue.c上传到~/tftpboot,将~/tftpboot目录下1.c下载到当前目录
    3>上传和下载步骤参考下图所示

5.2 作用

5.3 总结

1.在开发板中emmc设备或者TF卡设备中固化uboot镜像文件
2.在ubuntu中~/tftpboot目录下,准备好基于tftp服务器下载的文件
3.通过开发板的拨码开关,选择开发板的启动方式
4.开发板上电,uboot镜像文件加载到开发板内存中
5.在串口工具打印uboo信息,在倒计时时间进入0之前,按下enter键,进入交互模式
6.使用tftp命令通过网线下载程序到开发板中

六、安装nfs服务器

6.1 安装步骤

注意:一定保证ubuntu有网
nfs服务器:网络文件系统
作用:ubuntu通过网络的方式挂载文件到开发板中
1.安装nfs服务器安装包
    sudo apt-get install nfs-kernel-server 
2.在家目录下创建一个文件夹,文件夹的名字为nfs
    cd ~
    mkdir nfs
    chmod 777 nfs
3.将rootfs-ok.tar.xz文件拷贝到~/nfs目录下
4.对文件进行解压
    tar -vxf rootfs-ok.tar.xz 
5.配置nfs服务器
    1)打开配置文件:
    2)在配置文件最后一行,添加如下内容:sudo vi /etc/exports 
     11 /home/linux/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)   
     解释:
      /home/linux/nfs/rootfs:挂载路径,需要注意填写自己的路径
       *(:之间不要有空格
       rw:可读可写权限
       sync:同步信息
       no_subtree_check:不检查子目录的信息
       no_root_squash:在开发板中默认权限就是管理员权限,不需要加sudo
6.重启nfs服务器
    sudo service nfs-kernel-server restart
7.本地测试nfs服务器是否安装成功:
    1>实验现象:将~/nfs/rootfs目录下内容挂载到/mnt目录下
    2>挂载命令:
        sudo mount -t nfs 192.168.250.100:/home/linux/nfs/rootfs /mnt
        解释: mount:挂载命令
            -t nfs :指定使用nfs服务器进行挂载
            192.168.250.100:挂载的ip地址,通过ifconfig进行查看
            /home/linux/nfs/rootfs:挂载的路径
           /mnt:挂载到的路径 
   3>需要查看/mnt目录挂载的内容,和~/nfs/rootfs目录下内容是否一致
    4>取消挂载命令:
    sudo umount /mnt

6.2 作用

6.3总结

1.在开发板中emmc设备或者TF卡设备中固化uboot镜像文件
2.在Ubuntu中~/tftpboot目录下,准备好基于tftp服务器下载的文件
3.通过开发板的拨码开关,选择开发板的启动方式
4.开发板上电,uboot镜像文件加载到开发板内存中
5.在串口工具打印uboot信息,在倒计时时间进入0之前,按下enter键,进入交互模式
6.使用tftp命令通过网线下载程序到开发板中,下载内容问设备树文件和uImage镜像文件
7.下载成功之后,linux内核进行启动,启动成功之后
8.通过网线实现从ubuntu挂载根文件系统到开发板中
9.挂载成功之后,在串口工具,可以查看到~/nfs/rootfs目录下相关内容

一、gnu二进制工具集

1.1 gcc命令

将.s文件生成.o文件
arm-linux-gnueabihf-gcc -c asm-led -o asm-led.o

1.2 ldd链接器

ld:链接命令,将.o文件链接生成.elf文件,需要指定链接的入口地址
arm-linux-gnueabihf-ld -Ttext=0xc0008000 asm-led.o asm-led.elf

1.3 objdump生成反汇编

objdump:生成反汇编命令,将.elf文件生成反汇编文件
arm-linux-gnueabihf-objdump -D asm-led.elf > asm-led.elf

1.4 objcopy生成二进制文件

objcopy:生成二进制文件,将.elf文件生成存粹二进制文件
.elf文件:包含符号表信息,调试信息
.bin文件:不包含符号表信息,调试信息
arm-linux-gnueabihf-objcoypy -o binary asm-led.elf asm-led.bin

1.5 nm查看符号表信息

命令:arm-linux-gnueabihf-nm asm-led.elf
c00181e8 T __bss_end__
c00181e8 T _bss_end__
c00181e8 T __bss_start
c00181e8 T __bss_start__
c00081a8 t delay_1s
c00181e8 T _edata
c00181e8 T __end__
c00181e8 T _end
c0008000 t led1_init
c000816c t led1_off
c0008130 t led1_on
c0008054 t led2_init
c0008180 t led2_off
c0008144 t led2_on
c00080a8 t led3_init
c0008194 t led3_off
c0008158 t led3_on
c00080fc t loop
c00081ac t mm
c0008000 T _start

1.6 size查看各个段大小

arm-linux-gnueabihf-size asm-led.elf

1.7 readelf查看文件头部信息

arm-linux-gnueabihf-readelf -h asm-led.elf

1.8 strip压缩文件体积

strip压缩文件体积,不可以对中间文件进行压缩(.i,.s,.o)只可以对可执行二进制文件压缩
arm-linux-gnueabihf-strip asm-led.elf

1.9 addr2line调试段错误信息

addr2line:用来调试内核中段错误信息
格式:arm-linux-gnueabihf-addr2line 地址 -e 指定elf文件 -f
	-e:指定elf可执行文件
	-f:回显函数名,行号
	
	linux@ubuntu:~/DC22081/01-asm-led$ arm-linux-gnueabihf-addr2line c000816c -e asm-	 led.elf -f
    led1_off
    /home/linux/DC22081/01-asm-led/asm-led.S:146
	
	以上学习所有命令,支持x86架构和arm架构,如果想生成x86架构,直接使用命令即可,不需要加交叉编译工具链前缀
	如果想生成arm架构,需要加交叉编译链前缀

二、gcc编译流程

2.1 预处理

预处理作用:头文件展开,去掉注释,宏替换,不检查语法错误 
gcc -E *.c -o *.i

2.2 编译

编译:生成汇编文件,检查语法错误 
gcc -S *.i -o *.s

2.3 汇编

汇编:生成二进制文件,检查语法错误 
gcc -c *.s -o *.o

2.4 链接

链接:链接对应的库,生成.elf可执行文件 
gcc *.o -o 可执行文件

三、分析Makefile文件

makefile中四种赋值方式有什么区别?
?= += := =
?= : 作用是当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值
+= : 追加赋值,旧值保持不变,将新值黏贴到旧值后面 
:= : 是覆盖式赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值
=  : 是最基本的赋值方式,与在文中位置无关,系统自动推导将最终的赋值作为该变量的值

# CORTEX-A53 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR www.hqyj.com
# MODIFY DATE
# 2019.04.12  Makefile
# SHELL=C:/Windows/System32/cmd.exe
# 
# 指定交叉编译工具链前缀
CROSS_COMPILE = arm-linux-gnueabihf-
# 指定文件的名字
NAME = interface
#=============================================================================#
#-g:gdb调试信息 -marm:编译生成arm架构 -Wall:显示所有警告信息 -O0::优化等级信息
#-I:指定头文件路径
#-fno-builtin:不使用linux操作系统提供的库函数
#-nostdinc:不实用系统提供的头文件
CFLAGS += -g -marm -Wall -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin \
			-nostdinc -I./common/include    -I./include  		                       
#ld:链接命令
LD	= $(CROSS_COMPILE)ld
#gcc:编译命令
CC	= $(CROSS_COMPILE)gcc
#nm:查看符号表信息
NM  = $(CROSS_COMPILE)nm
#objcopy:生成二进制文件
OBJCOPY = $(CROSS_COMPILE)objcopy
#objdump:生成反汇编文件
OBJDUMP = $(CROSS_COMPILE)objdump
#============================================================================#
#wildcard是Makefile中内置函数
#函数功能:将某个文件夹下面的内容进行以字符串形式进行展开,并用空格隔开
#函数参数:需要展开目录文件
#函数返回值:以字符串展开后的结果
OBJSss 	:= $(wildcard start/*.S) $(wildcard common/src/*.S) $(wildcard *.S)\
		   $(wildcard start/*.c) $(wildcard common/src/*.c) 			   \
		   $(wildcard src/*.c) $(wildcard *.c) 
#patsubst是Makefile中内置函数
#函数功能:将一个字符串内容替换成另一个字符串
#函数参数:
#第一个参数:源字符串,也就是要替换的字符串
#第二个参数:目标字符串,也就是替换后的字符串
#第三个参数:要替换的字符串目录
#函数返回值:替换后的目标 字符串
#将OBJSss目录下所有以.S结尾的字符串替换成.o
OBJSs  	:= $(patsubst %.S,%.o,$(OBJSss))
#将OBJSs目录下所有以.c结尾的字符串替换成.o
OBJS 	:= $(patsubst %.c,%.o,$(OBJSs))

%.o: %.S 
	@echo "  AS      $@"
	@$(CC) $(CFLAGS) -c -o  $@ $<
	#将所有以.S结尾的文件根据指定参数编译生成.o结尾的文件
	#$@:目标
	#$V:第一个依赖
	#$^:所有依赖
	
%.o: %.c
	@echo "  CC      $@"
	@$(CC) $(CFLAGS) -c -o  $@ $<
	#将所有以.c结尾的文件根据指定参数编译生成.o结尾的文件
all:clean  $(OBJS)
	@echo "  LD      Linking $(NAME).elf"
	@$(LD)  $(OBJS) -T map.lds -o $(NAME).elf
	#将OBJS目录下所有文件,根据链接脚本文件map.lds指定地址信息,生成elf文件
	@echo "  OBJCOPY Objcopying $(NAME).bin"
	@$(OBJCOPY)  -O binary  $(NAME).elf $(NAME).bin 
	#将elf文件生成.bin文件
	@echo "  MAP     Generating $(NAME).map"
	@$(NM) $(NAME).elf > $(NAME).map 
	#将elf文件符号表信息重定向到interface.map文件中
	@echo "  OBJDUMP Objdumping $(NAME).dis"
	@$(OBJDUMP) -DS $(NAME).elf > $(NAME).dis 
	#将elf文件生成反汇编文件到.dis文件中

distclean clean:
	@rm -rf $(OBJS) *.elf *.bin *.dis *.map
	@echo "  CLEAN   complete."

install:
	sudo cp $(NAME).bin /mnt/hgfs/share/

huyue:
	@echo $(OBJSs)
	@echo $(OBJS)

一、uboot概念

1.1 uboot和bootloader关系

1.bootloader:是一系列引导加载程序的统称
    boot:引导
    loader:加载
2.uboot是引导加载程序中的一种

1.2 uboot特点

1.uboot是由德国DNEX小组进行维护的
2.uboot是一个开源分布式系统
3.uboot支持多种硬件架构平台(ARM/X86/POWERPC)
4.uboot短小精悍
5.uboot是一个裸机程序
6.uboot是一个短命鬼,只是引导linux内核进行启动,内核启动成功后,uboot 的生命周期就结束了
7.uboot在启动成功后,会给内核传递两个参数(bootcmd和bootargs)

1.3 uboot环境变量

一下所有学习的命令,都需要在串口工具进行输入
1.help ----->查看uboot中所有的环境变量相关信息内容
2.help uboot命令 ----->查看uboot命令中的环境信息
3.help loadb命令
    help loadb -----> 串口工具输入命令
    loadb - load binary file over serial line (kermit mode) -----> 打印帮助信息
    Usage:
    loadb [ off ] [ baud ] ----->uboot命令格式
        - load binary file over serial line with offset 'off' and baudrate 'baud'
4.help go命令
    FSMP1A> help go
    go - start application at address 'addr'
    Usage:
    go addr [arg...]----->uboot命令格式
    - start application at address 'addr'
          passing 'arg' as arguments
5.help gpio命令
    FSMP1A> help gpio
    gpio - query and control gpio pins
    
    Usage:
    gpio <input|set|clear|toggle> <pin>
        - input/set/clear/toggle the specified pin
    gpio status [-a] [<bank> | <pin>]  - show [all/claimed] GPIOs
    input:设置输入的值
    set:设置相应的值
    clear:设置清除相应的值
    toggle:设置gpio翻转状态
    例子:
        FSMP1A> gpio toggle gpioe10
        gpio: pin gpioe10 (gpio 74) value is 1
        FSMP1A> gpio toggle gpioe10
        gpio: pin gpioe10 (gpio 74) value is 0
        FSMP1A> gpio toggle gpiof10
        gpio: pin gpiof10 (gpio 90) value is 1
        FSMP1A> gpio toggle gpiof10
        gpio: pin gpiof10 (gpio 90) value is 0
        FSMP1A> gpio toggle gpioe8 
        gpio: pin gpioe8 (gpio 72) value is 1
        FSMP1A> gpio toggle gpioe8
        gpio: pin gpioe8 (gpio 72) value is 0
6.pri:打印环境变量信息   ------>串口工具输入:pri
      FSMP1A> help pri
        printenv - print environment variables ------>打印变量信息
    
    Usage:
    printenv [-a] ------> 查看所有环境变量信息
        - print [all] values of all environment variables
    printenv name ... ------>pri uboot变量
        - print value of environment variable 'name'
7.pri/printenv ------>  打印环境变量信息
    arch=arm  ------> 指定架构
    baudrate=115200 ------> 波特率
    board=stm32mp1 ------>板子名称
bootargs=root=/dev/nfs nfsroot=192.168.1.210:/home/linux/nfs/rootfs,tcp,v4 console=ttySTM0,115200 init=/linuxrc ip=192.168.1.250
    bootargs参数功能:自启动参数,设置ubuntu挂载根文件系统到开发板上的路径和ip地址
bootcmd=tftp 0xc2000000 uImage;tftp 0xc4000000 stm32mp157a-fsmp1a.dtb;bootm 0xc2000000 - 0xc4000000
    bootcmd参数功能:自启动命令,倒计时时间进入0之前不按下enter键盘,进入自启动模式,并且执行自启动命令
    bootdelay=3 ------>倒计时时间
    ethaddr=12:56:78:ff:ff:4e ------>物理地址ip
    gatewayip=192.168.1.1 ------>设置开发板网关
    ipaddr=192.168.1.250 ------>设置开发板ip地址
    netmask=255.255.255.0 ------>设置开发板子网掩码
    serverip=192.168.1.210 ------>设置服务器(ubuntu)的ip地址
8.run -------> 运行run后面的命令   格式:run uboot命令 run bootcmd
    1)交互模式:
        当uboot启动成功之后,在倒计时时间进入0之前,按下键盘enter键,进入交互模式,和uboot命令进行交互
    2)自启动模式:
        当uboot启动成功之后,在倒计时时间进入0之前,不按下键盘enter键,进入自启动模式,执行自启动命令(bootcmd)不可以使用uboot命令
    3)设置bootcmd格式
        setenv bootcmd uboot命令1\;uboot命令2\;...............
        saveenv
    4)在arm课程中,需要输入两条命令:loadb 0xc0008000  go 0xc0008000    
        FSMP1A> setenv bootcmd loadb 0xc0008000\;go 0xc0008000
        FSMP1A> saveenv
        Saving Environment to MMC... Writing to MMC(0)... OK
    5)在串口工具中,查看bootcmd环境变量信息
        FSMP1A> pri bootcmd
        bootcmd=loadb 0xc0008000;go 0xc0008000
    6)在串口工具中,执行run bootcmd命令,观察现象
    FSMP1A> run bootcmd
    ## Ready for binary (kermit) download to 0xC0008000 at 115200 bps...
​
    7)在倒计时时间进入0之前,不按下键盘enter键,进入自启动模式,观察现象
    Hit any key to stop autoboot:  0 
    ## Ready for binary (kermit) download to 0xC0008000 at 115200 bps...
9.ping命令 ------->测试开发板和ubuntu组网是否成功
    ping - send ICMP ECHO_REQUEST to network host
​
    Usage:
    ping pingAddress
    格式:ping 服务器(ubuntu)ip地址
    
10.tftp命令 ------->使用tftp命令将文件下载到开发板内存中,一定保证开发板和ubuntu组网成功
    FSMP1A> help tftp
    tftpboot - boot image via network using TFTP protocol
    
    Usage:
    tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
    格式:tftp 地址 文件名
1.4 设置uboot环境变量
1.设置uboot环境变量:setenv  ------>修改环境变量
2.保存uboot环境变量:saveenv ------>保存环境变量
3.修改环境变量格式:
    setenv 要修改的环境变量 修改的值
    saveenv
4.设置开发板倒计时时间为20s
    FSMP1A> setenv bootdelay 20
    FSMP1A> saveenv
    Saving Environment to MMC... Writing to redundant MMC(0)... OK
    FSMP1A> pri bo
【移植】标准系统移植指南 本文以移植名为 MyProduct 的开发板为例讲解移植过程,假定 MyProduct 是 MyProductVendor 公司的开发板,使用 MySoCVendor 公司生产的 MySOC 芯片作为处理器。在名称的目录下创建一个 config.json 文件,该文件用于描述产品所使用的 SOC 以及所需的子系统。配置如下:},...主要的配置内容配置项说明(必填)产品名称version(必填)版本type(必填)配置的系统级别,包含(small、standard 等) 阅读详情

相关推荐

UCOS-III 系统移植

UCOSIII系统移植到GD32F303详细过程 工程代码:https://github.com/jslaobing/techIot_ucosiii_porting

TechIoT - 探索物联网与嵌入式系统 2086

Linux 命令之 addr2line

Linux 下面定位,C/C++ 定位问题,帮助解决更多的问题

IRON_MAN_LEVEL1的博客 1489

开源鸿蒙OpenHarmony系统移植

本文以移植名为MyProduct的开发板为例讲解移植过程,假定MyProduct是MyProductVendor公司的开发板,使用MySoCVendor公司生产的MySOC芯片作为处理器。在名称的目录下创建一个config.json文件,该文件用于描述产品所使用的SOC 以及所需的子系统。配置如下:},...主要的配置内容配置项说明(必填)产品名称version(必填)版本type(必填)配置的系统级别,包含(small、standard等)target_cpu。

m0_70854309的博客 1549

Ubuntu18.04 addr2line 用法与乱码问题解决

addr2line可以将指定的行号转换为对应的文件名和行号,常用于分析和定位内存访问错误的问题。在C/C++编程时,经常出现bug导致系统崩溃的情况。这是一般产生core文件,使用GDB调试。但是,有些情况下,可能没有产生core文件或者core文件丢失,这是怎么确定问题呢?可以使用addr2line命令。首先,运行dmesg,会输出系统日志,如下图,里面会输出产生错误时的地址,红色方框1的IP地址。 注意的是,在64位Ubuntu系统上,这个地址是绝对地址,addr2line命令需要输入相对地址。相对地址

Robin's Home 2019

Linux移植笔记--arm64上的Linux系统移植

  linux作为一款流行的嵌入式系统,目前已经有多种架构的MCU支持Linux移植,arm64就是其中一种。今天在这里想做一个笔记,记录一下完整的arm64移植过程。 嵌入式Linux系统组成部分 嵌入式Linux移植到开发板上时,主要有四个组成部分,下面一 一列举。   在启动过程中,bootloader加载设备树文件(dtb),之后启动内核(Start kernel),进而加载根文件系统(debian或者ubuntu),最后进入系统。   那么我们所做的工作可以分为以下三部分: 1、进行bootlo

中华田园巨龙 2620

嵌入式系统移植——移植操作

通过上面的分享,我们已经了解了系统移植的三个方法,对于系统板开发的过程中,我们推荐使用nfs服务器传输,对于需要发行的版本,我们推荐使用EMMC加载的方式进行移植操作。

m0_55765042的博客 2012

linux之Oops原理及解析

linux之Oops原理和分析

gy794627991的博客 1万+

Lane、PHY和Preset Value Bit

每个Lane支持不同的传输速度和带宽,例如PCIe 3.0中,一个Lane的传输速度可以达到8 GT/s(Giga Transfers per second),也就是1 GB/s(GigaBytes per second)。Preset Value Bit(预置值位)是在PCIe 3.0的Lane上新引入的一种机制,用于优化信号传输质量。PCIe设备可以包含多个Lane,例如x1、x4、x8、x16等,表示该设备同时使用的Lane数目,比如x16表示该设备采用了16个Lane,具有更高的传输速度和带宽。

weixin_58083606的博客 1295

addr2line

文章目录1 addr2line1.1 addr2line的用途1.2 addr2line的用法 1 addr2line 1.1 addr2line的用途 addr2line可以将指定的行号转换为对应的文件名和行号,常用于分析和定位内存访问错误的问题。 1.2 addr2line的用法 addr2line用来定位0地址访问的步骤如下: C代码如下: #include <stdio.h>...

木子皿--啥都不会的菜鸟 1930

《YOLOv8实例分割实战:训练自己的数据集 》(视频课程)

本课程将手把手地教大家使用labelme标注和使用YOLOv8训练自己的数据集,完成一个多目标实例分割实战项目。

bai666ai的博客 788

实战指南 | IC模拟版图设计从零到精通,手把手带你掌握EDA工具与GDSII输出

本文提供了一份从零开始的IC模拟版图设计实战指南。详细介绍了如何搭建Linux环境、安装Cadence Virtuoso等EDA工具,并深入解析了PDK设计规则。通过手把手绘制CMOS反相器版图的实例,系统讲解了版图绘制、DRC/LVS验证、寄生参数提取、匹配设计以及ESD防护等核心技能,最终指导如何正确生成交付芯片制造厂的标准GDSII文件,帮助读者掌握完整的模拟版图设计流程。

weixin_29214691的博客 389

调试厉器addr2line

Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这在应用程序和内核程序执行过程中出现崩溃时,可用于快速定位出出错的位置,进而找出代码的bug。一般适用于 debug 版本或带有 symbol 信息的库。参考。

Neo 4397

从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧

本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。

lg888的博客 1065

嵌入式linux系统移植的四大步骤_嵌入式linux系统移植基本知识

系统移植第一天【1】系统移植重点掌握的内容1、搭建交叉开发环境2、移植Bootloat3、移植kernel4、根文件系统的制作【2】第一天要掌握的1、配置交叉工具链和基本命令使用2、制作SD卡启动盘(未完成)3、搭建tftp服务器4、搭建Nfs服务器5、烧写uboot(未完成)6、用nfs方式启动开发板跑linux(未完成)【3】嵌入式系统的应用领域1、工业控制:工控设备、智能仪表、汽车电子、电子...

weixin_31974757的博客 560

一文理解近红外光谱数据建模步骤的细节(细节知识总结)

上一篇文章,向入门的同志大体介绍了近红外光谱数据建模的内容,依据上文其实已经可以基本完成数据建模的工作,但是很多工作不够细致,本文便是分享其中的一些技术细节。

weixin_46207310的博客 5565

Android16 rk3576添加触摸点数上限到40个点

本文介绍了在Android 16系统上实现40点触摸支持的修改方案。相比Android 15,Android 16对API添加有更严格的要求,需要在MotionEvent.java中添加@FlaggedApi批注。主要修改包括:1)在input_framework.aconfig中定义flag;2)在MotionEvent.java中添加40个AXIS_GENERIC轴常量并添加批注;3)将32位指针ID处理改为64位适配;4)更新相关API文档。修改涉及多个核心文件,包括PointerController

tzj1058756809的博客 381

Linux系统移植

Linux系统移植一、环境搭建1.1、嵌入式Linux开发1.2、嵌入式Linux环境开发的搭建二级目录三级目录 一、环境搭建 1.1、嵌入式Linux开发 1.1.1、嵌入式系统定义 (1)、一般定义 以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 (2)、广义定义 凡是带有微处理器的专用软硬件系统都可称为嵌入式系统。 1.1.2、特点 三低:成本、体积、功耗 三高: 1.1.3、组成 (1)、硬件 (2)、软件 1.1、

子羽丿_的博客 4062

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2579

UC/OS-II 操作系统移植

uC/OS-II操作系统移植   --------------------------------------------------------- Author   :tiger-john WebSite  :blog.youkuaiyun.com/tigerjb Email

孔祥锐 1313

Pytorch实现之SRGAN+CBAM的结构设计

在SRGAN的残差连接中加入了CBAM注意力机制,同时设计了四类损失来训练。

LJ1147517021的博客 568

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

linux系统移植

一、搭建交叉开发环境二、bootloader的选择和移植三、kernel的配置、编译、和移植四、根文件系统的制作。

m0_67794241的博客 2595

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

系统移植总结

无

qq_45302555的博客 2539

数学建模模型总结

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

系统移植一

U-Boot(Universal Bootloader)是一款广泛用于嵌入式系统中的开源 Bootloader,支持多种 CPU 架构,如 ARM、PowerPC、x86、MIPS 等。它体积小、功能强大,广泛用于嵌入式系统启动和调试。U-Boot 与其他 Bootloader 的对比:BIOS(通常用于 PC):大约 300MB,功能强大,带有图形用户界面。Recovery 模式(用于 Android):大约 3.5MB,功能一般,界面较为简单。

m0_51830537的博客 1800

系统移植(系统移植环境搭建及简单概念)

1、为什么学习系统移植 为后边学习linux驱动开发打基础 linux驱动开发:基于linux内核提供的接口,完成硬件驱动的开发。 2、系统移植的目的 给开发板移植一个linux操作系统 3、如何学习系统移植 系统移植都是流程化的操作,重点掌握系统移植的流程 动手操作 不要深追代码 4、GNU组织相关命令的扩展(二进制工具) gcc / g++ (重点) gdb (重点) ld (重点) 将.o文件链接生成.elf文件 objdump (重点) 将.elf文件进行反汇编生成.dis反汇编文件

weixin_38717634的博客 5129
上一篇: ARM蜂鸣器,风扇,马达
下一篇: 系统移植第二天
Pointerup
博客等级 码龄7年 2粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值