系统移植MakefileREADME文件分析

news2024/12/30 2:49:04

Makefile

# 指定交叉编译工具链前缀变量
CROSS_COMPILE = arm-linux-gnueabihf-
#指定文件名字变量
NAME = interface
#=============================================================================#
#-g:编译时添加gdb调试信息   -marm: 将程序编译生成arm指令集   -Wall:编译时显示所有警告信息 
#-O0:编译时添加优化等级 -O0:不优化 -O1:一级优化  
#-fno-builtin: 不使用linux操作系统,提供内置函数
#-nostdinc: 不可以包含linux操作系统提供的头文件
#-I:指定头文件路径
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
#CC:编译命令
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中内置函数
#功能:将指定目录下某种格式,替换成另外一种格式
#参数:1)源字符串格式 2)目标字符串格式 3)指定替换目录
#返回值:替换后的结果
OBJSs      := $(patsubst %.S,%.o,$(OBJSss))
OBJS     := $(patsubst %.c,%.o,$(OBJSs))

%.o: %.S 
    @echo "  AS      $@"
    @# $(CC): 使用arm-linux-gnueabihf-gcc命令
    @$(CFLAGS): 指定编译参数
    @#-c:只编译不链接  $<:第一个依赖  $^:所有依赖 -o: 起别名 $@:目标 
    @#将所有的.s文件根据指定参数,编译生成.o文件 
    @$(CC) $(CFLAGS) -c   $< -o $@

%.o: %.c
    @echo "  CC      $@"
    @$(CC) $(CFLAGS) -c  $<  -o $@

all:clean  $(OBJS)
    @echo "  LD      Linking $(NAME).elf"
    @#将所有的.o文件,根据map.lds,通过LD链接生成.elf文件
    @$(LD)  $(OBJS) -T map.lds -o $(NAME).elf

    @echo "  OBJCOPY Objcopying $(NAME).bin"
    @#将.elf文件,通过OBJCOPY生成.bin文件
    @$(OBJCOPY)  -O binary  $(NAME).elf $(NAME).bin 

    @echo "  MAP     Generating $(NAME).map"
    @#将.elf文件符号表信息,重定向到.map文件
    @$(NM) $(NAME).elf > $(NAME).map 

    @echo "  OBJDUMP Objdumping $(NAME).dis"
    @#将.elf文件,通过OBJDUMP生成反汇编文件,并且重定向到.dis文件
    @$(OBJDUMP) -DS $(NAME).elf > $(NAME).dis 

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

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

uboot移植前准备工作/make <board_name>_deconfig执行过程

1.进入uboot源码目录下,打开README文件,分析如下内容        
        193 For all supported boards there are ready-to-use default
        194 configurations available; just type "make <board_name>_defconfig".
        
        对于所有支持的板,有现成的默认配置可用;只需键入“make <board_name>_defconfig”。
        总结:通过以上分析可知,需要确定<board_name>名字,执行make <board_name>_defconfig这条命令就可以
        问题:如何确定<board_name>?

2.在uboot源码顶层目录下,执行make fsmp1a_defconfig
    出现如下错误信息:
    ***
    *** Can't find default configuration "arch/../configs/fsmp1a_defconfig"! ===> 不能找到默认配置“arch/../configs/fsmp1a_defconfig”
    ***
3.进入uboot源码顶层目录下,进入configs目录下,查看和<board_name>_defconfig相关信息

4.在uboot源码顶层目录下,打开Mkaefile文件,搜索config,添加如下打印信息    
     563 %config: scripts_basic outputmakefile FORCE
    
     569     $(MAKE) $(build)=scripts/kconfig $@  ===> 打印信息内容:make -f ./scripts/Makefile.build obj=scripts/kconfig fsmp1a_defconfig
      分析执行语句:make -f ./scripts/Makefile.build obj=scripts/kconfig fsmp1a_defconfig ===> make obj=scripts/kconfig fsmp1a_defconfig    
5.如何可以查看打印信息内容:在uboot源码顶层目录下,执行make fsmp1a_defconfig 
6.进入uboot源码scripts/Kconfig目录下,打开Makefile文件,搜索:defconfig,添加如下内容打印信息
     %_defconfig: $(obj)/conf
         $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) 
    
      ====> 打印信息内容:scripts/kconfig/conf  --defconfig=arch/../configs/fsmp1a_defconfig Kconfig  
        scripts/kconfig/conf:elf可执行文件
        --defconfig=arch/../configs/fsmp1a_defconfig:目标
        Kconfig:存放默认板子相关配置信息  
        总结:conf是一个可执行文件,目标和板子相关配置信息作为参数传递给conf

  

