精华内容
下载资源
问答
  • 从事嵌入式开发的伙伴可能会思考过一个问题,我们一般都是使用芯片厂商提供的驱动库和初始化文件,直接从main函数开始写程序,那么系统上电之后,程序怎么引导进main函数执行的呢?还有,系统上电之后RAM的数据是...

    目录

    1、启动文件

    2、系统初始化过程

    3、全局变量的初始化


    从事嵌入式开发的伙伴可能会思考过一个问题,我们一般都是使用芯片厂商提供的驱动库和初始化文件,直接从main函数开始写程序,那么系统上电之后,程序怎么引导进main函数执行的呢?还有,系统上电之后RAM的数据是随机的,那么定义的全局变量的初始值又是怎么实现的呢?

    下面我将带着这两个问题,以Cortex-M架构为例,采用IAR EWARM作为编译工具链,从系统上电之后执行的第一条代码开始,梳理系统的启动过程,了解编译器在此期间所做的工作。其他的工具链,如Keil和GCC在系统初始化过程所做的工作也是相似的,但具体的实现有所差异。

    1、启动文件

    芯片厂商提供的启动文件,一般是采用汇编语言编写,少数用C语言。在启动文件中一般至少存在下面两个部分内容:

    1、向量表

    2、默认的中断和异常处理程序

    向量表实际上是一个数组,放置在存储器的零地址,每个元素存储的是各个中断或异常处理程序的入口地址。以STM32F107芯片基于IAR工具的启动文件为例:

    文件的开头定义了一个名为__vector_table的全局符号,“DATA”的作用是在代码段中定义一个数据区,用作向量表。数据区的内容是使用DCD指令定义的32位宽度常量,除了第一个sfe(CSTACK)比较特殊以为,其他的常量都是异常和中断服务程序的地址(在编译时函数名会被替换成函数的入口地址)。sfe(CSTACK)是IAR汇编器段操作,用于获取段(section)的结束地址,在这里意欲何为呢?

    实际上这是获取堆栈基地址的操作。IAR在链接器脚本(*.icf)文件中定义堆栈,实际是定义了一个名为“CSTACK”的空闲块(block),如下图的脚本命令所示。所谓的块就是保留一段连续的地址空间,用来作为堆栈或者堆。当然,块也可以是用内容的,例如可以用来管理段,但不在今天的讨论范围。

    我们知道Cortex-M架构的堆栈模型是满减栈,堆栈从高地址向低地址增长,因此堆栈的基地址是CSTACK的结束地址。

    向量表的第一个元素是栈基址这是由Cortex-M架构定义的。系统上电后硬件自动从向量表中获取,并设置主堆栈指针MSP,而不是像其他ARM架构,堆栈指针需要通过软件来设置。

    向量表中第二个元素是复位异常(Reset_Handler)的入口地址。系统上电后,硬件自动从__vector_table + 4的位置读取,并从读取到的地址开始执行。系统上电后CPU执行的第一条是Reset_Handler函数的第一条语句。

    上面的THUMB命令表示接下来的代码采用THUMB模式(Cortex-M只支持Thumb-2指令集);SECTION用于定义一个段,段名为“.ResetHandler”,段的类型是代码(CODE);REODER指示用给定的名称开启一个新的段;ROOT指示链接器,当段内的符号没有被引用,链接器也不可以丢弃这个段。

    PUBWEAK是弱定义,如果用户在其他位置编写了中断处理函数,在连接时实际链接用户所编写的,启动文件中用汇编写的服务函数会忽略。之所以要在启动文件中以弱定义的方式编写全部的异常和中断服务函数,是为了防止用户在没有编写服务函数的情况下开启并触发了中断,导致系统的不确定。

    2、系统初始化过程

    在EWARM的工程Options > Debugger > Setup中将“Run to”勾选取消,这样在进入调试之后就会停第一条要执行的代码的位置:

    进入调试之后会停在启动文件Reset_Handler函数第一条汇编指令位置:

    此时,通过寄存器观察窗口查看SP的值为0x20009820。通过链接时生成的map文件,查看CSTACK的地址范围,0x20009820正好是CSTACK的结束地址。有了MSP,C代码就能运行了。

    ystemInit函数是芯片厂商根据ARM的CMSIS标准提供的一个系统基础配置函数,配置基础的时钟系统和向量表重定位等。这里的LDR是伪指令,它将SystemInit函数的地址加载到寄存器R0,实际上是通过PC偏移寻址来获取SystemInit的地址。

    从上面的图可以发现一个问题,在反汇编窗口可以观察到SystemInit的地址是0x20000150,但加载到R0寄存器后却是0x20000151。这是因为在使用跳转指令更新PC时,需要置PC的LSB为1,以表示THUMB模式,由于Cortex-M不支持ARM模式,因此LSB总是1。

    执行完芯片厂商提供的SystemInit函数之后,跳转到__iar_program_start,这是IAR编译器提供的初始化代码的入口。

    __iar_program_start首先会执行两个函数:__iar_init_core和__iar_init_vfp,可以完成一些CPU和FPU相关的初始化操作,在某些ARM架构打包好的运行时库会有这两个函数,用户也可以重写这两个函数来自己实现一些相关的操作。

    之后,跳转到__cmain函数执行。在__cmain中调用了一个__low_level_init函数,该函数专门用于提供给用户编写一个初阶的初始化操作,它在全局变量初始化之前执行,例如可用在__low_level_init中初始化SDRAM,这样就可以将全局变量定义到SDRAM中使用。

    __low_level_init可以在任意的C文件中编写,注意它的返回值,如果返回0,后续就会跳过变量初始化操作,正常一般都是返回1。

    3、全局变量的初始化

    此后进入到__iar_data_init3函数,在这里会完成所有具有初始值的全局/静态变量的赋值,以及零初始化全局/静态变量的清零操作,分别调用__iar_copy_init3和__iar_zero_init3,将保存在ROM区由链接器生成的变量初始值复制到变量的地址。注意,新的EWARM版本默认变量初始化操作可能会采用压缩算法,实际变量初始化调用的函数可能有区别。

    在全局变量未初始化之前,通过watch窗口可以看到,变量的值都是随机数。

    在__iar_data_init3执行完成后,全部变量的初值赋值已经完成。

    在__cmain函数的最后,跳转到用户的main函数,最终开始用户的代码执行。

    了解了编译器所提供的初始化过程和处理器架构,我们可以根据自己的需求定制系统的初始化。

    例如,在进入__iar_program_start之前,就可以执行必要的硬件初始化操作,可以用汇编写,也可以用C写。还可以手动控制变量的初始化操作,自己实现变量的初始化。甚至,完全不采用IAR编译器提供的初始化操作,自己从复位序列引导至main函数那也是可以的。

    展开全文
  • eMMC上电时序

    千次阅读 2020-04-11 20:23:56
    eMMC上电时序 emmc最新标准发布于2015年,所以我们就开始讲最新的标准。 eMMC电源 请注意: VCCQ指的是接口电源及核电压; 3.3V 1.8V 1.2V VCC指的是存储器部分电压; 3.3V 1.8V 请注意VCC需要大于或者等于VCCQ...

    eMMC上电时序

    emmc最新标准发布于2015年,所以我们就开始讲最新的标准。

    eMMC电源

    在这里插入图片描述
    请注意:
    VCCQ指的是接口电源及核电压;

    • 3.3V
    • 1.8V
    • 1.2V

    VCC指的是存储器部分电压;

    • 3.3V
    • 1.8V

    请注意VCC需要大于或者等于VCCQ;

    eMMC接口

    在这里插入图片描述
    请注意:
    CMD引脚在初始化未完成状态是OD门,也就是漏极开路的状态,所以需要一颗上拉电阻在这个网络上;
    在这里插入图片描述

    还有个引脚是VDDi引脚,这个引脚在设计时仅仅需要一颗电容就可以;

    就是内部需要电容来稳定电压,在eMMC器件上,都是需要这个电容的。
    在这里插入图片描述

    上电时序

    以下是VCC的上电,请注意上电时间是从0.5V到VCCmin,初始化程序是从VCCmin到总线供电电压(一般是3.3V.),上电完成就开始初始化过程。
    在这里插入图片描述

    以下是VCC和CVVQ的上电时序,请注意VCCQ先于和慢于VCC都可以。

    When power-up is initiated, either VCC or VCCQ can be ramped up first, or both can be ramped up
    simultaneously.
    在这里插入图片描述

    2020-4-11

    展开全文
  • 上电复位

    千次阅读 2019-01-05 08:47:22
    上电复位 编辑 锁定 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 上电复位是指上电压从无到有在RESET处会先处于高电平一段时间,然后由于该点通过电阻接地,则RESET该点的电平会...

    上电复位

    编辑 锁定

    本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!

    上电复位是指上电压从无到有在RESET处会先处于高电平一段时间,然后由于该点通过电阻接地,则RESET该点的电平会逐渐的改变为低电平,从而使得单片机复位口电平从1转到0,达到给单片机复位功能的一种复位方式。

    复位方式除了上电复位外,还有手动复位。

    单片机复位电路单片机复位电路

    电容在上接高电平,电阻在下接地,中间为RST。这种复位电路为高电平复位。

    其工作原理是:通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程度,即为低电平,单片机开始正常工作。

    首先RST保持两个机器周期以上的高电平时自动复位

    1、上电复位:上电瞬间,电容充电电流最大,电容相当于短路,RST端为高电平,自动复位;电容两端的电压达到电源电压时,电容充电电流为零,电容相当于开路,RST端为低电平,程序正常运行。

    2、手动复位:首先经过上电复位,当按下按键时,RST直接与VCC相连,为高电平形成复位,同时电解电容被短路放电;按键松开时,VCC对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST为低电平,正常工作。 [1] 

    展开全文
  • 延迟上电的方法

    千次阅读 2020-02-24 17:46:07
    电路设计中常常需要延迟上电的方法,本文和大家一起简单的探讨下这个问题。

    电路设计中常常需要延迟上电的方法,本文和大家一起简单的探讨下这个问题。

    电源监控

    在很多电路中需要对供电电源监控,当电源的电压低于某个数值时,系统很有可能就不能正常工作了,现在很多电源管理模块都提供这样的引脚,通常名为Power Good,简称PG,如图1所示:
    在这里插入图片描述
    图1:电源模块样板[1]

    有电源供电电压监测功能,当输出电压低于预计数值的90% 时(根据厂家不同,数值略有不同),power good引脚输出低电平(或者高电平,看器件)防止系统供电出错。

    有些器件的PG引脚是漏极开漏电路,则需要在片外加上拉电阻,如图2所示:
    在这里插入图片描述
    图2: Power Good 引脚加上拉电阻[1]

    上电顺序

    在负责的电路中,不同的器件常常需要有不同的上电顺序,比如有些FPGA需要先给3.3V的内核供电,至少20ms后才给5V的IO口供电,以避免器件的损毁。在射频电路和模拟电路中也有些这样的需求,例如需要Vout1先上电,Vout2后上电,最简单也是最容易想到的是使用RC延时电路,方案1:

    在这里插入图片描述
    图3:在电压输入端使用RC电路

    方案1可以设置R1,C1,R2,C2的数值以完成不同的延时,从而可以改变上电上电顺序,但是有缺点,因为在供电回路中串联了电阻,如果是给功放等大功率的器件供电,会产生很大的损耗。

    方案2,利用电源模块的使能引脚,现在的电源管理芯片都有使能引脚,在是能引脚处加RC电路可以完成延时:
    在这里插入图片描述
    图4:在使能输入端使用RC电路

    在使能端使用RC电路可以满足一些不精确控制延时的场合。在精确控制上电顺序的场合,可以使用专用的集成电路芯片,欢迎大家咨询电源管理方案。

    方案3:利用电源监测引脚PG和使能引脚,完成上电顺序的控制,如图5所示,先上电的Vout1在完成上电后,PG引脚会产生一个高电平,该高电平使能下一个要上电的模块输出Vout2。
    在这里插入图片描述
    作者:伏熊(专业:射频芯片设计、雷达系统、嵌入式。欢迎大家项目合作交流。)
    微信:GuoFengDianZi

    [1] https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.25911debZibwwe&ft=t&id=612838123547

    展开全文
  • KUKA机器人首次上电

    万次阅读 2020-07-28 14:18:33
    关于kuka机器人的首次上电还是有些讲究的,如果操作不当甚至会导致严重损失。 这里就来说说kuka机器人首次上电的技巧以及注意事项。 首先,当我们拿到一台机器人需要做的第一件事就是,'检查'。 检查包装及...
  • FPGA上电加载时序介绍

    千次阅读 2019-11-10 14:37:46
    FPGA上电加载时序介绍 注:本文章摘自:www.sohu.com/a/337269259_100281310,仅供记录笔记参考。 目前,大多数FPGA芯片是基于SRAM 的结构的, 而 SRAM 单元中的数据掉电就会丢失,因此系统上电后,必须要由配置电路...
  • UFS之上电和下电

    千次阅读 2018-10-29 17:06:26
    UFS有三组供电电压VCC、VCCQ和VCCQ2,VCC负责闪存颗粒的供电,VCCQ负责闪存输入输出和UFS控制器的供电,...1、上电要求 定义:  Ta:VCCQ或VCCQ2最先到达300mV的点。 要求:在到达Ta以后,VCCQ2应该大于VCCQ-200...
  • emmc的上电流程、上电稳定性

    千次阅读 2013-12-09 15:27:36
    emmc的上电流程、睡眠省电及上电稳定性
  • 上电复位POR与上电清除PUC的区别

    千次阅读 2016-11-25 09:49:20
    一:POR是上电复位信号,它只在以下两个事件发生时产生: 1、芯片上电。 2、RST/NMI设置成复位模式,在RST/NMI引脚上出现低电平信号。 看来这都是外部产生的。   二:PUC信号是上电清除信号,POR信号的产生总会...
  • 上电回沟

    千次阅读 2014-10-13 09:30:37
    上电过程 上电过程电源不是线性增长
  • AutoSAR系列讲解(实践篇)10.2-EcuM的上下流程

    万次阅读 多人点赞 2019-12-13 10:04:01
    讲解了Ecu的上下流程和Sleep的流程
  • 硬件上电时序

    千次阅读 2019-04-13 20:28:37
    上电时序关注点 是 毫米级还是微秒级 5M hz 是 0.2 * 10^-6 s, 0.2 微秒, 200 纳秒 50M hz 是 0.02 * 10^-6 s, 0.02 微秒, 20 纳秒 500M hz 是 0.002 * 10^-6 s, 0.002 微秒, 2 纳秒 如果你的...
  • STM32上电不复位 问题

    千次阅读 2018-08-21 18:04:17
    我做了一个stm32 的板子,上电显示不正常,手动复位后正常显示,   最后找到的原因是 是片外设备的上电速度比MCU慢,MCU在片外设备还没有就绪时就操作它,导致系统不能正常工作。 外设为 EEPROM EEPROM上电较...
  • camera上电时序

    千次阅读 2017-03-22 16:15:23
    今天有空去研究camera的上电时序1.高通平台对于camera的代码组织,大体上还是遵循Android的框架: 即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略; 在kernel中实现sensor的底层驱动; ...
  • FPGA上电状态

    千次阅读 2014-10-19 20:11:22
    FPGA 上电毛刺
  • Android系统板子上电启动流程

    千次阅读 2018-10-08 22:04:34
    文章目录Android整体上电启动流程DRAM在哪得到初始化的?Init进程的功能LK的功能 Android整体上电启动流程 具体流程图如下: 流程分析: 1-3: 板子上电时,就跳转到boot Rom中去执行boot code,之后boot code...
  • 我是菜鸟一个,想求教DSP的开发板是先连接仿真器呢还是先给开发板上电呢?还有Jtag的电源和板的电源就隔着电容,如果先连接上仿真器,那么是不是就等于是用U口给板子供电了呢?非常感谢!
  • 单片机上电自锁电路

    千次阅读 2019-04-24 22:21:48
    在单片机项目里面经常要涉及到整机电路的开关机,这里我介绍一种常用的上电自锁电路,希望大家喜欢!话不多说,直接上图!!! 开机时: 当S5闭合时,Q1导通,单片机得电; 当S5断开时,Q1截止,单片机掉电; 所以...
  • DSP上下顺序

    千次阅读 2017-08-15 15:05:08
    一般操作上电顺序: 1:仿真器与板子连接; 2:仿真器与电脑连接; 3:板子通电;最后上电 4:CCS链接。 断电顺序: 1:CCS断开; 2:板子断电;最先断电 3:仿真器与电脑断开; 4:仿真器与板子断开。 ...
  • Linux中PCIe设备上下

    千次阅读 2017-08-27 11:27:45
    PCIE设备上下电 单独对PCIE设备进行上下点, cd/sys/bus/pci/slots/...运行echo 1 > power上电 该命令可以单独对PCIE设备进行电源控制非常方便,配置当前PCIE设备热插拔功能,可以实现业务不中断的情况下进行设备更换。
  • STM32上电复位电路参数选择

    千次阅读 2020-03-15 19:21:59
    1.上电复位电路的作用 2.上电复位电路工作原理
  • ESP8266 上电 boot 模式

    千次阅读 2018-11-19 19:15:54
    ESP8266 上电 boot 模式 ESP8266 上电时打印的 boot 模式信息代表什么?如何改变 boot 模式? ESP8266 上电时会判断 boot strapping 管脚的状态,并决定 boot 模式。例如,ESP8266 上电时打印的 boot 模式信息如下...
  • stm32 一上电串口发送0x00

    千次阅读 2018-10-25 15:34:08
    现象:stm32 一上电串口发送0x00。 原因:参考https://blog.csdn.net/unsv29/article/details/40855397 (1)STATUS寄存器的上电初始值有问题造成的,Usart的发送数据寄存器有一个缓冲移位寄存器。并且发送有两个...
  • 缓冲电路/延时上电电路

    千次阅读 2019-07-10 22:18:48
    延时电路一般用在对于上电时序有要求的电路以及负载开始(上电时)较大的电路而言。
  • 单片机中的上电复位 和手动复位

    千次阅读 2021-03-20 09:09:44
    上电复位是通过外部复位电路中的电容充放电来实现的,也就是通过电容给RST端输入一个短暂的高电平,此高电平随着Vcc对电容充电时间的增加而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为保证单片机能...
  • 刚开始做嵌入式开发的时候本人也是如此,不过通过参与项目开发,对于追求性能或者特定功能的实现,需要对启动代码做一定的了解,才能进行优化,就像我上一篇文章中遇到的智能IC卡上电后读卡器读不到ATR的问题。...
  • 详解 STM32的上电启动过程

    千次阅读 多人点赞 2019-12-30 23:07:29
    我们正常在操作一款单片机的时候,都是从main函数开始进行编程的,但是单片机上电是从main函数开始执行的吗?答案当然是否定的,在main函数之前单片机最先执行的是硬件设置SP、PC然后是“启动文件”,一般主要是项目...
  • BMS状态转换及上电策略

    万次阅读 多人点赞 2017-10-11 13:36:18
    电池管理系统的功能主要可以分为检测(电压、电流、温度、绝缘、HVIL等物理状态)、评估(SOC、SOH、...之前讨论了关于BSE相关的内容,本篇从上电控制逻辑展开讨论。 画了一组有较好通用性的BMS运行状态转化图
  • 板子回来后,外接5V电源上电测试,调试程序没有问题,没有问题,打包发货。两天之后,打电话打过来问题出来了,系统上电10次能有5-6次,指示灯不亮,按键不好使,板子功能失效。经过半天的分析发现是程序不运行。...
  • STM32上电复位与手动复位介绍

    千次阅读 2020-03-22 16:10:25
    上电复位:STM32的复位引脚低电平有效,但是低电平、高电平在电气特性中有一定的范围,刚上电瞬间,复位电路电容两端没电为0V,此时复位引脚处于低电平状态,同时电容一直在充电, 当电容电压上升到一定值时,复位...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,168,585
精华内容 467,434
关键字:

上电