ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

嵌入式基础知识

嵌入式基础知识 ARM 内核版本号架构如ARMv7是ARM公司确定的ARMv7是32位(见到的芯片多是该架构)ARMv8是64位但也支持32位。该架构定义了处理器的基本指令集、体系结构以及支持的技术特性。ARM SoC版本号内核如Cortex-A8是ARM公司确定的分割成了三条产品线应对市场细分需要Cortex-A(高性能)Cortex-R(高可靠性)Cortex-M(低功耗、低成本)芯片型号如 S5PV210半导体公司确定单片机开发和嵌入式开发的区别单片机可以视为嵌入式系统的一个子集是简化版的嵌入式系统适用于轻量级和成本敏感的应用。但一般单片机开发也被叫嵌入式开发。单片机开发多为裸机也跑一些RTOS但程序规模较小一般使用C语言和少量汇编。外设多使用串口I2CADCSPI等简单外设。学习路线短职业平缓。嵌入式一般使用嵌入式操作系统如liunx和Android一般使用C、C、JAVA语言。外设多使用网络、USB、音频解码等复杂外设。学习路线长职业生涯久。嵌入式系统构成特点专用、软硬件可裁剪可配置低功耗、高可靠与稳定代码可固化实时性弱交互专业开发环境与人员嵌入式系统组成硬件微处理器、存储器、I/O接口、输入输出软件嵌入式操作系统、BSP板级支持包、应用软件嵌入式系统分层硬件层Hardware Layer这是系统的物理基础包括处理器、存储器、输入/输出接口等硬件组件。硬件层定义了系统的物理特性和限制。板级支持包Board Support Package, BSP层这一层可以视作硬件层与软件层之间的一个过渡层负责初始化硬件、配置外设、提供硬件抽象确保操作系统能正确识别和控制硬件。有时也被归并在驱动层讨论。驱动层Driver Layer驱动程序直接控制硬件设备为操作系统提供访问硬件的接口。这层包括各种设备驱动如传感器、显示屏、网络接口等的驱动。操作系统内核层Kernel Layer操作系统的核心部分负责管理和调度硬件资源如内存管理、进程管理、中断处理、线程调度等。它是硬件和应用程序之间的桥梁。中间件层Middleware Layer这一层可选但重要它提供了一系列服务和库如网络协议栈、图形用户界面GUI库、数据库管理系统等帮助应用程序开发者更高效地开发复杂功能。应用层Application Layer顶层包含用户直接交互的应用程序和服务。这一层实现了系统的最终功能如数据采集、控制逻辑、用户界面等。在某些描述中BSP可能被整合到硬件层或驱动层中而中间件层可能被视为操作系统层的一部分或单独作为一个层次。嵌入式开发模式非嵌入式开发A类机器编写与编译得到可执行程序发布给A类机器运行。电脑-电脑嵌入式开发(交叉编译)A类机器编写与编译得到可执行程序发布给B类机器运行。电脑-嵌入式B类处理器架构和资源限制如存储空间小、处理能力有限不适合直接在其上进行编译操作。需要有一套针对目标平台的编译工具链Cross Compiler这套工具链能够生成对应于目标平台的机器代码。工具链中包含了编译器、汇编器、链接器以及针对目标平台的库文件等确保生成的代码能够在目标平台上正确执行。无法使用纯软件进行调试需要借助专用调试器总线CPU通过地址总线寻址数据总线与外部设备交换信息。总线速度决定CPU与外部设备交换信息的速度。数据总线数据总线位数决定CPU单词通信交换的信息数量32位一般指的就是数据总线位数实际运行中32位单片机8位16位32位数据效率相同当数据不满32位会进行填充但使用低字节会节省空间。地址总线地址总线位数决定CPU寻址范围如32位最多支持4G内存程序编译过程C语言通过编译器变为汇编语言汇编语言通过汇编器变为elf二进制可执行程序通过Objcopy工具转换为bin格式烧录文件CPU执行程序的过程程序计数器PC初始化当单片机上电或复位时程序计数器Program Counter会被初始化为某个特定的地址这个地址通常是单片机固件中的起始位置即程序存储区的首地址。指令读取CPU根据程序计数器PC中存放的地址从程序存储器通常是非易失性存储器如FLASH中读取一条指令。在大多数单片机中这是通过内部的地址总线和数据总线来实现的。指令解码读取的指令被送入指令寄存器CPU对这条指令进行解码以确定其操作码和操作数从而理解该指令要执行的操作。执行指令根据指令解码的结果CPU会执行相应的操作。这可能涉及到算术逻辑运算、数据传输、控制流改变如跳转、调用子程序等。在执行过程中CPU可能会访问内部或外部的数据存储器RAM来读取或写入数据。程序计数器更新执行完当前指令后程序计数器PC通常会自动递增指向下一个指令的地址准备读取并执行下一条指令。如果当前指令是跳转或分支指令则PC会被更新为跳转目标的地址。循环执行上述过程不断重复CPU依次读取、解码并执行程序中的每一条指令直到遇到停止指令如HALT或者受到外部中断影响而暂停当前任务去处理中断服务程序。指令集CISC指令集复杂指令集理念是用最少的指令完成任务。RISC指令集精简指令集通过简单的指令组合成复杂指令。IO与内存、外存IO是输入输出接口是CPU与其他外设通信的道路CPU访问外设类似于访问内存的方式将外设寄存器当作内存地址读写称为IO与内存统一编址方式使用专用CPU的指令访问某种特定外设称为IO与内存独立编址方式内存是程序运行的场所内存和CPU通过总线连接通过地址访问具体内存单元。一般是RAM(DRAM SRAM等)SRAM是静态内存单片机的RAM多为这种。容量小、价格高、但上电就能用DRAM是动态内存容量大、价格低、但需要软件初始化后才能使用外存是程序存储的场所一般是ROM。常用外存由norflash、Nandflash、SD卡、硬盘等。一般是通过芯片的外存接口连接不占用总线地址。但norflash例外。架构冯诺依曼结构程序和数据都放在内存里并不分离如Intel的CPU哈佛结构程序和数据分开独立放在不同块完全分离的结构如大部分的单片机结构分开程序是只读的避免程序错误导致程序损害裸机程序链接麻烦需要使用链接脚本告诉链接 器如何组织程序程序部分单片机存储在片内FLASH中通过程序计数器的地址CPU读取指令并由译码器解析数据部分存储在RAM中寄存器通用寄存器cpu组成部分很多活动需要通用寄存器支持特殊功能寄存器(SFR)不在CPU中存在外设中通过访问SFR控制外设寄存器属于CPU外设的硬件组成部分是硬件可以像访问内存一样访问寄存器由CPU硬件设计者制定(规定该寄存器是只读只写还是状态…)留作外设被编程控制的“活动开关”设计者事先预留的能通过编程控制硬件的后台开关寄存器是外设硬件的软件编程接口API用软件编程控制某个硬件其实就是读写该硬件的寄存器Nandflash和Norflash的特点Norflash不需初始化可以总线直接访问片内flash一般就是Norflash一般用于启动。容量小价格高Nandflash不能总线访问需要软件初始化后通过接口才能使用。容量大价格低ARM的7种工作模式工作模式普通模式用户模式User非特权模式应用程序通常在此模式下运行不能访问所有系统资源。特权模式快速中断模式FIQ用于需要快速响应的中断处理、高优先级中断产生进入拥有自己的寄存器组以加速处理过程。中断模式IRQ用于一般的中断处理低优先级中断产生进入。管理模式Supervisor又称SVC特权模式复位或软中断指令执行时进入模式。中止模式Abort当数据或指令预取发生错误如访问权限违规或未对齐的访问时进入此模式用于处理存储器访问异常。未定义指令模式Undefined尝试执行未定义指令时进入此模式可以用于软件仿真硬件协处理器的指令。系统模式System又称SYS特权模式与用户模式使用相同的寄存器集但具有所有特权访问权限通常用于运行具有特权级别的代码如操作系统的某些部分或信任的系统服务而不需要切换到SVC模式。CPU只能存在一种模式模式切换可以是代码主动切换(CPSR寄存器)也可以是CPU某些情况下自动切换操作系统有安全级别要求因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要异常异常会打断正在执行的工作处理完成异常会重新恢复执行中断是异常的一种指令和伪指令汇编指令机器指令的助记符编译后得到一串10组成的机器码由CPU读取执行汇编伪指令本质上不是指令但和指令一起写在代码中为编译器提供指导编译过程伪指令不生成机器码协处理器Soc内部另一处理核心协助主CPU实现某些功能被主CPU调用执行一定任务ARM设计上支持多达16个协处理器但一般SOC只实现CP15协处理器一般与MMU、Cache、TLB等处理有关STM32通常不包含但个别型号包含FPU栈空栈和满栈指的并不是空间存储的满不满而是根据SP指针指向的位置栈可以分为满栈和空栈空栈SP指针指向空的位置每次是先存后移动取出是先移动后取出。满栈SP指针指向最后一个数据的位置每次是先移动后存取出是可直接取出后再移动升栈随着数据的入栈SP指针从低地址向高地址移动称为升栈降栈随着数据的入栈SP指针从高地址向低地址移动称为降栈Makefile功能用于管理工程。例如项目中有多个c和h文件直接命令行编译每次输入是gcc a.c b.c d.c -o exe 很麻烦使用touch Makefile创建文件编写Makefile有三个部分目标Target想要生成的文件或执行的任务。顶格写后面是:依赖Dependencies生成目标所需要的文件或条件。命令Commands生成目标要做的动作。命令前面一定是Tab不能顶格也不能是空格使用直接在当前路径输入make 目标即可GPIO可以理解为就是芯片的引脚可以被编程控制工作模式和输入输出看门狗现实中因为一些外部因素电子设备经常会跑飞或者死机希望设备能够自动复位看门狗其实是SOC内部的一种 定时器定好时间后在时间到达之前需要重新置位否则系统会被复位C语言和栈C语言中的局部变量都是用栈实现启动文件中的汇编会设置好合理合法的栈地址没有合法的栈局部变量 就会落空程序死掉volatile让程序在编译时编译器不对程序进行优化 。如果一个变量易变不希望编译器优化在定义时加volatilecacheCache是一种高速缓存存储器位于CPU与RAM之间。目的是为了缓解CPU与RAM之间的速度不匹配问题。当CPU需要数据时它首先会检查Cache中是否有该数据的副本。如果存在这种情况被称为“命中”命中率是重要的指标通常使用静态随机存取存储器SRAM技术构建位置无关码和位置有关码位置无关编码(PIC)在编译或汇编时生成的代码它不依赖于特定的内存地址来执行。位置有关编码在编译或链接时被设定为预期在特定内存地址执行链接地址和运行地址链接地址链接地址是在编译和链接过程中为代码和数据分配的逻辑地址。它是程序链接时的位置参照点由程序员或链接脚本设定。对于位置无关的代码链接地址可以视为一个相对参考点因为实际执行时代码可以加载到内存的任意位置。对于位置相关的代码链接地址就是期望程序在最终执行时所在的物理地址或虚拟地址。运行地址运行地址指的是程序在内存中实际执行时的地址也就是程序加载到RAM后的起始地址。在嵌入式系统中如果程序直接在Flash如NOR Flash中执行则运行地址和加载地址可能相同。如果程序先加载到RAM中再执行那么加载地址将是Flash或其他非易失性存储器中的地址而运行地址则是RAM中的地址。通过重定位机制程序可以在加载时或启动时从链接地址调整到运行地址特别是对于位置有关的代码来说这是必要的步骤。程序段编译器内部定好代码段.text存放程序指令的部分code和RO变量数据段.data存放显式初始化非0的全局变量RW变量bss段.bss又叫ZI段零初始化段对应初始化为0的全局变量ZI变量程序员自己指定段名自己制定属性和特征也是自己定义在keil的map文件中RO size为codeRO DATARW size(RAM占用空间)为RW DATAZI DATAROM size(ROM占用空间)为codeRO DATARW DATA全局变量未显式初始化为0本质是放到bss段保证为0。局部变量是从栈中申请栈反复使用导致值不确定。全局变量显式初始化变量在.data段在执行main之前就被初始化SCT文件中的*(InRoot$$Sections)编译流程预处理、编译、汇编、链接动态链接库win下的.dllliunx下的.so静态链接库win下的.libliunx下的.a可执行win下的exeliunx下的elfextern “C”{}括号内部当作C代码处理弱符号attribute((weak)) 可以被用户定义的强符号覆盖主要用于扩展功能模块SOC时钟系统最常见的配置使用外部晶体振荡器如石英晶体或陶瓷谐振器产生的稳定频率作为参考再通过内部电路PLL倍频后再分频所需的时钟信号。为SoC内部的各种组件提供精确的时间基准确保所有模块能够同步工作。为了功耗时钟系统可以对不活动的模块暂时关闭其时钟信号供应直到需要时再恢复。关闭外设一般是关闭其时钟信号。通信最重要的是信息表达方式解析方法信息的传输方法。通信双方的表达和解析方法需要一致否则无法有效传递。信号的传输时指经过编码后的信息再传输介质上传输的过程同步和异步同步通信要求发送端和接收端的时钟频率保持一致以确保数据的正确接收。通信开始时通常会发送同步字符来建立双方的时钟同步。异步通信不需要发送端和接收端的时钟完全同步。数据包或字符间可以有不固定的延迟每个数据单元如字符传输前后有起始位和停止位来界定边界。串行和并行并行接口允许同时通过多条线路传输多个数据位串行接口则是逐位顺序传输数据。差分和电平电平信号也称单端信号是指信号的表示依赖于信号线与一个固定参考电平通常是地线GND之间的电压差。差分信号是一种相对信号传输方式它不依赖于固定的参考电位而是通过两根信号线称为差分对之间的电压差来表示数据。波特率是衡量单位时间内串行通信中信号状态变化次数的指标直接影响数据传输速度需通信双方匹配设置以确保数据正确传输。波特率9600指1s能传输9600个二进制位单、半全双工通信单工通信是指数据只能在一个方向上传输不能同时进行双向通信。半双工通信是一种允许数据在两个方向上传输的通信方式但与全双工通信不同的是它不能同时进行双向传输。半双工就像是一个狭窄的道路车辆可以双向行驶但任何时候都只允许一方前进另一方必须等待。全双工通信则允许数据同时在两个方向上传输即通信双方可以同时发送和接收信息互不影响就像两个人可以同时讲话和聆听对方没有等待的时间。DB9接口是一种常见的物理连接器广泛应用于串行通信领域UART定义(电平信号)公头是2-RX3-TX5-GND对应的母座就是2-TX3-RX5-GNDRS485(差分信号)接口定义为1-DATA-, 2-DATA, 5-GNDCAN接口(差分信号)的定义信号引脚在2与77脚为CAN_H2脚为CAN_LRS‑232全双工点对点RS‑485半双工一主多从CAN半双工多主总线FIFO先进先出fifo是一种数据结构。对于通信接受或者发送的fifo其实是一个大缓冲区这个缓冲区的工作方式类似于FIFO先进先出。数据管理FIFO作为一种队列结构保证了报文的接收顺序即最先到达的报文会排在队列前面等待处理器最先处理随后到达的报文依序排队。流量控制由于CAN总线上的数据传输速率可能与微控制器MCU处理这些数据的速度不匹配FIFO可以作为一个缓冲区帮助平衡这种速率差异避免数据丢失。减少CPU负载通过使用FIFO微控制器不需要不断轮询总线状态而是可以在FIFO中有数据可读时通过中断方式通知CPU这样可以更加高效地利用CPU资源。多报文处理一些CAN控制器具备双FIFO如FIFO0和FIFO1可以配置为接收不同优先级或类型的报文这样处理器可以根据报文的重要程度或处理逻辑分别处理增强了系统的灵活性和响应速度。简化软件设计FIFO机制简化了软件层面的报文管理开发者无需直接管理复杂的硬件读写时序而只需关注FIFO的状态和报文处理逻辑。例如stm32的CAN接收就有两个FIFO每FIFO中有3个邮箱一个邮箱可以缓存一帧报文。DMA使用DMA技术外设可以直接与系统内存进行数据交换而不需要CPU的干预。CPU只需初始化DMA传输过程设定源地址、目标地址及传输量后就可以去执行其他任务。DMA控制器负责数据的实际传输并在传输完成后通过中断通知CPU。DMA的优势在于提高数据传输速度因为CPU不必参与每次数据传输的读写操作。减轻CPU负担CPU可以同时处理其他计算任务提高了系统整体效率。适用于大批量数据传输特别是对于高速I/O设备DMA能显著提升系统性能。定时器原理定时器计时其实是通过计数来实现的。定时器内部有一个计数器这个计数器根据一个时钟(这个时钟源来自于ARM的APB总线然后经过时钟模块内部的分频器来分频得到)来工作。每隔一个时钟周期计数器就计数一次定时器的时间就是计数器计数值x时钟周期。定时器内部有1个寄存器TCNT计时开始时我们会把一个总的计数值(譬如说300)放入TCNT寄存器中然后每隔一个时钟周期(假设为1ms)ICNT中的值会自动减1(硬件自动完成不需要CPU软件去干预)直到TCNT中减为0的时候ICNT就会触发定时器中断。定时时间是由2个东西共同决定的:一个是TCNT中的计数值一个是时钟周期。譬如上例中,定时周期就为300x1ms300ms。PWM定时器是实现PWM输出的基础硬件资源之一。定时基础PWM信号的核心是脉冲的占空比即高电平时间与整个周期时间的比例。要生成这样的脉冲序列就需要一个精确的时基这正是定时器所提供的。定时器通过一个时钟源进行计数可以设定计数周期即PWM的周期和比较值决定PWM的高电平时间从而控制输出脉冲的宽度。占空比控制通过比较模块定时器可以监控计数器的当前值与预设的比较值通常称为比较寄存器的值如TCMPn。当计数器的值等于比较值时PWM输出会翻转其逻辑电平从高变低或从低变高这样就实现了对脉冲宽度的控制进而调节了占空比。频率与周期设定定时器的时钟频率和重装载值决定了PWM信号的频率即单位时间内脉冲重复的次数。而比较值TCMPn则决定了每个脉冲的高电平时间从而间接设定了占空比。硬件支持许多微控制器如STM32系列其内部集成的定时器通常都具有专门的PWM模式可以直接配置为输出PWM信号。在这些模式下定时器可以自动管理PWM信号的生成包括更新输出状态、调整占空比等无需过多的软件干预。
返回列表