uboot 非安全版本移植脚本文件

使用脚本进行烧写 ./sdtools /dev/sdb

make menuconfig执行过程

1.在uboot源码顶层目录下,打开Mkaefile文件,搜索menuconfig,发现无法找到目录,所以搜索config,找到目标之后,   
     563 %config: scripts_basic outputmakefile FORCE

     569     $(MAKE) $(build)=scripts/kconfig $@  ===> 打印信息内容:make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

      分析执行语句:make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
           ===> make obj=scripts/kconfig menuconfig    
2.如何可以查看打印信息内容:在uboot源码顶层目录下,执行menuconfig 
3.进入uboot源码scripts/Kconfig目录下,打开Makefile文件,搜索:menuconfig,添加如下内容打印信息
     34 menuconfig: $(obj)/mconf
                                                                                     
     39     $< $(silent) $(Kconfig) =====>  scripts/kconfig/mconf  Kconfig

4.如何可以查看打印信息内容:在uboot源码顶层目录下,执行menuconfig 
5.总结:make menuconfig执行内容 
    =====>  scripts/kconfig/mconf  Kconfig  
      
     scripts/kconfig/mconf :elf可执行文件
     Kconfig :存放默认相关图形化界面配置信息内容
     mconf是一个可执行文件,Kconfig作为参数传递给mconf,因为Kconfig文件存放默认相关图形化界面配置信息内容,所以执行这条命令,生成图形化界面信息

make all执行过程

1.在uboot源码顶层目录下执行: make V=1 all
//打印信息注解
  arm-linux-gnueabihf-objdump -t u-boot > u-boot.sym
      解释:将u-boot可执行文件,通过objdump生成反汇编文件,将反汇编文件重定向到u-boot.sym   
  arm-linux-gnueabihf-objcopy -O srec u-boot u-boot.srec
        解释:将u-boot可执行文件,通过objcopy命令,生成u-boot.srec文件  
./tools/mkimage -T stm32image -a 0xC0100000 -e 0xC0100000 -d u-boot.bin u-boot.stm32 >u-boot.stm32.log  && cat u-boot.stm32.log
        解释: mkimage - Generate image for U-Boot ====> 生成uboot镜像文件
            -T:设置镜像文件类型
            -a:设置加载地址
            -e:设置入口地址
            -d:指定使用哪一个镜像文件
     使用mkimage工具,设置镜像文件类型stm32image,指定加载地址和入口地址0xC0100000
     指定使用  u-boot.bin 和 u-boot.stm32 重定向到>u-boot.stm32.log文件 并且 回显u-boot.stm32.log文件内容
       cp u-boot-dtb.bin u-boot.bin ====> 解释:将u-boot-dtb.bin复制为u-boot.bin
       cat u-boot-nodtb.bin dts/dt.dtb > u-boot-dtb.bin  ==> 解释:将u-boot-nodtb.bin和dts/dt.dtb进行拼接,重定向到u-boot-dtb.bin
        make -f ./scripts/Makefile.build obj=dts dtbs ===> 编译dts目录下设备树相关内容

        make -f ./scripts/Makefile.build obj=arch/arm/dts dtbs ===>  编译arch/arm/dts目录下设备树相关内容
       arm-linux-gnueabihf-objcopy -O binary u-boot u-boot-nodtb.bin  ===> 将 u-boot可执行文件,通过objcopy生成u-boot-nodtb.bin
     arm-linux-gnueabihf-ld -Ttext 0xC0100000 -o u-boot -T u-boot.lds *.o
     解释:将uboot源码目录下所有的.o文件,根据 u-boot.lds文件,指定链接地址0xC0100000,生成u-boot可执行文件
       

TF-A 的 README文档

1、分析如下目录信息
    Compilation of TF-A (Trusted Firmware-A):
    1. Pre-requisite  ======> 准备工作
    2. Initialise cross-compilation via SDK  ======> 安装交叉编译工具链
    3. Prepare tf-a source code  ======> 准备tf-a源码
    4. Management of tf-a source code  ======> 管理tf-a源码
    5. Compile tf-a source code  ======> 编译tf-a源码
    6. Update software on board  ======> 烧写步骤
2、解压tf-a源码
     $> tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz  
3、进入tf-a源码目录       
     $> cd tf-a-stm32mp-2.2.r2  
4、在tf-a源码目录下,执行打补丁命令     
      $> for p in `ls -1 ../*.patch`; do patch -p1 < $p; done 
