ARM Cortex-M底层技术(九)KEIL MDK 分散加载示例1-更改程序运行基址

2023-05-16

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文件能做的事情也远不止于此,以后我们还会多次涉及这个文件的用法。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM Cortex-M底层技术(九)KEIL MDK 分散加载示例1-更改程序运行基址 的相关文章

  • GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

    运维给分配了一个新的服务器 xff0c 发现服务器上并没有安装mysql xff0c 一些shell脚本调用的mysql命令就无法使用 xff0c 随后开始安装mysql xff0c 本来准备请运维帮忙安装 xff0c 但是运维说自己装吧
  • golang go get中断问题解决: git 推送出现 "fatal: The remote end hung up unexpectedly" 解决方案

    转自 https blog csdn net weixin 38450840 article details 80701173 git 推送出现 fatal The remote end hung up unexpectedly 解决方案
  • Maven 镜像源配置

    settings xml 文件 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt settings xmlns 61 34 http maven apache org SET
  • 前端免费模板

    最近发现了一个前端免费模板 xff0c 分享给大家 xff1a http www mobanwang com mb
  • Postman 使用教程

    关注 开源Linux xff0c 选择 设为星标 回复 学习 xff0c 有我为您特别筛选的学习资料 postman是一款支持http协议的接口调试与测试工具 xff0c 其主要特点就是功能强大 xff0c 使用简单且易用性好 无论是开发人
  • 3.卡尔曼滤波理论基础之最优估计(最小方差估计)

    文章目录 一 最小方差估计例子 二 线性最小方差估计三 其他最优估计1 极大验后估计2 极大似然估计 四 总结 一 最小方差估计 前两篇文章对最优估计中的最小二乘估计进行了较为系统的介绍 我们已经知道 xff0c 所谓最优估计就是让估值结果
  • YOLOV4与YOLOV3的区别

    YOLOV4与YOLOV3的区别 A big bliss的博客 CSDN博客 yolov3和yolov4的区别 首先 xff0c 先大概的说下二者之间的差别 xff1a 1 特征提取网络的不同 2 激活函数的不同 3 loss的不同 4 数
  • HTTP Authorization

    HTTP Authorization 授权流程 在项目中往往需要对访问的请求进行安全认证 xff0c 只有认证通过的请求 xff0c 才能进行相关的操作 开发者需要颁发 AccessKey 和 SecretKey 给用户 xff0c 用户如
  • 求助!!tensorflow无法调用GPU计算。。

    求助 xff01 xff01 tensorflow无法调用GPU计算 如题 xff0c 本人是小白级别的爱好者 xff0c 使用的是联想台式机 xff0c win10系统 xff0c 有一块GeForce GT730的独立显卡 xff0c
  • C++系列: 嵌套命名空间

    目录 1 什么是嵌套命名空间 xff1f 2 实验 2 1 外部引用嵌套命名空间内的符号 2 2 命名空间内容不同层次间符号的引用 3 最后 1 什么是嵌套命名空间 xff1f 嵌套命名空间就是在命名空间里面在定义其它的命名空间 xff0c
  • 树莓派:ssh“疯掉”了

    昨晚 xff0c 电脑用ssh连接不了树莓派 我非常淡定 xff0c 首先在树莓派上打开配置 xff0c 看看ssh有没有打开 xff0c 很明显 xff0c 一直开着的 嗯 xff0c 可能无线连接的分配的ip地址变了 于是 xff0c
  • 串口通信协议

    1 串口通信协议简介 串口通信 xff08 serial communication xff09 是一种设备间非常常用的串行通信方式 xff0c 大部分电子设备都支持 xff0c 电子工程师再调试设备时也经常使用该通信方式输出调试信息 2
  • vim 实现批量注释

    vim 实现批量注释 第一种方法 批量插入字符快捷键 xff1a Ctrl 43 v进入VISUAL BLOCK xff08 可视块 xff09 模式 xff0c 按 j xff08 向下选取列 xff09 或者 k xff08 向上选取列
  • CMake下头文件和链接库的使用

    一 头文件与链接库文件的区别 头文件 xff1a 申明函数接口 库文件 xff1a 存放函数的定义 库文件通过头文件向外导出接口 xff0c 用户通过头文件找到库文件中需要的函数实现代码进行链接至程序当中 二 静态链接库 xff08 lib
  • 查看虚拟机里的Centos7的IP

    这里之所以是查看下IP xff0c 是我们后面要建一个Centos远程工具Xshell 连接Centos的时候 xff0c 需要IP地址 xff0c 所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用户名r
  • 堡垒机-百百堡垒机-基于WEB的VNC、RDP、SSH远程控制。无须任何插件,随时随地远程。

    1 百百堡垒机 基于web的软件堡垒机 xff0c 无任何插件 随时随地运维就是这么简单 百百堡垒机是开源软件 git https gitee com baibaiclouds platform 官网地址 http bb app yun c
  • MSB:3721 CUDA10.1+VS2019

    环境 CUDA10 1 43 VS2019 43 X64位操作系统 错误代码 xff1a MSB3721 命令 C Program Files NVIDIA GPU Computing Toolkit CUDA v10 1 bin nvcc
  • D435i_vinsmono

    目录 xff08 1 xff09 安装测试librealsense SDK 2 0 1 2 3 以上不行的话 xff0c 参考 xff1a 5 xff08 2 xff09 安装测试realsense 错误1 xff1a 解决 xff1a x
  • 解决笔记本屏幕显示缩放比例125% 150%对页面布局的影响

    我的是vue项目 在utils js添加方法 detectZoom export const detectZoom 61 61 gt let ratio 61 0 screen 61 window screen ua 61 navigato
  • 【vnc】分辨率设置

    vncserver list vncserver kill 6 vncserver geometry 1920x1070 建一个vnc 然后屏幕截图 把vnc显示区域截图下来 xff1b 查看图片的像素 1920x1080 变成 1920x

