自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 第十一章 U-boot 顶层 Makefile 详解 (make 过程)

第 1137 行就是目标 u-boot.bin 的规则,目标 u-boot.bin 依赖于 u-boot-dtb.bin , 他们都是用了if_changed , if_changed是一个函数,这个函数在scripts/Kbuild.include 中有定义,而顶层 Makefile 中会包含 scripts/Kbuild.include 文件,这个前面已经说过了。stm32_gpio.o 是stm32_gpio.c 编译生成的.o 文件,这个是 ST 的 STM32 系列的 GPIO 驱动文件。

2024-04-10 11:04:42 892

原创 第十一章 U-boot 顶层 Makefile 详解 (Makefile.build 脚本分析)

conf 是主机软件。因 此,第 8 行就是在“scripts/basic”中查找符合“tpl/%”的部分,然后将“tpl/”取消掉,但是“scripts/basic”没有“tpl/”,所以 src= scripts/basic。__build 是默认目标,因为命令“@make -f ./scripts/Makefile.build obj=scripts/basic”没有指定目标,所以会使用到默认目标:__build。依赖为$(obj)/conf,展开后就是 scripts/kconfig/conf。

2024-04-10 10:31:12 870

原创 第十一章 U-boot 顶层 Makefile 详解 (make xxx_defconfig 过程)

第 502 行将 MAKECMDGOALS 中不符合“config”和“%config”的部分过滤掉,如果剩下的部分不为空条件就成立,很明显此处条件成立,变量 config-targets=1。第 501 行判断 KBUILD_EXTMOD 是否为空,如果 KBUILD_EXTMOD 为空的话条件成立,经过前面的分析,我们知道 KBUILD_EXTMOD 为空,所以条件成立。第 527 行如果变量 config-targets 为 1 的话条件成立,很明显,条件成立,执行这个分支。不为空的话条件就成立。

2024-04-07 11:30:47 830

原创 第十一章 U-boot 顶层 Makefile 详解 (导出其他变量)

第 24 行 定 义 变 量 ARCH , 值 为 $(CONFIG_SYS_ARCH:"%"=%) , 提取CONFIG_SYS_ARCH 里面双引号“”之间的内容。第 45 行sinclude 和 include 的功能类似,在 Makefile 中都是读取指定文件内容,这里读取文件$(srctree)/arch/$(ARCH)/config.mk 的内容。第 43 行定义变量 CPUDIR,值为 arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)。

2024-04-07 11:05:05 559

原创 第十一章 U-boot 顶层 Makefile 详解 (交叉编译工具变量设置)

上面我们只是设置了 CROSS_COMPILE 的名字,但是交叉编译器其他的工具还没有设置。

2024-04-07 10:48:22 121

原创 第十一章 U-boot 顶层 Makefile 详解 (调用 scripts/Kbuild.include)

在 uboot 的编译过程中会用到 scripts/Kbuild.include 中的这些变量,后面用到的时候再分析。示例代码使用“include”包含了文件 scripts/Kbuild.include,此文件里面定义了很多变量。主 Makefile 会调用文件 scripts/Kbuild.include 这个文件。

2024-04-07 10:46:15 178

原创 第十一章 U-boot 顶层 Makefile 详解 (设置目标架构、交叉编译器和配置文件)

从示例代码 11.2.9.1 可以看出,每次编译 uboot 的时候都要在 make 命令后面设置 ARCH 和 CROSS_COMPILE,使用起来很麻烦,可以直接修改顶层 Makefile,在里面加入ARCH 和 CROSS_COMPILE 的定义。uboot 是可以配置的,这里设置配置文件为.config,.config 默认是没有的,需要使用命令“make xxx_defconfig”对 uboot 进行配置,配置完成以后就会在 uboot 根目录下生成.config。

2024-04-07 10:40:48 429

原创 第十一章 U-boot 顶层 Makefile 详解 (获取主机架构和系统)