5、编译tf-a源码命令
     $> make -f $PWD/../Makefile.sdk all     
     或者
     $ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157c-ev1 TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all
6、生成镜像文件路径,以及名字      
     #> ../build/*/tf-a-*.stm32

分析Linux的README文档

1.分析README文档目录 
    1. Pre-requisite  ======> 准备工作
    2. Initialise cross-compilation via SDK  ======> 安装交叉编译工具链
    3. Prepare kernelsource code  ======> 准备tf-a源码
    4. Management of kernelsource code  ======> 管理tf-a源码
    5. Compile kernel source code  ======> 编译tf-a源码
    6. Update software on board  ======> 烧写步骤
2.需要安装库
    sudo apt-get install u-boot-tools
    sudo apt-get install libyaml-dev   
3.解压内核源码
    $> tar xfJ linux-5.10.61.tar.xz
4.进入内核源码目录下
      $> cd linux-5.10.61
5.打补丁命令            
     $> for p in `ls -1 ../*.patch`; do patch -p1 < $p; done  
6.配置补丁文件列表相关配置信息
     $ make ARCH=arm multi_v7_defconfig fragment*.config    
7. 编译内核源码的命令  
    $ make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000000     
    解释:
        ARCH=arm :指定架构为arm架构    
        uImage:编译生成uImage镜像文件  
        vmlinux:内核源码目录下elf可执行文件  
        dtbs:编译设备树
        LOADADDR=0xC2000000  :指定加载地址     
8.内核采用模块化方式进行编译
     $ make ARCH=arm modules 
9. 产生镜像文件名字和位置
        uImage镜像文件:$PWD/arch/arm/boot/uImage  
        设备树镜像文件:$PWD/arch/arm/boot/dts/st*.dtb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zabbix配置钉钉告警、和故障自愈、监控java

文章目录 1.配置钉钉告警server 配置web界面创建媒介给用户添加媒介测试告警 实现故障自愈功能监控Javazabbix server 安装java gateway配置 Zabbix Server 支持 Java gateway使用系统内置模板监控 tomcat 主机 1.配置钉钉告警 server 配置 钉钉告警python脚本 脚本1 cd /…

实相融、云启未来,智慧公厕让城市生活更美好

现代社会&#xff0c;随着科技的不断发展&#xff0c;人们对于城市生活的要求也在不断提升。在这个过程中&#xff0c;智慧公厕作为城市基础设施中的重要组成部分&#xff0c;正在发挥着越来越重要的作用。通过数字化、云管理、人工智能等未来的科技方式&#xff0c;智慧公厕为…

2024字节跳动校招面试真题汇总及其解答(一)

1. 【算法题】重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:hea…

嵌入式Linux驱动开发(同步与互斥专题)(二)

一、自旋锁spinlock的实现 自旋锁&#xff0c;顾名思义&#xff1a;自己在原地打转&#xff0c;等待资源可用&#xff0c;一旦可用就上锁霸占它。 ① 原地打转的是CPU x&#xff0c;以后CPU y会解锁&#xff1a;这涉及多个CPU&#xff0c;适用于SMP系统&#xff1b; ② 对于单…

【Vue】Router路由无法跳转问题整理

问题集 整理了部分Vue Router路由无法跳转问题&#xff1a; 顶层router-view只能被顶层路由配置内容使用&#xff1a;此问题异常表现在路由跳转但页面不变子路由跳转必需父路由对应的组件中存在router-view&#xff1a;此问题异常表现在路由跳转但页面不变 子路由配置路径会自…

uniapp项目实践总结(十三)封装文件操作方法

导语&#xff1a;在日常 APP 开发过程中&#xff0c;经常要进行文件的保存、读取列表以及查看和删除文件等操作&#xff0c;接下来就看一下具体的方法。 目录 原理分析方法实现实战演练案例展示 原理分析 主要是以下 API。 uni.saveFile&#xff1a;保存文件到本地缓存列表…

处理流程设计-系统设计-人机界面设计

处理流程设计-系统设计-人机界面设计 流程表示工具&#xff08;重点&#xff09; 流程表示工具&#xff08;重点&#xff09; 数据流图也是一种 IPO 图 NS图和PAD图

为什么说电子元器件采购如果不够专业就容易上当受骗

电子元器件采购如果不够专业就容易上当受骗的原因有多方面&#xff0c;主要包括以下几点&#xff1a; 众多供应商和产品&#xff1a;电子元器件市场涉及众多供应商和各种不同的产品。如果采购人员不具备足够的专业知识和经验&#xff0c;可能会难以识别哪些供应商和产品是可信赖…

