系列文章目录
嵌入式硬软件基础知识
嵌入式硬软件基础知识
1、uboot是干什么的?
U-Boot(Universal Bootloader)是一个广泛使用的开源引导加载程序,主要设计用于嵌入式系统。它的主要职责和功能包括:
硬件初始化:U-Boot首先运行,初始化CPU、内存、外设等硬件资源,为加载和运行Linux内核准备环境。
加载内核映像:U-Boot会从存储介质(如Flash、硬盘、网络等)读取Linux内核映像(通常是zImage或uImage格式),并将其加载到RAM中一个预定的地址。
设置启动参数:U-Boot还会设置传递给Linux内核的启动参数(通过命令行参数),这些参数定义了内核如何运行,包括根文件系统的位置、驱动模块的加载、调试选项等。
执行内核:一旦内核和必要的参数都准备好了,U-Boot就会跳转到内核的入口点,开始执行Linux内核代码,进而启动整个Linux系统。
挂载根文件系统:Linux内核接着会根据启动参数挂载根文件系统,根文件系统包含了系统运行所需的库、驱动、服务和应用程序。
U-Boot因其高度可配置性、跨平台支持和丰富的功能集,成为了嵌入式Linux系统中最常用的引导加载程序之一。
2、服务器linux系统用uboot加载引导吗
通常情况下,服务器级别的Linux系统并不使用U-Boot作为引导加载程序。服务器系统更多采用如BIOS(Legacy BIOS)或更现代的UEFI(Unified Extensible Firmware Interface)作为其启动加载机制。这些引导加载方式适用于x86架构的服务器平台,它们负责初始化系统硬件、检测内存、加载和执行启动加载器(如GRUB, LILO等),进而加载Linux内核并启动操作系统。
相比之下,U-Boot主要设计用于嵌入式系统,尤其是在非x86架构(如ARM、PowerPC、MIPS等)的平台上非常常见。它提供了强大的硬件控制能力、网络支持以及灵活的配置选项,特别适合资源受限或需要高度定制启动流程的嵌入式环境。
当然,也有特例存在,比如一些基于特定应用场景或定制需求的服务器平台可能会采用U-Boot,但这并不属于服务器领域的普遍做法。在大多数标准服务器部署中,Linux系统的引导流程始于BIOS/UEFI,继而通过传统的启动加载器加载Linux内核。
3、IO 分为两类:SNVS 域的和通用的IO
在嵌入式系统,尤其是微控制器和SoC(System on Chip)设计中,IO(Input/Output)确实可以根据其功能和用途被分类为不同的域。“SNVS”通常指的是“Secure Non-Volatile Storage”的缩写,在某些芯片设计中,它涉及到安全和非易失性存储相关的功能 与此相关联的IO,即SNVS域的IO,通常指的是那些专门用于安全相关或需要持久化存储功能的输入输出接口。这些接口可能用于访问加密密钥、存储安全配置信息或与安全协处理器通信,确保即使在系统掉电后这些敏感信息也能得到保护。
通用IO(General Purpose Input/Output,简称GPIO)则是指那些没有特定预定义功能,可以由用户根据需要配置为输入或输出的引脚。 GPIO广泛应用于控制外部设备、信号传感或简单数据传输等场景,其功能灵活性高,能够满足各种各样的应用需求。在很多单片机或SoC中,GPIO的数量和配置灵活性是评估芯片适用性的重要指标之一。
在一些SoC设计中,如i.MX系列等,IOMUXC(IO Multiplexing Controller)用来控制和配置这些不同域的IO,允许用户通过软件配置将引脚功能映射到不同的信号上,比如从通用IO重配置为SNVS相关的功能,或者反之,这极大提升了系统的灵活性和可编程性。IOMUXC_SNVS则特指用于控制那些与SNVS域相关的IO配置的寄存器组。
4、嵌入式上下拉电阻区别
在嵌入式系统中,上下拉电阻是常见的电路元件,用于确保输入信号在无主动驱动时有一个确定的状态,以及提供其他电气特性上的好处。下面是上拉电阻和下拉电阻的主要区别:
上拉电阻:
功能:上拉电阻通常将一个不确定的信号连接到高电平(VCC),这样当没有其他电路驱动该信号时,它默认保持在高电平状态。
电流流向:当端口被配置为输入时,如果外部设备未将其拉低,上拉电阻会通过一个小电流(称为上拉电流)到VCC,确保输入保持高电平。
应用:适用于需要默认高电平的场合,如I²C总线的上拉电阻确保总线在空闲时不浮空,以及在开漏输出电路中确保有明确的高电平信号。
下拉电阻:
功能:下拉电阻则将信号连接到低电平(GND),确保在无主动驱动时信号维持低电平状态。
电流流向:当下拉电阻连接的引脚未被外部电路驱动至高电平时,电流会通过下拉电阻流向GND,形成下拉电流,使信号线保持低电平。
应用:适用于需要默认低电平的场景,例如在复位电路中,确保系统上电初始时,复位信号有效,保持系统在复位状态直到释放。
共同点:
避免浮动:无论是上拉还是下拉电阻,都可以防止输入信号在无驱动时处于不确定的浮空状态,减少噪声干扰。
限流保护:它们都起到一定的限流作用,可以防止电流过大损坏电路元件。
电阻值选择:电阻值通常在1kΩ到10kΩ之间,具体取决于电路的需求,如信号速度、功耗限制等。
选择上拉还是下拉电阻,主要依据系统逻辑需求和电路设计的具体情况。
5、开路输出
开路输出(Open Circuit Output)是指在电子电路中,输出端没有连接任何负载,即输出端是断开的状态。 在这种情况下,输出电路中没有形成完整的回路,因此理论上电流为零,输出电压则取决于电路的特性。具体来说,开路输出可以是故意设计的,如在某些电路配置中,或者是由于电路故障,如断线、开关未闭合、连接器松脱等造成。
对于特定的电路元件或配置,如集电极开路输出(Open Collector Output)的晶体管,这是一种特意设计的开路输出形式。在这种配置中,晶体管的集电极在不连接外部上拉电阻的情况下,是没有内部连接到电源的,因此当晶体管截止时,其集电极为开路状态,既不拉低也不抬高输出电压,输出呈现高阻态。当需要输出低电平时,晶体管导通,将输出拉低至接近地电位;而要输出高电平,则需要外部上拉电阻将电压拉高到所需电平。 这种设计常用于需要电平转换、线与逻辑、或其他需要灵活控制输出电压的应用中。
6、IO与GPIO
IO(Input/Output,输入/输出) 是一个广泛的概念,涵盖了所有用于计算机或其他电子系统与外部设备之间数据交换的接口和技术。它描述了系统与外界沟通的方式,包括但不限于串行通信(如UART、USB)、并行通信、网络通信等。IO不仅涉及硬件层面的物理接口,也包括软件层面对这些接口的控制和数据处理。
GPIO(General-Purpose Input/Output,通用输入/输出)是IO的一个子集,专指那些设计为可由用户自由配置为输入或输出的电子引脚。 这些引脚的功能不像专用IO(例如UART或SPI引脚)那样固定,而是非常灵活,可以根据应用需求动态设置。GPIO常用于简单的数字信号控制,比如控制LED灯的亮灭、读取按钮的状态、或是与其他数字电路进行基本的通讯。GPIO的操作通常通过微控制器或SOC中的寄存器完成,软件可以读取这些寄存器来检测引脚的电平状态,或者修改寄存器的值来改变引脚的输出电平。
总结来说,IO是一个涵盖所有输入输出操作的总称,而GPIO是针对那些具有高度灵活性和通用性的输入输出引脚的特定类型。在实际的嵌入式系统设计中,GPIO是实现简单交互和控制功能的一种常用手段。
7、大端模式
大端模式(Big-Endian)是一种数据存储格式,又称为大尾序或大端字节序。在大端模式下,多字节数据类型(如整数、浮点数)的最高有效字节(MSB,Most Significant Byte)存储在内存的最低地址处,而最低有效字节(LSB,Least Significant Byte)存储在最高地址处。这种存储方式符合人类常用的书写顺序,比如我们阅读数字时是从高位到低位,因此大端模式有时候被认为更符合人的直觉。
举例来说,假设有一个32位的整数0x12345678(十六进制表示),在大端模式的内存中,它会这样存储:
地址 0x00: 0x12(最高字节)
地址 0x01: 0x34
地址 0x02: 0x56
地址 0x03: 0x78(最低字节)
网络传输协议如TCP/IP中的许多部分默认使用大端模式,因此它有时也被称为网络字节序。在进行跨平台或网络通信时,如果两端的系统使用不同的字节序,就需要进行字节序的转换以确保数据正确解析。
8、在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据
在ARM开发板上,栈(Stack)是一个重要的内存区域,用于存储程序运行时的临时数据。当设置栈大小为2MB时,这片内存区域主要用于以下几个目的:
1.函数调用信息: 每次函数调用时,都会将返回地址(即调用函数之后应该继续执行的指令地址)压入栈中。这样,当函数执行完毕,可以通过弹出栈顶的返回地址回到调用前的位置继续执行。
2.局部变量: 函数内部声明的局部变量通常存储在栈上。这些变量的生命期与函数执行期相同,函数退出时,这些变量所占用的栈空间会被自动释放。
3.函数参数: 在很多架构中,函数的参数也是通过栈传递的。调用函数时,参数从右到左依次压入栈中。
4.保存寄存器内容: 在函数调用前后,为了保护现场,一些寄存器的值会被暂时保存到栈上。这样,函数执行完毕后,可以通过恢复这些寄存器的内容来还原调用前的状态。
5.异常处理信息: 在处理中断或异常时,CPU会自动保存当前状态到栈上,包括程序状态寄存器(PSR)、链接寄存器(LR)等,以便异常处理完成后能恢复到中断前的状态。
6.动态内存分配(在某些特殊情况下): 虽然通常动态分配的内存是在堆上进行的,但在某些嵌入式系统或特殊情况中,如果堆和栈的界限不严格分离,也可能会从栈上分配临时的大块内存。
总的来说,栈是程序运行时用作临时存储的动态内存区域,它确保了函数调用的正确嵌套和局部数据的有效管理。2MB的栈大小为大多数常规应用提供了充足的空间,但也需要根据实际程序的复杂度和调用深度进行适当调整。
END