从图 11.2.8.2 可以看出此时的主机 OS 为“Linux”,使用管道将“Linux”作为后面“tr'[:upper:]''[:lower:]'”的输入,“tr '[:upper:]' '[:lower:]'”表示将所有的大写字母替换为小写字母,因此得到“linux。左边的输出作为右边的输入,sed -e 是替换命令,“sed -e s/i.86/x86/”表示将管道输入的字符串中的“i.86”替换为“x86”,其他的“sed -e s”命令同理。对于我的电脑而言, HOSTARCH=x86_64.

2024-04-07 10:17:08 218

原创 第十一章 U-boot 顶层 Makefile 详解 (模块编译)

第 214 行判断 KBUILD_EXTMOD 是否为空,如果为空的话目标_all 依赖 all,因此要先编译出 all。要先编译出 modules,也就是编译模块。第 203 行 判 断 是 否 定 义 了 SUBDIRS , 如 果 定 义 了 SUBDIRS , 变 量KBUILD_EXTMOD=SUBDIRS,这里是为了支持老语法“make SUBIDRS=dir”第 220 行判断 KBUILD_SRC 是否为空,如果为空的话就设置变量 srctree 为当前目录,即srctree 为“.”。

2024-04-07 10:05:21 223

原创 第十一章 U-boot 顶层 Makefile 详解 (代码检查)

uboot 支持代码检查,使用命令“make C=1”使能代码检查,检查那些需要重新编译的文。如果 C 来源于命令行,那就将 C 赋值给变量KBUILD_CHECKSRC,如果命令行没有 C 的话 KBUILD_CHECKSRC 就为 0。第 193 行判断 C 是否来源于命令行。“make C=2”用于检查所有的源码文件。

2024-04-07 09:45:24 110

原创 第十一章 U-boot 顶层 Makefile 详解(设置编译结果输出目录)

uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“O”来指定输出目录,比如“make O=out”就是设置目标文件输出到 out 目录中。这么做是为了将源文件和编译产生的文件分开,当然也可以不指定 O 参数,不指定的话源文件和编译产生的文件都在同一个目录内,一般我们不指定 O 参数。第 142 行判断“O”是否来自于命令行,如果来自命令行的话条件成立, KBUILD_OUTPUT就为$(O),因此变量 KBUILD_OUTPUT 就是输出目录。

2024-04-07 09:41:14 269

原创 第十一章 U-boot 顶层 Makefile 详解(静默输出)

因此$(filter 4.%,$(MAKE_VERSION))的 含 义 就 是 在 字 符 串 “ MAKE_VERSION ” 中 找 出 符 合 “ 4.% ” 的 字 符 (% 为 通 配 符 ) ,第 108 行 判 断 当 前 正 在 使 用 的 编 译 器 版 本 号 是 否 为 4.x , 判 断 $(filter4.%,$(MAKE_VERSION))和“ ”(空)是否相等。因此$(filter 4.%,$(MAKE_VERSION))不为空,条件成立,执行109~111 行的语句。

2024-04-07 09:32:12 340

原创 第一次实验 流水灯

为了换行不报错 要在?:中加入\来确保编译正确。要对GPIOB,E都要使能时钟。

2024-04-03 11:19:47 300 1

原创 第七章 系统信息与系统资源(7.6-END)

在操作系统下,内存资源是由操作系统进行管理、分配的,当应用程序想要内存时(这里指的是堆内存),可以向操作系统申请内存,然后使用内存;当不再需要时,将申请的内存释放、归还给操作系统;在许多的应用程序当中,往往都会有这种需求,譬如为一些数据结构动态分配/释放内存空间。

2024-04-03 09:50:49 679 1

原创 第七章 系统信息与系统资源(7.3 -7.5)

进程时间指的是进程从创建后(也就是程序运行后)到目前为止这段时间内使用 CPU 资源的时间总数,出于记录的目的,内核把 CPU 时间(进程时间)分为以下两个部分:⚫ 用户 CPU 时间:进程在用户空间(用户态)下运行所花费的 CPU 时间。有时也成为虚拟时间(virtual time)。⚫ 系统 CPU 时间:进程在内核空间(内核态)下运行所花费的 CPU 时间。这是内核执行系统调用或代表进程执行的其它任务(譬如,服务页错误)所花费的时间。