flink 写入数据到 kafka 后,数据过一段时间自动删除

版本 flink 1.16.0kafka 2.3 流程描述&#xff1a; flink利用KafkaSource&#xff0c;读取kafka的数据&#xff0c;然后经过一系列的处理&#xff0c;通过KafkaSink&#xff0c;采用 EXACTLY_ONCE 的模式&#xff0c;将处理后的数据再写入到新的topic中。 问题描述&#xff1…

【SpringMVC]获取参数的六种方式

目录 1.通过ServletAPI获取 2.通过控制器方法的形参获取 3.RequestParam&#xff1a;将请求参数和控制器方法的形参绑定 4.RequestHeader&#xff1a;将请求头信息与控制器方法的形参的值进行绑定 5. CookieValue&#xff1a;将cookie数据和控制器方法的形参绑定 Cookie&…

入门人工智能 —— 学习一门编程语言 python 基础代码编写和运算符介绍(1)

入门人工智能 —— 学习一门编程语言 python&#xff08;1&#xff09; 入门流程1.安装pythonwindowslinux ubuntu 代码编写打印输出结果 基本加减法介绍基本运算符 随着人工智能技术的快速发展&#xff0c;越来越多的年轻人开始关注这个领域。作为入门者&#xff0c;学习人工智…

文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题

一、用go语言&#xff0c;参照图 8-3 的方法&#xff0c;说明 RADIX-SORT在下列英文单词上的操作过程:COW&#xff0c;DOG&#xff0c;SEA&#xff0c;RUG&#xff0c;ROW&#xff0c;MOB&#xff0c; BOX&#xff0c; TAB&#xff0c; BAR&#xff0c; EAR&#xff0c;TAR&…

Java基于 SpringBoot 的车辆充电桩系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1、效果演示效果图技术栈 2、 前言介绍&#xff08;完整源码请私聊&#xff09;3、主要技术3.4.1 …

AI人工智能Mojo语言:AI的新编程语言

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 Mojo的主要功能包括&#xff1a; 类似Python的语法和动态类型使Python开发人员易于学习Mojo&#xff0c;因为Python是现代AI / ML开发背后的主要编程语言。使用Mojo&#xff0c;您可以导入和使用任何Python库&#xf…

2.8 PE结构:资源表详细解析

在Windows PE中&#xff0c;资源是指可执行文件中存放的一些固定不变的数据集合&#xff0c;例如图标、对话框、字符串、位图、版本信息等。PE文件中每个资源都会被分配对应的唯一资源ID&#xff0c;以便在运行时能够方便地查找和调用它们。PE文件中的资源都被组织成一个树形结…

“链主品牌”竞争战略四大误区

在《财富》500 强企业名单中&#xff0c;2008 年中国企业仅有 37 家&#xff0c;而 2019 年攀升至 119 家&#xff0c;与美国仅相差两家。2008 年&#xff0c;中国关注的问题是其在世界 500 强榜单上的企业数量太少。而如今的讨论则集中在为何中国企业规模大却实力不强。原因在…

有哪些做流程图的软件?分享一些制作方法和注意事项

流程图是一种常用的图表&#xff0c;可以用于表示各种工作流程、系统架构、决策流程等。在现代工作生活中&#xff0c;制作流程图已经成为了必备的技能之一。本文将介绍一些常用的做流程图的工具&#xff0c;并分享一些制作方法和注意事项。 做流程图的工具 1.迅捷画图&#x…

Node.js安装教程图文详解

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 下载Node.js 请下载Node.js并保存至本地&#xff0c;官方网址&#xff1a;https://nodejs.org/zh-cn/ 在此&#xff0c;选择windows系统64位的16.13.1版本进行下载。 下载…

【SLAM】Sophus库的超详细解析

在视觉SLAM中&#xff0c;李群李代数是描述位姿比较常用的一种表达形式。但是&#xff0c;在Eigen中并不提供对它的支持&#xff0c;一个较好的李群和李代数的库是Sophus库&#xff0c;它很好的支持了SO3、so3、SE3、se3。 Sophus简介 代码仓库&#xff1a;https://github.com…

laravel系列(二) Dcat admin框架开发工具使用

开发工具可以非常好的帮助我们去快速的开发CURD等操作,但也是有部分框架有些不是太便捷操作,这篇博客主要为大家介绍Dcat admin的开发工具详细使用. 如何创建页面: 在联表我们首先要去.env文件中去找连接数据库方法: APP_NAMELaravel APP_ENVlocal APP_KEYbase64:thO0lOVlzj0…