随机推荐

  • 雷达系列论文翻译(十一):LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometryvia Smoothing and Mapping

    LVI SAM Tightly coupled Lidar Visual Inertial Odometryvia Smoothing and Mapping 摘要 我们提出了一个通过平滑和映射实现的紧耦合激光雷达视觉惯性里程计的框架LVI
  • 【netconf】yang-explorer部署/基于ubuntu18.04/python2.7/安装过程问题总结

    1 yang explorer部署参考文档 xff08 ubuntu18 xff09 xff1a https blog csdn net luhailiang98 article details 105148566 ps 因为懒得排版 xf
  • Learning to Model the Tail:通过多样本任务辅助少样本任务学习(元学习)

    在日常生活中 xff0c 数据的数量并不是相等的 即使是在超大型数据集中 xff0c 数据的数量差异也广泛存在 xff0c 例如下图中SUN 397中的数据分布情况 卧室的数据可以达到1000以上 xff0c 但图书馆甚至不到50 在本文中
  • 【Gerrit】正确添加了SSh key 仍报错 Permission denied (publickey). fatal: Could not read from remote repository

    git开发环境部署 安装gitbash xff0c 配置用户名和邮箱 xff1a git config span class token operator span global user span class token punctuat
  • FreeRTOS源码解析——第一章 整体架构

    FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列 第六章 FreeRTOS 软件定时
  • 普通 div 模拟 placeholder

    这是由于我们项目中使用的 quasar 组件里的 editor xff08 实际是 div 元素 xff09 的占位符问题引起的探讨 首先说明一下 xff0c 非表单元素如 div 可以通过加一个 contenteditable 为 tru
  • FreeRTOS源码解析——第二章 编程规范

    FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列
  • FreeRTOS源码解析——第三章 内存管理

    FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列 第六章 FreeRTOS 软件定时
  • sonic编译过程

    文章目录 1 0虚拟机选择2 0虚拟机安装3 0 系统配置4 0 安装docker5 0 安装sonic 1 0虚拟机选择 原则上所有的系统都可以编译sonic xff0c 此处我们选择centos 7 7 xff0c 虚拟机的内存空间建议
  • Sonic测试架构介绍

    Sonic项目简介 Sonic Software for Open Networking in the CloudSonic是基于Linux的开源网络操作系统 xff0c 可以跑在多个不同芯片厂商交换机上Sonic在2016年OCP峰会上
  • Sonic_cli常用命令

    用户名 xff1a admin 密码 xff1a YourPaSsWoRd 一 change password admin 64 sonic passwd Changing password for admin current UNIX p
  • SONIC config_db.json文件的前生今世

    config db json的使用 系统启动时从config db json中读取数据并写入CONFIG DB数据库 xff0c 前提是config db json存在 xff1b 保存当前系统的一些配置信息 xff0c 通过config
  • SONiC架构DOCKER组件交互分析

    BGP组件交互分析 内核中的bgp socket收到BGP更新报文 xff0c 然后被上送到bgpd进程bgpd处理该报文 xff0c 并通知zebra进程新增前缀和关联下一跳zebra确定该目的可达后 xff0c 生成一个路由网络链接信息
  • sonic处理netlink事件

    sonic处理netlink事件 sonic在处理路由 xff0c 接口up down 接口地址变化 xff0c team等事件上极大的依赖内核 sonic通过监听rtnl事件来响应linux事件 从而感知相关信息变化 libnl soni
  • sonic配置team与实现机制

    sonic实现team代码框架图 xff1a sonic修改lag模式配置步骤 1 修改文件teamd j2 docker exec it teamd bash cd usr share sonic templates vim teamd
  • asyncComputed 异步计算属性

    asyncComputed 异步计算属性 我们项目中最近使用了异步计算属性 xff0c 个人感觉很好用 xff0c 特此推荐给大家 一 案例 假设这样一个场景 xff1a 一个列表数据 data 是通过接口返回 xff0c 请求参数中有一个
  • sonic管理口信息处理流程

    sonic管理口信息处理流程 管理接口信息配置文件格式 管理信息使用MGMT INTERFACE 表进行配置 对象的key由管理接口名字和IP前缀使用 连接而成 属性 gwaddr用于执行默认路由指向管理口 xff0c 其值为默认网关 属性
  • SONIC VLAN配置流程

    SONIC VLAN配置流程 sonic vlan配置通过订阅config db的键空间事件完成vlan配置信息从config db到内核和硬件 config db json格式如下 xff1a 34 VLAN 34 34 Vlan1000
  • sonic容器构建

    sonic中大量的组件运行在docker容器中 xff0c 用于隔离彼此的运行环境 xff0c 从而解决相互之间的互斥问题 下面我们分析一下sonic中各个容器的构建过程 Dockerfile文件的生成过程 sonic中的容器Dockerf
  • ARM Cortex-M底层技术(九)KEIL MDK 分散加载示例1-更改程序运行基址

    KEIL MDK 分散加载示例1 更改程序运行基址 小编我一向主张在实战中学习 xff0c 不主张直接去去学习规则 amp 定义 xff0c 太枯燥 xff0c 在实际应用中去摸索 xff0c 才会真正理解具体的技术细节 xff0c 下面我