分散加载(三)简单介绍
什么是分散加载? 简单来说就是让编译器告诉MCU内核哪里存的是代码、哪里存的是数据,去哪个特定的地址找到下一步需要运行的函数的东东,就是告诉编译器把每一个编译好的函数、数据放到具体的哪一个物理地址的东东。当然你可以对链接器的工作漠不关心,但经常你的工程比较复杂时,你就需要指导你下属的具体工作了。
分散加载能做什么? 还记得我们之前的文章中讲过的,一般来说在Keil MDK工程中的默认程序各个部分的摆放如下图所示(示例,其他Cortex-M系列MCU的程序摆放与之类似):
大家有没有想过为什么是这样的摆放?或者说是谁决定了程序是这样的摆放?或者我们能否定义自己的摆放?
举几个常用的必须通过修改分散加载脚本的常见用法,如下:
1.Bootloader & 程序升级 Bootloader的原理就简单来说在MCU的Flash里面同时摆放2个不同工程的程序,一个Bootloader程序和一个用户程序,那么这就需要调整分散加载文件,以达成在一个Flash里面同时摆放两个不同程序的目的。
程序升级的原理类似,需要特别说明的一点是,现在IOT大行其道的背景下,程序的远 ...
Keil报错处理(Image does not have an entry point)
今天在做一个测试的时候Keil报这个错误:
1Warning: L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices.)
我的代码文件只有一个启动文件,如下:
12345678910111213141516171819202122232425262728293031323334353637383940 PRESERVE8 THUMB; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY__Vectors DCD 0 ;__initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler ...
分散加载(一)理清存储器和程序的关系
理清存储器和程序的关系 先抛出两个问题:对于嵌入式设备,没有RAM能运行吗?没有ROM能运行吗?
首先看一下什么是ROM。ROM全称Read Only Memory,即只读存储器,其中内容在生产阶段一经烧录就无法更改。显然,现代语境下的ROM已经不是字面意思了,更准确的解读是:用来存放程序的非易失性存储器。即它最重要的特性是非易失性,当年因成本而导致的显著特性“只读”已经随着技术发展而不存在了,但是“只读”这个名字却沿用下来了。所以,下次再看到ROM的时候,脑海中要自动把它翻译成:存放程序、非易失。
接着再来看一下什么是RAM。RAM全称Random Access Memory,即随机访问存储器。所谓“随机访问”,指的是读取或写入数据时,所需要的时间与数据所在的位置无关。当然RAM诞生以来一直也都有其他特点:与CPU直接交互、存取速度快、掉电不保存。但为什么偏偏把“随机访问”这个特性作为它的名字呢?难道当时除了RAM其他存储器都不支持随机访问?事实也正是如此,早期的存储设备,如纸带、磁鼓、磁盘都是顺序存储器,因此把这个与众不同的特性直接作为名字了。同样的,随着技术的发 ...
ARM Cortex-M之编译原理机器简单应用
本节中使用的IDE为Kei MDK
1. 汇编、编译和链接先上一张老图,然后我们仔细看下这个器、那个器的都是干啥的:你可能会问,这东西了解了又能怎样?有什么用吗?那么好,我们就来看一下了解编译原理是不是真的就那么没用?对于Keil来说,这几个东西在“keil根目录\ARM\ARMCC\bin”里面,如下图所示: 这几个东东就是keil编译器的内核,他们可以完成从C代码到可以烧写进MCU的二进制件的转换过程。其中
armar.exe 预处理器
armcc.exe 编译器
armasm.exe 汇编器
armlink.exe 链接器
fromelf.exe 是elf文件的实用工具集
有了这几个东东,你甚至不用打开keil就能干活,直接在windows的shell里面通过命令行就可以完成编译链接。当然了你也可以在集成开发环境中见到这几个货:如上图:
汇编器相关选项
编译器相关选项
预处理器相关选项
链接器描述文件(*.map)中包含的内容
还有这个:上面是专门的链接器相关配置的界面,那么这些东东都是干嘛用的呢?
让我们先来举个栗子,考虑比如下面这样一段代码:
123 ...
Cortex-M3启动文件分析
此启动文件来自Keil官方的startup_stm32f10x_hd.s
启动文件功能通常的说法:
堆栈初始化
定位中断向量表
调用Reset Handler
翻译自Keil官方启动文件中的注释的说法:
设置SP初始值
设置PC初始值,即Reset_Handler标号代表的地址
设置向量表中各向量的入口点,即各异常ISR的地址
设置时钟系统;设置板载外部SRAM为data memory(可选,由用户使能)
跳转到C库中的__main函数(最终会调用main())
1. 开辟栈空间12345Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem SPACE Stack_Size__initial_sp
开辟大小为0x00000400(1KB)的栈,名为STACK,NOINIT即不初始化,READWRITE表示可读写,ALIGN=3代表8(2^3)字节对齐。EQU: 宏定义的伪指令,类似于c语言中的#defi ...