2024-04-02 18:05:33 975 1

原创 第七章 系统信息与系统资源(7.2.4-7.2.5)

strftime()函数也可以将一个 struct tm 变量表示的分解时间转换为为格式化字符串,并且在功能上比 asctime()和 ctime()更加强大,它可以根据自己的喜好自定义时间的显示格式,而 asctime()和 ctime()转换得到的字符串时间格式的固定的。localtime()函数可以把 time()或 gettimeofday()得到的秒数(time_t 时间或日历时间)变成一个 struct tm结构体所表示的时间,该时间对应的是本地时间。

2024-04-02 16:55:14 571 1

原创 第七章 系统信息与系统资源(7.1-7.2.3)

在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息,譬如获取系统时间、日期以及设置系统时间、日期等;除此之外,还会向大家介绍 Linux 系统下的/proc 虚拟文件系统,包括/proc 文件系统是什么以及如何从/proc 文件系统中读取系统、进程有关信息。

2024-03-30 11:03:15 897

原创 第六章 字符串处理(6.8-END)

在编程中,经常会需要将数字组成的字符串转换为相应的数字、或者将数字转换为字符串,在 C 函数库中同样也提供了相应的函数,本小节就向大家介绍这些函数的用法。

2024-03-30 10:07:27 786

原创 第六章 字符串处理(6.2-6.7)

C 语言函数库中提供了一个用于计算字符串长度的函数 strlen()。sizeof 和 strlen 的区别:⚫ sizeof 是 C 语言内置的操作符关键字,而 strlen 是 C 语言库函数;⚫ sizeof 仅用于计算数据类型的大小或者变量的大小,而 strlen 只能以结尾为' \0 '的字符串作为参数;⚫ 编译器在编译时就计算出了 sizeof 的结果,而 strlen 必须在运行时才能计算出来;

2024-03-29 15:28:30 523 1

原创 第十一章 U-boot 顶层 Makefile 详解(11.2.1-3)

分析 gcc 版本代码的时候一定是先从顶层 Makefile 开始的,然后再是子 Makefile,这样通过层层分析 Makefile 即可了解整个工程的组织结构。顶层 Makefile 也就是 uboot 根目录下的Makefile 文件,由于顶层 Makefile 文件内容比较多,所以我们将其分开来看。

2024-03-27 17:53:02 596

原创 第十一章 U-boot顶层Makefile详解(11.1)

将正点原子提供的 uboot 源码进行解压,解压完成以后的目录如图编译正点原子提供的 uboot 源码,然后将其发送到 Windows 下,编译后的目录如图: 对于上述文件: 这个文件夹里面存放着和架构有关的文件 。比如 arm、m68k、x86 等,我们现在用的是 ARM 芯片,所以只需要关心 arm 文件夹即可。 只截取了一部分,还有一部分 mach-xxx 的文件夹。mach 开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的 exyons 系列

2024-03-27 17:15:51 920

原创 9.3 TF-A编译测试

按 照 本 小 节 讲 解 的 方 法 编 译 生 成 tf-a-stm32mp157d-atk-serialboot.stm32 以后 , ../build/trusted 和 ../build/optee 目录就没了,也就是说此本小节的方法只能编译 tf-a-stm32mp157d-atk-serialboot.stm32了如果想重新编译 tf-a-stm32mp157d-atk-trusted.stm32,那么就按照以前的编译命令即可,不用修改 Makefile.sdk 文件!

2024-03-27 16:22:48 219

原创 9.2.2 修改设备树电源管理

ST 官方 STM32MP157 开发板用到了一颗 PMIC 芯片,型号为 STPMIC1A,PMIC 全称为Power Management IC,也就是集成电源管理芯片。随着 SOC 功能越来越强大,所需要的的电源要求也越来越高,最直观的就是电源种类很多。另外,电源的上电顺序也是有要求的。STPMIC1A 就是 ST 专门为 STM32MP1 系列设计的专用 PMIC。PMIC 芯片性能非常强大:· 输入电压 2.8V~5.5V。· 4 路可调的通用 LDO 输出。

2024-03-27 10:41:45 683

原创 9.2 TF-A 移植

设备树英文名字叫做 Device tree。用来描述板子硬件信息的。比如你的板子上的 CPU 有几个核、每个 CPU 核主频是多少,IIC、SPI 这些外设的寄存器范围是多少,IIC 接口下都挂了哪些设备等等。设备树文件是一种文本格式的文件,方便阅读与修改,文件后缀为.dts,设备树头文件后为.dtsi。和 C 语言一样.dts 可以引用头文件.dtsi, .dts 经过编译以后生成.dtb文件,.dtb 就是开发板要使用的。

2024-03-26 17:40:56 898

原创 第九章TF-A的移植

trusted 目录下的就是烧写到开发板中的 TF-A 镜像,进入 trusted 目录。从图 可以看出,编译出来了很多后缀为.bin、.elf、.ld、.stm32 这样的文件, 我们以前缀为“tf-a-stm32mp157d-ev1”的文件为例。正点原子 STM32MP157 开发板使用的主控型号是 STM32MP157DAA1,开发板硬件参考了 ST 官方的 STM32MP157 EVK 开发板,因此我们就需要使用表 9.1.2.1 中的这些文件,在移植的时候。

2024-03-26 17:10:17 164

原创 关于嵌入式Linux学习文章专栏

本人嵌入式Linux学习笔记都是转载正点原子文档。如有侵权,请联系我。

2024-03-26 16:28:17 76

原创 六、字符串处理(6.1)

在程序当中,经常需要在程序运行过程中打印出一些信息,将其输出显示到标准输出设备 stdout(譬如屏幕)或标准错误设备 stderr(譬如屏幕),譬如调试信息、报错信息、中间产生的变量的值等等,以实现对程序运行状态的掌控和分析。有时程序在运行过程中还需要从标准输入设备 stdin(譬如键盘)中读取字符串,将读取到的字符串进行解析,以指导程序的下一步动作、控制程序执行流程。

2024-03-26 16:25:46 562

原创 六、字符串处理(gets()与 scanf()的区别)

⚫ gets()函数支持输入的字符串中有空格。因为 gets()函数允许输入的字符串带有空格、制表符,输入的空格和制表符也是字符串的一部分,仅以回车换行符作为字符串的分割符。而对于 scanf 以%s 格式输入的时候,空格、换行符、TAB 制表符等都是作为字符串分割符存在,即分隔符前后是两个字符串,读取字符串时并不会将分隔符读取出来作为字符串的组成部分,一个%s 只能读取一个字符串,若要多去多个字符串,则需要使用多个%s、并且需要使用多个字符数组存储。

2024-03-26 16:13:38 889

原创 第五章文件操作 (5.9 删除文件)

使用 rmdir()函数即可删除一个目录,但函数并不能删除一个普通文件。通过系统调用 unlink()或使用 C 库函数 remove()。

2024-03-26 11:00:23 611

原创 嵌入式Linux学习笔记(C编程)

此两函数的区别在于,指定目录的方式不同, chdir()是以路径的方式进行指定,而 fchdir()则是通过文件描述符,文件描述符可调用 open()打开相应的目录时获得。代码中调用 open 函数打开文件时,传入的文件路径使用相对路径方式进行表示,那么该进程解析这个相对路径名时、会以进程的当前工作目录作为参考目录。一般情况下,运行一个进程时、其父进程的当前工作目录将被该进程所继承,成为该进程的当前工作目录。size: 缓冲区的大小,分配的缓冲区大小必须要大于字符串长度,否则调用将会失败。

2024-03-26 10:42:59 217

原创 宏定义方法求二人筛子点数大小

代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可。* @param a int整型 牛妹的点数。* @param b int整型 牛牛的点数。* @return int整型。

2023-08-18 10:06:45 15 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除