代码重定位,理解单片机的启动过程
目录一.段的概念二.重定位1.是什么2.为什么3.谁完成?三.清除.BSS段(ZI段)1.是什么2.清除四.代码段重定位一.段的概念看以下现象查看两者的地址程序虽然烧录进了 Flash起始地址 0x08000000ROM 里也确实记录了 A 和 B但程序执行到读取 RAM 中的 g_a 时打印出来的却是乱码。虽然 g_a A 这个初始值被烧录进了 ROMFlash但它只是“备份”在那里。芯片上电后必须由启动代码主动将这个“备份值”从 ROM 搬运到 RAM 中 g_a 的真正归属地程序才能正确读取。如果搬运失败或缺失RAM 中的 g_a 里残留的就是随机垃圾值打印出来自然就是乱码。char g_Char A; // 可读可写不能放在ROM上应该放在RAM里 const char g_Char2 B; // 只读变量可以放在ROM上 int g_A 0; // 初始值为0干嘛浪费空间保存在ROM上没必要 int g_B; // 没有初始化干嘛浪费空间保存在ROM上没必要所以程序分为这几个段代码段(RO-CODE)就是程序本身不会被修改可读可写的数据段(RW-DATA)有初始值的全局变量、静态变量需要从ROM上复制到内存只读的数据段(RO-DATA)可以放在ROM上不需要复制到内存BSS段或ZI段初始值为0的全局变量或静态变量没必要放在ROM上使用之前清零就可以未初始化的全局变量或静态变量没必要放在ROM上使用之前清零就可以局部变量保存在栈中运行时生成堆一块空闲空间使用malloc函数来管理它malloc函数可以自己写二.重定位1.是什么重定位 就是 把存储在 Flash只读存储器中的初始值在芯片上电后搬运到 RAM随机存取存储器中对应的变量地址上 的过程。2.为什么RAM 是易失性存储器芯片掉电后RAM 里的数据会全部丢失。因此初始值必须在掉电也不丢失的 Flash 里保存一份“备份”。变量的值需要被修改全局变量在程序运行中是可以被修改的例如 g_a C。这个修改发生的地点必须是 RAM因为 Flash 的写入速度慢且有寿命限制不适合频繁修改。3.谁完成?这个“搬运”任务是由 启动文件startup 文件如 startup_stm32f407xx.s 中的 Reset_Handler 函数来完成的。重定位就是把代码段、只读数据段、数据段复制到它的链接地址处。在keil中使用散列文件来描述。 散列分散排列 是的在STM32F103这类资源紧缺的单片机芯片中代码段保存在Flash上直接在Flash上运行数据段保存在Flash上使用前被复制到内存里下面这个就是散列文件; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; load address execution address *.o (RESET, First) .ANY (RO) .ANY (XO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (RW ZI) } }目的就是把0x08000000的ROM拷贝到0x20000000的RAM这样‘A’就被赋值可以打印出来了三.清除.BSS段(ZI段)现象发现打印出来并不是01.是什么程序里的全局变量如果它的初始值为0或者没有设置初始值这些变量被放在BSS段里也叫ZI段。char g_Char A; const char g_Char2 B; int g_A 0; // 放在BSS段 int g_B; // 放在BSS段BSS段并不会放入bin文件中否则也太浪费空间了。 在使用BSS段里的变量之前把BSS段所占据的内存清零就可以了。注意对于keil来说一个本该放到BSS段的变量如果它所占据的空间小于等于8字节自己keil仍然会把它放在data段里。只有当它所占据的空间大于8字节时才会放到BSS段。int g_A[3] {0, 0}; // 放在BSS段 char g_B[9]; // 放在BSS段 int g_A[2] {0, 0}; // 放在data段 char g_B[8]; // 放在data段2.清除四.代码段重定位如果我将代码段的执行地址的地址修改一下那复位后程序会跳转到0x20000000地址处执行但是此时地址为空程序就就会出错。当然你也可以直接改变向量表的地址直接跳转到ROM继续运行也是可以。正常的执行流程应该是这样的上电复位↓CPU从0x08000000读取中断向量表↓从向量表获取复位向量Reset_Handler地址↓执行复位处理程序在Flash中↓启动代码startup.s执行1. 将代码段从Flash拷贝到SRAM (0x20000000)2. 重定位.data段3. 清零.bss段4. 跳转到SRAM中的main函数 (0x20000000 offset)↓程序在SRAM中高速运行来看下正确的重定位代码PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD 0 DCD Reset_Handler ; Reset Handler AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT main IMPORT SystemInit LDR SP, 0x20000000 0x20000 BL SystemInit ;BL main LDR R0, main BLX R0 ENDP ENDvoid SystemInit(void) { extern int Image$$ER_IROM1$$Base; extern int Image$$ER_IROM1$$Length; extern int Load$$ER_IROM1$$Base; extern int Image$$RW_IRAM1$$Base; extern int Image$$RW_IRAM1$$Length; extern int Load$$RW_IRAM1$$Base; extern int Image$$RW_IRAM1$$ZI$$Base; extern int Image$$RW_IRAM1$$ZI$$Length; /* text relocate */ memcpy(Image$$ER_IROM1$$Base, Load$$ER_IROM1$$Base, Image$$ER_IROM1$$Length); /* data relocate */ memcpy(Image$$RW_IRAM1$$Base, Load$$RW_IRAM1$$Base, Image$$RW_IRAM1$$Length); /* bss clear */ memset(Image$$RW_IRAM1$$ZI$$Base, 0, Image$$RW_IRAM1$$ZI$$Length); }

