正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》第 8.1 章

《正点原子资料_A盘/02开发板原理图/IMX6ULL_MINI_V2.2(Mini底板原理图).pdf》

  • 资料盘 开发板资料链接: https://pan.baidu.com/s/1j5Jzbdx9i-g0cWIi3wf2XA 提取码:ag1u


正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第6.5讲” 的读书笔记。第6.5讲 I.MX6U 芯片的启动方式。

0. I.MX6U 启动方式详解

I.MX6U 支持多种启动方式以及启动设备,比如可以从 SD/MMC,NAND Flash,QSPIFlash 等启动。用户可以根据实际情况,选择合适的启动设备。不同的启动方式,其启动方式和启动要求也不一样,比如上一张的从 SD 卡启动就需要在 bin 文件前面添加一个数据头,其它的启动设备也是需要这个数据头的。本章我们就来学习一下 I.MX6U 的启动方式,以及不同设备启动的要求。

1. 启动方式的选择

BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0] 的设备来选择 BOOT 方式。BOOT_MODE[1:0] 的值是可以改变的,有两种方式,一种是改写 eFUSE (熔丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次,后面就不能再修改了,所以我们不使用。我们用的是通过修改 BOOT_MODE[1:0] GPIO 对应的高低电平来选择启动方式,所有的开发板都使用的这种方式,I.MX6U 有一个 BOOT_MODE1 引脚和 BOOT_MODE0 引脚,这两个引脚对应 BOOT_MODE[1:0] 。I.MX6U -ALPHA/Mini 开发板的这两个引脚的电路原理图如下图所示:

其中 BOOT_MODE1 和 BOOT_MODE0 在芯片内部是有 100KΩ 下拉电阻的,所以默认是0。 BOOT_MODE1 和 BOOT_MODE0 这两个引脚我们也接到了底板上的拨码开关上,这样我们就可以通过拨码开关来控制  BOOT_MODE1 和 BOOT_MODE0 的高低电平。以  BOOT_MODE1 为例,当我们把 BOOT_CFG 的第一个开关拨到 “ON” 位置时,就相当于 BOOT_MODE1 引脚通过 R88 这个 10K 电阻接到了 3.3V 电源,芯片内部的 BOOT_MODE1 又是 100K 下拉电阻接地,因此 BOOT_MODE1 的电压就是 100(10+100)*3.3v=3V,这个就是高电平,因此 BOOT_CFG 的8个开关拨到“ON” 就是高电平,拨到“OFF”就是低电平。

而 I.MX6U 有四个 BOOT 模式,这四个 BOOT 模式由 BOOT_MODE[1:0] 来控制,也就是 BOOT_MODE1 和 BOOT_MODE0 这两个IO,BOOT 模式的配置如下表所示:

BOOT_MODE[1:0]BOOT类型
00从 FUSE 启动
01串行下载
10内部BOOT模式
11保留

在 表 9.1.1 中,我们只用到第二种和第三种BOOT方式。

1.1 串行下载

当 BOOT_MODE1 为0, BOOT_MODE0=1的时候使能此模式,串行下载的意思就是可以通过USB或UART将代码下载到板子上的外置存储设置中,我们可以使用 OTG1 这个 USB 口向开发板上的 SD/EMMC ,NAND 等存储设备下载代码。我们需要将 BOOT_MODE1 拨到 “OFF”,将 BOOT_MODE0 拨到“ON”。这个下载需要用到NXP提供的一个软件,一般用来最终量产的时候将代码烧写到外置的存储设备总的,我们后面讲解如何使用。

1.2 内部BOOT方式

当 BOOT_MODE1 为1, BOOT_MODE0=0的时候使能此模式,在此模式下,芯片会执行内部 bootROM 代码,这段 bootROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(也就是存放代码的设备,比如 SD/EMMC,NAND)中将代码拷贝复制到RAM中,一般是放在DDR中。

2. BOOT ROM 初始化内容

当我们设置 BOOT 模式为 “内部BOOT模式”以后,I.MX6U 的把内部 boot ROM 代码就是执行,这个 boot ROM 代码会做什么处理呢?首先肯定是初始化时钟,boot ROM 设置的系统是中国如下图所示:

在上图中 BT_FREQ 模式为0,可以看到,boot ROM 会将 I.MX6U 的内核时钟设置为 396MHz,也就是主频为 396MHz。System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,IPG=66MHz。关于I.MX6U的系统时钟,我们后面会详细讲解。

内部 boot ROM 为了加快执行速度回打开 MMU 和 Cache:

  • 下载镜像的时候 L1 ICache 会打开,
  • 验证镜像的时候 L1 DCache,L2 Cache 和 MMU 都会打开。
  • 一旦镜像验证完成,boot ROM 就会关闭 L1 DCache,L2Cache 和 MMU 

中断向量偏移会被设置到 boot ROM 的起始位置,当 boot ROM 启动了用户代码以后就可以重新设置中断向量偏移了。一般是重新设置到我们用户代码开始的地方,关于中断的内容后面会详细讲解。

3. 启动设备

当 BOO_MODE 设置为内部BOOT模式以后,可以从一下设备中启动:

  1. 接到 EIM 接口的 CS0 上的 16 位 NOR Flash。
  2. 接到 EIM 接口的 CS0 上的 OneNAND Flash。
  3. 接到 GPMI 接口上的 MLC/SLC NAND Flash,NAND Flash 页大小支持 2KByte, 4KByte 和 8Kbyte,8位宽。
  4. Quard SPI Flash
  5. 接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC等设备。
  6. SPI接口的 EEPROM

这些设备启动如何选择呢? I.MX6U 同样提供了 eFUSE 和 GPIO 配置两种,eFUSE 就不讲解了。我们重点看如何通过 GPIO 来选择启动设备,因为所有的 I.MX6U 开发板都是通过 GPIO 来配置启动设备的。正如启动模式由 BOOT_MODE[1:0]来选择一样,启动设备是通过 BOOT_CFG1[7:0] ,BOOT_CFG2[7:0] 和 BOOT_CFG4[7:0] 这 24 个配置IO,这24个配置IO刚好对应着 LCD 的24根数据线 LCD_DATA0 ~ LCD_DATA23,当启动完成以后这个24个IO就可以额作为LCD的数据线使用。这24个数据线和 BOOT_MODE1, BOOT_MODE0 共同组成了 I.MX6U 的启动选择引脚,如图 9.3.1 所示:

通过 图 9.3.1 中的 26 个启动IO即可实现 I.MX6U 从不同设备启动,BOOT_MODE1 和 BOOT_MODE0 已经讲述过了。看到这24个 IO 是不是头大?调整这24个IO的高低电平得多复杂啊?起始不然,虽然有24个IO,但是实际需要调整的只有那几个IO,其它的IO全部下拉接地即可,也就是设置为0.打开 I.MX6U-ALPHA/Mini的开发板核心板电路原理图,这24个IO的默认配置如下图所示:

可以从"正点原子 I.MX6U ALPHA"开发板原理图中看出,"正点原子 I.MX6U ALPHA"开发板的 LCD_DATA0~LCD_DATA23 大部分 IO 都接地了,只有几个 IO 拉高,尤其是 BOOT_CFG4[7:0] 这8个IO都有 10 K 电阻下拉接地,所以我们压根就不需要去关心 BOOT_CFG4[7:0]。我们需要中断关注的只剩下了 BOOT_CFG2[7:0] 和 BOOT_CFG1[7:0] 这16个IO。这16个配置IO的含义在原理图的左侧已经贴出来了,如下图所示。

图 9.3.3 看着是不是也很头大,BOOT_CFG1[7:0]和BOOT_CFG2[7:0]这16个IO还能不嗯呢再减少哪?可以,打开 I.MX6U ALPHA/Mini 开发板的底板原理图,底板上设备选择拨码开关原理图如下:

在图 9.3.4 中,除了 BOOT_MODE1 和 BOOT_MODE0 必须印出来,LCD_DATA3~LC_DATA7,LCD_DATA11 这 6个IO也被印出来,可以通过拨码开关来设置其对应的高低电平,拨码开关到 “ON” 就是1,拨码开关到 “OFF” 就是0.齐总 LCD_DATA11 就是 BOOT_CFG2[3],LCD_DATA3~LCD_DATA7 就是 BOOT_CFG1[3]~BOOT_CFG1[7],这6个IO的配置的含义如下表:

BOOT_CFG引脚对应LCD引脚含义
BOOT_CFG2[3]LCD_DATA11为0时SDHC1上的SD/EMMC启动,为1时从SDH2上的SD/EMMC启动。
BOOT_CFG1[3]LCD_DATA3当从SD/EMMC启动的时候设置启动速度,当从NAND启动的时候设置ANND数量。
BOOT_CFG1[4]LCD_DATA4

BOOT_CFG1[7:4]: (高位在前,低位在后)
0000 NOR/OneNAND(EIM)启动

0001 QSPI启动

0011 SPI启动

010x SD/eSD/SDXC启动

011x MMC/eMMC启动

1xxx NAND Flash启动

BOOT_CFG1[5]LCD_DATA5
BOOT_CFG1[6]LCD_DATA6
BOOT_CFG1[7]LCD_DATA7

根据表 9.3.1 中 BOOT IO 含义,I.MX6U-ALPHA/Mini 开发板从SD卡,EMMC,NAND 启动的时候拨码开关各个位置配置方式如下表所示

12345678启动设备
01xxxxxx串行下载,可以通过USB烧写镜像文件
10000010SD卡启动
10100110EMMC启动
10001001NAND FLAHS启动

我们再“第八章 汇编LED实验”中,最终的可执行问价 led.bin 烧写到了 SD 卡里面,然后从SD卡启动,其拨码开关就是根据表 9.3.1 来设置的,通过上面的讲解酒味道为什么拨码开关要这么设置了。

4. 镜像烧写

注意!本小节会分析 bin 文件添加的头部信息,但是在笔者写本教程的时候关于I.MX 系列的SOC头部信息的资料很少,基本智能参考NXP的官方资料,而官方资料有些地方讲解的又不是很详细。所以本节有些部分是笔者根据NXP的官方 u-boot.imx 文件的头部信息反推出来的,因此难免有错误的地方,还望大家谅解!如有发现错误之处,欢迎大家在 www.openedv.com 论坛
上留言。

前面我们设置好 BOOT 以后就能从指定的设备启动了,但是你的设备里面得有代码啊,在第八章我们使用 imxdownload 这个软件将 led.bin 烧写到 SD 卡中。imxdownload 会在 led.bin 前面添加一些头信息,重新生成一个叫做 load.imx 的文件,最终烧写的是 load.imx。那么肯能就有人问:imxdownload 是如何将 led.bin 打包成 load.imx的。

学习STM32的时候我们可以直接将编译生成的.bin文件烧写到STM32内部的Flash里面,但是 I.MX6U 不能直接烧写编译生成的 .bin文件,我们需要再.bin文件前面添加一些头信息构成满足 I.MX6U 需求的最终可烧写文件,I.MX6U的最终可烧写文件注册如下:

  1. Image vector rable,简称 IVT,IVT 里面包含了一系列地址信息,这些地址信息在ROM里按照固定的地址存放着。
  2. Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
  3. Device configuration data,简称 DCD ,设别配置信息,重点是 DDR3 的初始化配置。
  4. 用户代码可执行文件,比如 led.bin 

可以看出最终烧写到 I.MX6U 中的程序其组成为 IVT+Boot data + DCD + .bin 。所以第8章中的 imxdownload 所生成的 load.imx 就是在 led.bin 前面加上 IVT + Boot data + DCD 。内部 boot ROM 会将 load.imx 拷贝到DDR中,用户代码前面又有 3KByte的 IVT+Boot Data + DCD数据,下面会讲一下为什么是 3KByte,因此 load.imx 在DDR中的起始地址就是 0x8780_0000 - 3072 = 0x877F_F400。

正点原子的教程,我自己理解画的一个SD卡作为启动设备时,SD上烧录镜像的格式,如下图:

4.1 IVT 和 Boot Data 数据

load.imx 最前面就是 IVT 和 Boot Data ,IVT 包含了镜像程序的入口点,指向 DCD指针和一些用作其他用途的指针。内部 boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,起始就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定为止去。整个位置都是相对于存储初设备的起始地址的偏移,如图 9.4.1 所示:

以 SD/EMMC 为例,IVT偏移为 1KByte,IVT+Boot Data+DCD总大小为4KByte - 1KByte = 3KByte。假设 SD/EMMC 每个扇区为 512 字节,那么 load.imx 应该从第三个山城区开始烧写,前两个扇区要流出来。load.imx 从第3KBbyte开始才是真正的 .bin 文件。那么 IVT 里究竟存放着什么东西呢?IVT里存放的内容如下表 9.4.1.2 所示

从 图 9.4.1.2 可以看到,第一个存放的是 head (头),header 的给是如 图 9.4.1.3 所示:

图9.4.3 中,Tag位1字节长度,固定为 0xD1,Length是两个字节,保存着IVT 长度,位大端格式,也就是高字节保存在低内存中。最有的Version是一个字节,为 0x40 或者 0x41。

Boot Data 的数据格式如图 9.4.1.3 所示

实际情况是不是这样的呢?我们用 winhex 打开 load.imx 一看便知,winhex 可以直接查看一个文件的二进制格式数据。用winhex打开 load.imx 如下图所示

图 9.1.4.1 是我们截取的 load.imx 的一部分内容,从地址 0x0000_0000 ~ 0x0000_025F,共608字节的数据。气门将钱44个字节按照4个字节一组组的组合在一起就是,0x402000D1, 0x8780000, 0x00000000, 0x877FF42C,0x877FF420,0x00000000,0x0000000,0x877FF000,0x00200000,0x00000000。这44个字节的内容就是 IVT和Boot Data的数据,按照图 9.4.1.2 和图 9.4.1.4 所示的 IVT 和 Boot Data 所示的格式对应起来如表 9.4.1.1 所示:

4.2 DCD 数据

复位以后,I.MX6U 片内所有寄存器就会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设在我们必须在使用之前初始化它。为此 I.MX6U 提出了一个 DCD (device Config Data) 的概念,和 IVT , Boot Data 一样,DCD也是添加到 load.imx 里面的,紧跟在 IVT 和 Boot Data 后面,IVT里面也指定了DCD的位置。DCD起始就是 I.MX6U 寄存器地址和对应配置的集合信息,boot ROM 会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设时钟,初始化DDR等等。DCD去不不能超过 1768 Byte,DCD区域的结构如 9.4.2.1 所示

DCD 的 header 和 IVT 的 header 类似,结构如图 9.4.2.2 所示
中 Tag 是单字节,固定为 0XD2, Length 为两个字节,表示 DCD 区域的大小,包含 header,同样是大端模式, Version 是单字节,固定为 0X40 或者 0X41。

图 9.4.2.1 中的 CMD 就是要初始化的寄存器地址和相应的寄存器值, 结构如图 9.4.2.3 所示:

图 9.4.2.3 中 Tag 为一个字节,固定为 0XCC。 Length 是两个字节,包含写入的命令数据长度,包含 header,同样是大端模式。 Parameter 为一个字节,这个字节的每个位含义如图 9.4.2.4 所示

图 9.4.2.4 中的 bytes 表示是目标位置宽度,单位为 byte,可以选择 1、 2、和 4 字节。 flags 是命令控制标志位。

图 9.4.2.3 中的 Address 和 Vlalue/Mask 就是要初始化的寄存器地址和相应的寄存器值,注意采用的是大端模式! DCD 结构就分析到这里,在分析 IVT 的时候我们就已经说过了, DCD 数据是从图 9.4.1.4 的 0X2C 地址开始的。根据我们分析的 DCD 结构可以得到 load.imx 的 DCD 数据如表 9.4.2.1 所示:

从 表 9.4.2.1 中可以看出,DCD 里面初始化配置主要包括三个方面

  1. 设置CCGR0~CCGR6这个7个外设时钟寄存器,默认打开所有外设时钟
  2. 配置DDR3所用的所有IO
  3. 设置MMDC控制器,初始化DDR3

I.MX6U的启动过程我们就讲解到这里,本章我们详细的讲解了 I.MX6U 的启动模式,启动设备类型,和镜像烧写过程。总结一下,我们编译出来的 .bin 文件不能拿直接烧写到SD卡中,需要再.bin文件前面加上 IVT, Boot DATA和DCD这三个数据块。这三个数据块是有指定格式的,播我们必须按照格式填写,然后将其放到.bin文件前面,最终和策划给你的才是我们可以直接烧写到SD卡中的文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想要吃瓜,就要学会,在不必要的冲突发生时,沉默就是一种智慧——早读(逆天打工人爬取热门微信文章解读)

练习一下怼人的本事 引言Python 代码第一篇 洞见 养生的尽头,是养格局第二篇 人民日报 来啦 早班新闻车要闻社会 政策结尾 沉默是智者的选择 在不必要的冲突面前 选择沉默是一种智慧 引言 昨天下午睡醒 看到群里有些言论 遂 battle了一波 给大家吃吃瓜 到中午 车…

Codeforces Round 941 (Div. 2) D. Missing Subsequence Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

网络安全之弱口令与命令爆破(中篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具验证码爆破 总结 笔记改错 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&a…

MyBatis中的#{} 和 ${}

目录 #{} 和 ${} 预编译 SQL 和 即时 SQL SQL注入 ${}的使用 #{} 和 ${}的使用 MyBatis参数赋值有两种方式&#xff0c;在上一篇文章中&#xff0c;一直使用 #{} 进行赋值&#xff0c;接下来&#xff0c;我们来使用 ${} 进行赋值&#xff0c;并观察 #{} 和 ${} 的区别 使用…

2024年外贸企业邮箱最新排名

外贸企业在与客户沟通中的重要工具就是企业邮箱&#xff0c;那么外贸企业邮箱哪个比较好呢&#xff1f;本文聚焦2024年外贸企业邮箱市场的最新动态&#xff0c;通过对五个领先品牌的深度对比&#xff0c;旨在为企业决策者提供详尽参考。首当其冲的是备受瞩目的Zoho Mail企业邮箱…

JMeter性能压测脚本录制

第一步&#xff1a;电脑打开控制面板设置代理服务器 第二步&#xff1a;jmeter的测试计划添加一个HTTP&#xff08;S&#xff09;脚本记录器 在脚本记录器里配置好信息&#xff0c;然后保存为脚本文件&#xff08;.*表示限定&#xff09; 此方框内容为项目地址&#xff08;可改…

字符串函数与字符函数运用(1)

字符串与字符函数介绍1 前言一、字符分类函数字符函数练习 二、字符函数转换1.引入库2.代码改进 字符串函数strlen函数strcpy 结尾 前言 字符串函数大概有以下这几种 strcpy、strcat 、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror 这些函数可以很好的解决你…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能&#xff0c;让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

神经网络中常见的激活函数:理解与实践

神经网络中常见的激活函数&#xff1a;理解与实践 在神经网络中&#xff0c;激活函数是一个非常重要的组成部分&#xff0c;它为神经元引入了非线性特性&#xff0c;使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数&#xff0c;包括它们的概述、公式以及…

《百图解码支付系统设计与实现》电子书_V20240503

《百图解码支付系统设计与实现》这本书的底稿已经完成一半&#xff0c;从2023.12.24发布专栏第一篇文章“跟着图走&#xff0c;学支付&#xff1a;在线支付系统设计的图解教程”算起&#xff0c;陆续写了30来篇支付相关的干货。 本书是我的专栏《百图解码支付系统设计与实现》…

基于Spring Boot的校园闲置物品交易网站设计与实现

基于Spring Boot的校园闲置物品交易网站设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看…

springboot项目组合定时器schedule注解实现定时任务

springboot项目组合定时器schedule注解实现定时任务&#xff01; 创建好springboot项目后&#xff0c;需要在启动类上增加注解开启定时器任务 下图所示&#xff1a; 增加这个注解&#xff0c;启动项目&#xff0c; package com.example.scheduledemo.util;import org.springf…

C++中的异常

目录 1.C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3异常安全 3.4 异常规范 4.自定义异常体系 5.C标准库的异常体系 6.异常的优缺点 7.func&#xff08;&#xff09; throw();的方式规范化 1.C语言传统的处理…

C语言字符串(0基础到深入剖析)---字符串系列合集(函数+指针+数组)

前言 本篇旨在帮助不了解字符串或者逻辑梳理不够透彻的伙伴们理出一条脉络。选择能看懂的部分即可&#xff0c;建议收藏&#xff0c;后期学习完C语言方便回顾。 适用范围&#xff1a;0基础C语言&#xff08;刚学字符串&#xff09;- 学过函数 - 学过指针 ---大致了解了数据内…

Centos7 安装Git、使用

Centos7 安装Git 一、安装步骤1.1 查看版本1.2 卸载1.3 安装 二、创建仓库2.1 新增仓库2.2 新增配置项 三、管理文件3.1 文件创建3.2 文件修改、add、commit3.3 tree结构探索 四、分支4.1 创建分支&#xff1a;4.2 查看分支4.3 切换分支4.4 删除分支4.5 合并冲突 一、安装步骤 …

FusionMamba: Efficient Image Fusion with State Space Model【文献阅读】

论文&#xff1a;FusionMamba&#xff1a;一种基于SSM的有效图像融合方法 arXiv&#xff1a;https://arxiv.org/abs/2404.07932 作者单位&#xff1a;中国科学院自动化研究所、模式识别重点实验室、电子科技大学 推荐阅读&#xff1a;深入浅出一文图解Vision Mamba Abstract 图…

3.自动驾驶-局部路径规划

1. 规划planning 2. 局部路径规划模块实现-模块外围&#xff1a;输入 3. 局部路径规划模块实现模块外围:输出 4. 控制control 5. 系统分类 6 系统分类

C 认识指针

目录 一、取地址操作符&#xff08;&&#xff09; 二、解引用操作符&#xff08;*&#xff09; 三、指针变量 1、 指针变量的大小 2、 指针变量类型的意义 2.1 指针的解引用 2.2 指针 - 整数 2.3 调试解决疑惑 认识指针&#xff0c;指针比较害羞内敛&#xff0c;我们…

自定义SpringBoot的starter

案例需求&#xff1a;自定义redis-stater。要求当导入redis坐标时&#xff0c;SpringBoot自动创建Jedis的Bean。 实现步骤&#xff1a; 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块&#xff0c;依赖redis-spring-boot-autoconfigure的…

Android 文件传输

经常写adb命令传文件&#xff0c;结果发现Android studio有自带的文件管理器&#xff0c;可以上传下载文件。
最新文章