MDK 代码烧录到RAM区运行

MDK 代码烧录到RAM区运行

  • 环境
  • 配置
  • 设置分散加载文件
  • 启动文件修改
    • 设置外部调试器烧录
  • 建立函数入口
  • 半主机问题导致BKPT 0xAB

有一个需求,除了IAR以及GCC的版本工程还需要MDK版本,为了实现最小的工程环境,flash烧录算法也没有,这时需要直接跑在RAM中

这里以一个最小的平台为例(不含外设驱动)

关联 制作flash算法文件参考

环境

MDK:v5.39
编译器:armclang
平台:arm cortex-m3

配置

我的内存地址:0x10000000 - 0x100FFFFF

编写调试配置文件(设置栈、PC、中断向量表)RAM_Debug.ini

/*----------------------------------------------------------------------------* Name:    RAM_Debug.ini* Purpose: RAM Debug Initialization File* Note(s):*----------------------------------------------------------------------------* This file is part of the uVision/ARM development tools.* This software may only be used under the terms of a valid, current,* end user licence from KEIL for a compatible version of KEIL software* development tools. Nothing else gives you the right to use this software.** This software is supplied "AS IS" without warranties of any kind.** Copyright (c) 2008-2011 Keil - An ARM Company. All rights reserved.*----------------------------------------------------------------------------*//*----------------------------------------------------------------------------Setup()  configure PC & SP for RAM Debug*----------------------------------------------------------------------------*/
FUNC void Setup (void) {SP = _RDWORD(0x10000000);          // Setup Stack PointerPC = _RDWORD(0x10000004);          // Setup Program Counter_WDWORD(0xE000ED08, 0x10000000);   // Setup Vector Table Offset Register
}FUNC void OnResetExec (void)  {      // executes upon software RESETSetup();                           // Setup for Running
}load %L incremental                 // load %L incremental  增量下载模式节省时间Setup();                             // Setup for Runningg, main

设置应用
在这里插入图片描述

设置分散加载文件

前512KB用于代码段只读
后512KB用于变量
命名xxx.sct

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x10000000 0x80000  {    ; load region size_regionER_IROM1 0x10000000 0x80000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x10080000 0x7F000  { ; 512KB Data;*(USE_VAR_SPACE).ANY (+RW +ZI)};ARM_LIB_HEAP  0x100FF000 EMPTY  0x800 {;};ARM_LIB_STACK 0x100FF800 EMPTY  0x800 {;};ARM_LIB_STACKHEAP 0x100FF000 EMPTY  0x1000 {;}
}

设置应用
在这里插入图片描述
这里保持一致
在这里插入图片描述

启动文件修改

命名为xxx.s


Stack_Size		EQU     0x400AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>Heap_Size      EQU     0x400AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limitPRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_SizeIMPORT  SysTick_Handler__Vectors       DCD     __initial_sp                      ; Top of StackDCD     Reset_Handler                     ; Reset HandlerDCD     NMI_Handler                       ; NMI HandlerDCD     HardFault_Handler                 ; Hard Fault HandlerDCD     MemManage_Handler                 ; MPU Fault HandlerDCD     BusFault_Handler                  ; Bus Fault HandlerDCD     UsageFault_Handler                ; Usage Fault HandlerDCD     0                                 ; ReservedDCD     0                                 ; ReservedDCD     0                                 ; ReservedDCD     0                                 ; ReservedDCD     SVC_Handler                       ; SVCall HandlerDCD     DebugMon_Handler                  ; Debug Monitor HandlerDCD     0                                 ; ReservedDCD     PendSV_Handler                    ; PendSV HandlerDCD     SysTick_Handler                   ; SysTick Handler; External Interrupts;DCD     WWDG_IRQHandler                   ; Window WatchDog interrupt ( wwdg1_it)__Vectors_End__Vectors_Size  EQU  __Vectors_End - __VectorsAREA    |.text|, CODE, READONLY; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler                    [WEAK]IMPORT  SystemInitIMPORT  __mainLDR     R0, =SystemInitBLX     R0LDR     R0, =__mainBX      R0ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler     PROCEXPORT  NMI_Handler                      [WEAK]B       .ENDP
HardFault_Handler\PROCEXPORT  HardFault_Handler                [WEAK]B       .ENDP
MemManage_Handler\PROCEXPORT  MemManage_Handler                [WEAK]B       .ENDP
BusFault_Handler\PROCEXPORT  BusFault_Handler                 [WEAK]B       .ENDP
UsageFault_Handler\PROCEXPORT  UsageFault_Handler               [WEAK]B       .ENDP
SVC_Handler     PROCEXPORT  SVC_Handler                      [WEAK]B       .ENDP
DebugMon_Handler\PROCEXPORT  DebugMon_Handler                  [WEAK]B       .ENDP
PendSV_Handler  PROCEXPORT  PendSV_Handler                    [WEAK]B       .ENDP
; SysTick_Handler PROC
;                 EXPORT  SysTick_Handler                   [WEAK]
;                 B       .
;                 ENDPDefault_Handler PROC;EXPORT  WWDG_IRQHandler                   [WEAK];WWDG_IRQHandlerB       .ENDPALIGN;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************IF      :DEF:__MICROLIBEXPORT  __initial_spEXPORT  __heap_baseEXPORT  __heap_limitELSEIMPORT  __use_two_region_memoryEXPORT  __user_initial_stackheap__user_initial_stackheapLDR     R0, =  Heap_MemLDR     R1, =(Stack_Mem + Stack_Size)LDR     R2, = (Heap_Mem +  Heap_Size)LDR     R3, = Stack_MemBX      LRALIGNENDIFEND