相关新闻

Cisco Packet Tracer 8.2.2 可控安装指南:环境适配与启动排错

Cisco Packet Tracer 8.2.2 可控安装指南:环境适配与启动排错

1. 为什么Packet Tracer 8.2.2的安装不是“点下一步”那么简单 Cisco Packet Tracer 8.2.2不是普通软件,它是网络工程教学与实验验证的“数字沙盒”。我带过三届CCNA实训班,每届都有至少15%的学生卡在安装环节——不是因为不会点鼠标,而是因…

2026/7/15 3:41:48阅读更多 →
LH20-10B12 和钡特电源 AH20-20S12 参数规格解析|20W AC-DC 电源模块硬件选型技术性能拆解

LH20-10B12 和钡特电源 AH20-20S12 参数规格解析|20W AC-DC 电源模块硬件选型技术性能拆解

在工控硬件研发流程中,板载 AC-DC 模块电源是整机供电链路的核心前置单元,后端常搭配 DC-DC 直流电源模块完成二次稳压,主控芯片、信号采集电路、通讯单元的供电稳定性,完全依托隔离电源的电气性能与环境耐受能力。硬件工程师在方…

2026/7/15 3:41:48阅读更多 →
ai写小说到底行不行?2026全网10款写小说软件深度测评+保姆级选型指南(含避坑指南)

ai写小说到底行不行?2026全网10款写小说软件深度测评+保姆级选型指南(含避坑指南)

作为一个卡文到掉头发的兼职网文作者,我曾对ai写小说嗤之以鼻。 但面对日更4000字的压迫感,写小说软件成了我的救命稻草。市面上的小说软件生成器鱼龙混杂,我花了半年踩坑,总结出一条铁律:懂网文套路>功能…

2026/7/15 3:41:48阅读更多 →
零基础Python学习路径:从爬虫到数据分析的完整实战指南

零基础Python学习路径:从爬虫到数据分析的完整实战指南

你是不是也遇到过这样的情况:想学Python,但面对网上铺天盖地的教程却不知道从何入手?有的教程太简单,学完只会print("Hello World");有的又太专业,上来就是算法和框架,让零基础的小白…

2026/7/15 4:36:54阅读更多 →
向量点乘与叉乘:从几何直观到物理与图形学的核心应用剖析

向量点乘与叉乘:从几何直观到物理与图形学的核心应用剖析

1. 向量基础:从箭头到数学语言想象你正在玩一款飞行模拟游戏,屏幕上那个表示飞机朝向的小箭头就是最直观的向量。在数学世界里,向量是既有大小又有方向的量,就像游戏里飞机的速度和航向。二维向量可以用(x,y)表示,三维…

2026/7/15 4:36:54阅读更多 →
从零构建P2P高仿微信:剖析JavaFX+Netty桌面IM核心架构

从零构建P2P高仿微信:剖析JavaFX+Netty桌面IM核心架构

1. 为什么选择JavaFXNetty构建P2P桌面IM如果你正在寻找一个完全去中心化的即时通讯解决方案,JavaFXNetty的组合堪称黄金搭档。我去年为企业内部部署这套架构时,实测单机可承载2000并发连接,消息延迟控制在50ms以内,完全摆脱了对中…

2026/7/15 4:36:54阅读更多 →
Cookie免密登录实战:从原理到三天自动登录实现

Cookie免密登录实战:从原理到三天自动登录实现

1. 理解Cookie免密登录的本质 想象一下你第一次走进一家常去的咖啡店,店员热情地招呼你:"老规矩,美式加双份浓缩?"这种默契的背后,其实是对方记住了你的消费习惯。而在互联网世界,Cookie就是扮演…

2026/7/15 4:36:54阅读更多 →
程序目录路径 和 当前工作目录路径

程序目录路径 和 当前工作目录路径

程序目录路径 和 当前工作目录路径 “程序所在目录”程序执行文件所在的目录。 “当前工作目录”操作系统启动程序的目录。 操作系统如何决定当前目录 Windows 通过资源管理器进入到程序所在目录,通过双击可执行文件打开程序时,当前工作目录 既为当…

2026/7/15 4:36:54阅读更多 →
Spring Boot项目简易上线:JDK8与Maven环境下的可靠发布实践

Spring Boot项目简易上线:JDK8与Maven环境下的可靠发布实践

1. 为什么“简易上线”不是一句空话,而是压在每个Java后端开发者肩上的真实重量“项目简易上线的流程”——这七个字看起来平平无奇,甚至有点像新手教程的标题。但如果你真在凌晨两点盯着CI流水线卡在mvn clean package那一步,或者刚把jar包扔…

2026/7/15 4:31:54阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/14 15:07:30阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →