KEIL MDK 分散加载示例1-更改程序运行基址

KEIL MDK 分散加载示例1-更改程序运行基址

    小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细节,下面我们就通过实际的简单用例来搞清楚分散加载。

更改程序运行基址

我们先来做一个最简单的示例,然后逐步深入。

这里选择一颗简单一些的MCU,LPC824,一颗M0+作为示例(因为其比较简单,作为示例比较合适),我们先来看其默认的分散加载:

加载域地址从0x00000000地址开始,大小为0x8000(32KB),运行域(RO)从0x00000000开始,运行域(RW+ZI)从片内SRAM地址开始0x10000000。

我们尝试让程序从0x00001000地址上开始运行,我们该如何修改?加载域以及RO运行域直接改成0x00001000???可行吗?我们试试,我们把分散加载修改过来试试,看程序能不能运行。

按照上图修改分散加载,我们点击DEBUG,看程序是否能够正常调试,程序进入如下状态:

我们再之前的文章里面介绍过,你可以去查一下芯片的Memory MAP,这个地址空间其实是BOOT ROM(之前文章有过介绍。不知道BOOT ROM是啥的出门左转)你调试一下就会发现程序在里面死循环无法正常运行。

纳尼?不能跑??WHY???分散加载不好使了?????我们仔细分析一下,哪里出了问题,我们之前的文章说过MCU上电从BOOTROM启动起来之后会默认去0x00000000地址上去找MSP,从0x00000004地址上去找PC,但现在程序的加载地址以及运行地址都变成0x00001000了,而不是0x00000000地址了,我们需要告诉MCU,默认地址变了,不是0x00000000。那怎么告诉MCU呢?

其实在M0+/M3/M4内核里面有一个叫VTOR的寄存器(M0核里面我记得是没有),地址是0xE000ED08,这个寄存器用于设置异常&中断向量表默认地址,我们需要在程序运行起来之前设置VTOR寄存器,告诉MCU,地址变成0x00001000了,那怎么做呢?在这里,如下图:

这里有一个仿真器初始化文件,可以在程序下载之前写一些寄存器做一些初始化之类的工作,是一个扩展名为.ini的文件,也有其自己的语法,按照下图编写这个ini文件:

这里简单解释下这个ini文件的意思:FUNC的意思是定义一个函数,Setup()是对应的函数,内容大家都看得懂,直接给MSP以及PC赋值,然后写0xE000ED08(VTOR寄存器)地址,告知MCU地址启动地址改变了,最后一行代码的意思是调用Setup()函数。然后把写好的ini文件放到刚才的位置上,如下图:

我们再次运行一次程序,如下,我们的程序完美运行:

这只是一个最简单的分散加载使用示例,我们会尝试把代码加载到RAM中运行,就像电脑和手机一样;我们也会尝试把单独的一个函数或者一个变量加载到固定地址上;我们还会有把一个Flash空间加载多个image的示例等等。

当然上面提到的.ini文件能做的事情也远不止于此,以后我们还会多次涉及这个文件的用法。

(0)

相关推荐

  • UC头条:[STM32单片机学习]第三课: 开发板介绍和编程环境搭建

    [朱老师课程总结 侵删] 第一部分.章节目录 第三部分.随堂记录 3.3.1.STM32开发板详细介绍 3.3.1.1.开发板整体介绍 (1)各种外设和主板原理图 之前在STC51中使用的外设,都可以 ...

  • 航顺单片机开发环境

    航顺单片机开发环境

  • [原创]STM32F469 discovery Kit 测评

    前言: 在能申请这个套件的之前,我就已经在st mcu finder这个手机app上看到STM32F469 discovery Kit的相关消息了. http://www.st.com/web/en/ ...

  • [STM32]Nucleo-F446RE(主控:STM32F446RE)测评

    测: *基本概念: 1. 什么是Nucleo?(说实话,作者我也是对这个概念很好奇) Nucleo是意法半导体加入ARM embed项目后的又一个风格系列板卡,有两个鲜明的特点:1.兼容Arduino ...

  • Keil软件的介绍

    1.1.IDE概念      IDE就是集成开发环境,就是一套用来开发的完整的软件系统. 1.2.Keil uvision介绍      keil software公司出品的51系列兼容单片机c语言软 ...

  • KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则

    KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则 小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细 ...

  • KEIL MDK 分散加载的结构-2-语法

    KEIL MDK 分散加载的结构-2-语法 语法.枯燥的.烦人的语法--,但是有些时候木有办法,我本来也不想写这些东西,但确实绕不过去,我认为把它当成一种工具比较合适,了解大概结构以及基本的语法,一些 ...

  • KEIL MDK 分散加载的结构

    KEIL MDK 分散加载的结构 1.我们先来解剖一只麻雀     很多人会说我做项目时没用过分散加载啊,可能有些人甚至都不知道它的存在.事实上,开发环境会默认生成一个分散加载文件(或者叫链接器描述文 ...

  • Keil sct分散加载文件

    首先介绍几个概念: 1.ARM映像文件 ARM映像文件是一个层次性结构的文件,其中包含了域(region).输出段(output section)和输入段(input section).各部分关系如下 ...

  • (转)KEIL下分散加载文件 **.sct文件

    在keil中编译的程序通过了,但是debug的时候会出现一些错误:*** error 65: access violation at 0x4C000018 : no 'write' permissio ...

  • ARM Cortex-M底层技术(十三)手把手教你写分散加载

    ARM Cortex-M底层技术(十三)手把手教你写分散加载 还记得之前教大家写的启动代码吗?木看过滴,出门左转,第四篇[编写自己的启动代码],当然仅仅能编写自己的启动代码怎么够,说了辣么多分散加载的 ...

  • 分散加载-堆栈与预处理器

    分散加载-堆栈与预处理器 在分散加载中处理堆栈: 分散加载机制提供了一种方法,用于指定如何在映像中放置代码和静态分配数据. 应用程序的堆栈和堆是在 C 库初始化过程中设置的. 通过使用特别命名的ARM ...

  • 分散加载原理的简单介绍

    分散加载原理的简单介绍     分散加载我自己在最初学习这部分内容的时候在网上找吐血了都没找到很靠谱的深入的文章,基本看之前不懂,看完了就更不懂了,后来只能硬着头皮自己慢慢摸索,也花了很多功夫,这里跟 ...

  • 关于显示加载动态链接库模块及卸载的问题

    问题起因是,在一次模块卸载后,程序运行异常.遂对动态链接库做一些测试. 动态库加载方式有两种,隐式加载和显示加载,隐式加载包含xxx.lib导入库,在程序执行之前由动态加载器完成所有加载:显示加载则使 ...