设置外部调试器烧录

在这里插入图片描述

建立函数入口

/*** @brief 函数主入口**/
int main(void)
{return 0;
}

半主机问题导致BKPT 0xAB

MDK开启系统函数重定向功能
ref: https://developer.arm.com/documentation/ka002219/latest
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】:list容器的基本使用

目录 &#x1f680;前言一&#xff0c;list的介绍二&#xff0c;list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插&#xff0c;头删&#xff0c;尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear &#x1f680;前言 list中的接口比较多&#xff…

SpringBootWeb 篇-入门了解 Apache POI 使用方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Apache POI 概述 2.0 使用 Apache POI 读写 Excel 文件 2.1 写入 Excel 文件 2.2 写入 Excel 文件代码演示 2.3 读取 Excel 文件 2.4 读取 Excel 文件代码演示 1.…

使用Multipass编译OpenHarmony工程

Multipass 是一个轻量级虚拟机管理器&#xff0c;支持 Linux、Windows 与 macOS&#xff0c;这是为希望使用单个命令提供全新 Ubuntu 环境的开发人员而设计的。使用 Linux 上的 KVM、Windows 上的 Hyper-V 和 macOS 上的 HyperKit 来以最小的开销运行 VM&#xff0c;同时它还可…

【网络安全学习】使用Kali做渗透情报收集-02-<指纹识别+目录扫描>

1.指纹识别 指纹识别是指通过一些特征或特定文件来识别目标网站或系统的类型、版本、组件等信息&#xff0c;以便寻找相应的漏洞或攻击方法。 主动指纹识别 通过向目标系统发送正常和异常的请求以及对文件内容的查找&#xff0c;记录响应方式&#xff0c;然后与指纹库进行对比…

【系统架构设计师】一、计算机系统基础知识(指令系统|存储系统|输入输出技术|总线结构)

目录 一、指令系统 1.1 计算机指令 1.2 指令寻址方式 1.3 CISC 与 RISC 1.4 指令流水线 二、存储系统 2.1 分级存储体系 2.2 地址映射 2.3 替换算法 2.4 磁盘 2.4.1 磁盘结构和参数 2.4.2 磁盘调度算法 三、输入输出技术 四、总线结构 五、考试真题练习 一、指令…

Java 收集常见面试题

set和list的区别&#xff1f;给定一系列字符串&#xff0c;从集合的set和list中查询&#xff0c;如何查询出相关的数据&#xff1f; 在Java中&#xff0c;Set和List都是用于存储对象的集合 Set&#xff1a; 不允许包含重复的元素。 没有顺序&#xff08;即不保证元素的迭代顺序…

K-MEANS 算法的简单实现

K-MEANS 算法的简单实现 目的是为了自己熟悉 K 均值的过程 思路&#xff1a; 如何写一个 KMEANS 算法呢 我们就做一个最简单的&#xff0c;所有的数据都是点&#xff0c;也就是只有横纵坐标。 数据的格式我们用一个数组来进行表示&#xff0c;数组有两个值&#xff0c;一个是 …

Java @Aysn实现异步 及导致失效原因

在 Java 中&#xff0c;Async 注解用于表明一个方法是异步执行的。这意味着方法会在调用时立即返回&#xff0c;而不会等待方法体内的代码执行完毕。这对于需要异步执行长时间操作的方法非常有用&#xff0c;比如发送邮件、处理大量数据等。 1.使用实例 假设有一个 Spring Boo…

12.1 Go 测试的概念

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

python之面向对象编程

01 第一步 创建类&#xff0c; self指向调用该函数的对象 也就是通过类实例出来的对象 class Person():def __init__(self):self.name zsself.age 12def fn(self):print(self)p1 Person() print(p1) # <__main__.Person object at 0x000002509F331790> print(p1.fn()…

独孤思维:和副业付费学员吵架了

01 之前和老婆出去逛街。 很久没有静下心来&#xff0c;谈这么久。 聊到工作副业&#xff0c;孩子教育。 发现很多内容都存在偏差&#xff0c;之前一直没有深思讨论过。 经过这一次讨论之后&#xff0c;更优化了关于小孩的教育观&#xff0c;关于工作和副业的平衡问题。 …

LeetCode 0522.最长特殊序列 II:两句话讲明思路(子序列判断)

【LetMeFly】522.最长特殊序列 II&#xff1a;两句话讲明思路(子序列判断) 力扣题目链接&#xff1a;https://leetcode.cn/problems/longest-uncommon-subsequence-ii/ 给定字符串列表 strs &#xff0c;返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在&#xff0c;…

VM4.3 二次开发02 方案加载、执行及显示

效果 这是二次开发的第二个文章&#xff0c;所以不重复说明环境配置相关的内容。如果不懂的可以看本专栏的上一个文章。 海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果-CSDN博客 界面代码 <Window x:Class"VmTestWpf.App.MainWindow"x…

element-plus的Tour 漫游式引导怎么去绑定Cascader 级联选择器

首先官方例子是用的button 官方.$el这个log出来是&#xff1a; 知道是以元素为准就拿对应的元素就行 级联选择器.$el是这样的&#xff1a; 你可以移入这个元素部分去看看是哪个要用的&#xff08;好像火狐直接放上去就可以看到元素表示&#xff0c;谷歌要双击或者右键选择去看…

手机ip地址怎么换成成都的

随着互联网的快速发展&#xff0c;我们越来越依赖于网络进行各种操作。而在某些情况下&#xff0c;为了更好地享受网络服务或保护个人隐私&#xff0c;我们可能需要改变手机的IP地址。本文将详细介绍如何将手机IP地址换成成都的&#xff0c;同时提醒大家在操作过程中需要注意的…

ts-node

ts-node 是一个 TypeScript 执行引擎&#xff0c;它允许您直接运行 TypeScript 代码&#xff0c;而无需先将其编译为 JavaScript。这在开发和测试过程中非常有用&#xff0c;可以提高开发效率。以下是关于 ts-node 的一些基本信息和使用方法。 安装 您可以通过 npm 或 yarn 安…

【AI开发】CRAG、Self-RAG、Adaptive-RAG

先放一张基础RAG的流程图 https://blog.langchain.dev/agentic-rag-with-langgraph/ 再放一个CRAG和self-RAG的LangChain官方博客 Corrective RAG(CRAG) 首先需要知道的是CRAG的特色发生在retrieval阶段的最后开始&#xff0c;即当我们获得到了近似的document&#xff08;或者…

(day1)数据类型详解及DML语句入门

一、数据类型 1、整型类型 &#xff08;1&#xff09;创建数据库 CREATE DATABASE ql_linux&#xff1b; CREATE SCHEMA IF NOT EXISTS ql_linux&#xff1b; //IF NOT EXISTS如果没有表就创建 SHOW DATABASE; //查看数据库 &#xff08;2&#xff09;创建表 C…

【仿真建模-anylogic】Conveyor Network理念解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-17 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 概念 Conveyor Network由物料处理库中的多种空间标记元素所构成的图形化运输网&#xff0c;如&#xff1a;Conveyor、Station、Turn…

【Git】-- 添加公钥到 github 或者gitlab上

仅针对系统&#xff1a;mac os 、 unix、linux 1、检查是否有 id_rsa.pub $ cd ~ $ ls -al ~/.ssh 注意&#xff1a;若已有 id_rsa.pub&#xff0c;则必要执行 第二步&#xff0c;避免覆盖掉原有正常的公钥。 配置多个 git 账号请参考&#xff1a;同一台电脑配置多个git账…