DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行

实现目的:代码在RAM中调试完成后,就需要将其固化下载到FLASH中,但是FLASH中运行所有程序的话会存在计算或程序运行时间过长的问题,故还需要将部分代码转移至RAM中运行。

1. 更换CMD文件

在前文基于DSP280049C的正点原子PMSM电机驱动(一):CCS文件夹的建立与IQmath导入,我们创建的文件所运用的CMD是28004x_iqmath_ram_link_cmd,当我们要进行FLASH烧录时,则需要选择28004x_iqmath_flash_link_cmd(该CMD文件将会放在文末附录中免费下载)。

1.1 内存分块

先来看28004x_iqmath_flash_link_cmd关于内存的分块:
其中“PAGE 0 ”主要是放置函数的内存区域,“PAGE 1 ”主要是放置数据的内存区域,每个内存块都可以自定义它的大小。

MEMORY
{
PAGE 0 :/* Program Memory *//* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation *//* BEGIN is used for the "boot to FLASH" bootloader mode   */BEGIN           	: origin = 0x080000, length = 0x000002RAMM0           	: origin = 0x0000F3, length = 0x00030DRAMLS0          	: origin = 0x008000, length = 0x002000RAMLS1      		: origin = 0x00A000, length = 0x000800RESET           	: origin = 0x3FFFC0, length = 0x000002/* Flash sectors *//* BANK 0 */FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000	/* on-chip Flash */FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x001000	/* on-chip Flash *//* BANK 1 */FLASH_BANK1_SEC0  : origin = 0x090000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC1  : origin = 0x091000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC2  : origin = 0x092000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC3  : origin = 0x093000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC4  : origin = 0x094000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC5  : origin = 0x095000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC6  : origin = 0x096000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC7  : origin = 0x097000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC8  : origin = 0x098000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC9  : origin = 0x099000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC10 : origin = 0x09A000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC11 : origin = 0x09B000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC12 : origin = 0x09C000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC13 : origin = 0x09D000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC14 : origin = 0x09E000, length = 0x001000	/* on-chip Flash */FLASH_BANK1_SEC15 : origin = 0x09F000, length = 0x000FF0	/* on-chip Flash *///   FLASH_BANK1_SEC15_RSVD : origin = 0x09FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */PAGE 1 : /* Data Memory *//* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */BOOT_RSVD       : origin = 0x000002, length = 0x0000F1     /* Part of M0, BOOT rom will use this for stack */RAMM1           : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
//   RAMM1_RSVD      : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */RAMLS5      : origin = 0x00A800, length = 0x000800RAMLS6      : origin = 0x00B000, length = 0x000800RAMLS7      : origin = 0x00B800, length = 0x000800RAMGS0      : origin = 0x00C000, length = 0x002000RAMGS1      : origin = 0x00E000, length = 0x002000RAMGS2      : origin = 0x010000, length = 0x002000RAMGS3      : origin = 0x012000, length = 0x001FF8
//   RAMGS3_RSVD : origin = 0x013FF8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
}
1.2 内存分配

内存分配这部分可以根据实际需求进行分配,可以在Build程序后,调用"Window-Show View-Memory Allocation"窗口来查看分配情况。
在这里插入图片描述

SECTIONS
{codestart        : > BEGIN,     PAGE = 0, ALIGN(4).text            : >> FLASH_BANK0_SEC0 | FLASH_BANK0_SEC1 | FLASH_BANK0_SEC2 | FLASH_BANK0_SEC14 | FLASH_BANK0_SEC15,   PAGE = 0, ALIGN(4).cinit           : > FLASH_BANK0_SEC3|FLASH_BANK0_SEC4|FLASH_BANK0_SEC5,     PAGE = 0, ALIGN(4).switch          : > FLASH_BANK0_SEC6,     PAGE = 0, ALIGN(4).reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */.stack           : > RAMM1,     PAGE = 1#if defined(__TI_EABI__).init_array      : >> FLASH_BANK0_SEC3|FLASH_BANK0_SEC4|FLASH_BANK0_SEC5,       PAGE = 0,       ALIGN(4).bss             : >> RAMLS5 | RAMLS6 | RAMLS7,       PAGE = 1.bss:output      : > RAMLS0,       PAGE = 0.bss:cio         : > RAMLS0,       PAGE = 0.data            : > RAMLS5,       PAGE = 1.sysmem          : > RAMLS5,       PAGE = 1/* Initalized sections go in Flash */.const           : > FLASH_BANK0_SEC6,       PAGE = 0,       ALIGN(4)
#else.pinit           : >> FLASH_BANK0_SEC3|FLASH_BANK0_SEC4|FLASH_BANK0_SEC5,       PAGE = 0,       ALIGN(4).ebss            : >> RAMLS5 | RAMLS6 | RAMLS7,       PAGE = 1.esysmem         : >> RAMLS5 | RAMLS6 | RAMLS7,       PAGE = 1.cio             : > RAMLS0,       PAGE = 0.econst          : > FLASH_BANK0_SEC6,    PAGE = 0, ALIGN(4)
#endiframgs0           : > RAMGS0,    PAGE = 1ramgs1           : > RAMGS1,    PAGE = 1#if defined(__TI_EABI__) .TI.ramfunc      : LOAD = FLASH_BANK0_SEC7 | FLASH_BANK0_SEC8 ,RUN = RAMLS0 ,LOAD_START(RamfuncsLoadStart),LOAD_SIZE(RamfuncsLoadSize),LOAD_END(RamfuncsLoadEnd),RUN_START(RamfuncsRunStart),RUN_SIZE(RamfuncsRunSize),RUN_END(RamfuncsRunEnd),PAGE = 0, ALIGN(4)
#else					  .TI.ramfunc      : LOAD = FLASH_BANK0_SEC7 | FLASH_BANK0_SEC8,RUN = RAMLS0,LOAD_START(_RamfuncsLoadStart),LOAD_SIZE(_RamfuncsLoadSize),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),RUN_SIZE(_RamfuncsRunSize),RUN_END(_RamfuncsRunEnd),PAGE = 0, ALIGN(4)
#endif /* User Define areas below: *//* User Define areas above: *//* Allocate IQ math areas: */IQmath			: > FLASH_BANK0_SEC10|FLASH_BANK0_SEC11, PAGE = 0, ALIGN(4)            /* Math Code */IQmathTables		: > FLASH_BANK0_SEC12|FLASH_BANK0_SEC13, PAGE = 0, ALIGN(4)
}

对于.text等每部分的含义,可以参考:DSP28377S_程序从FLASH部分复制到RAM中运行详解

2. _FLASH引用

2.1 mani.c中的引用

头文件部分引用如下

#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include "IQmathLib.h"

参数部分引用如下(在主函数main之前引用即可)

#include "stddef.h"
#define _FLASH
#ifdef _FLASH
// These are defined by the linker (see device linker command file)
extern uint16_t RamfuncsLoadStart;
extern uint16_t RamfuncsLoadSize;
extern uint16_t RamfuncsRunStart;
#endif

main函数中的函数初始化如下

int main(void)
{Device_init();Device_initGPIO();DINT;Interrupt_initModule();Interrupt_initVectorTable();IER = 0x0000;IFR = 0x0000;DELAY_US(1000L);SPIA_int ();CAP_int();ADC_int();DAC_int();userGPIO_int ();EPWM1_int();EINT;                                       //使能全局中断ERTM;while (1){}
}
2.2 device.c中的引用

在头文件申明之后添加如下代码即可

#include "stddef.h"
#define _FLASH
#ifdef _FLASH
// These are defined by the linker (see device linker command file)
extern uint16_t RamfuncsLoadStart;
extern uint16_t RamfuncsLoadSize;
extern uint16_t RamfuncsRunStart;
#endif
2.3 将部分函数移植到RAM中运行

只需要在需要移植的函数之前加上这一句代码即可

__attribute__((ramfunc))

比如:

__attribute__((ramfunc))
uint16_t Get_cap(void)
{static uint32_t cap1cnt;static uint32_t cap3cnt;static uint32_t Period1;uint32_t speed;cap1cnt = ECap1Regs.CAP1;cap3cnt = ECap1Regs.CAP3;Period1 = cap3cnt - cap1cnt;speed   = (100000000)/Period1;return speed;
}

在这里插入图片描述
可以看到如果RAM空间足够,或者说程序较小,是可以将所用到的函数全部移植到RAM中运行的

3. 编译下载运行一气呵成

附录

28004x_iqmath_flash_link_cmd

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

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

相关文章

Sublime Text 3 解决中文乱码问题

Sublime Text 3 解决中文乱码问题 一、引言二、主要内容1. 初识 ConvertToUTF8 插件2. 安装 ConvertToUTF8 插件3. 中文乱码问题解决 三、总结 一、引言 在 《Sublime Text 3配置C/C开发环境》 博文中,Huazie 带大家利用 Sublime Text 3 配置了 C/C 开发环境&#…

手把手教你使用zabbix5.0设置企业微信告警

一、环境要求 需要准备2台虚拟机,镜像是centos7,保证2台虚拟机之间可以正常通信,并且可以正常连接外网。 systemctl stop firewalld && systemctl disable firewalld setenforce 0 && sed -i ‘/SELINUX/s/enforcing/disable…

【infiniband】安装驱动

安装 InfiniBand 驱动包通常包括几个步骤,但是可能会有所不同,取决于使用的操作系统和具体的硬件。以下是在 Linux 系统上安装 InfiniBand 驱动的通用步骤: 1.检查硬件和操作系统兼容性 确保服务器硬件支持 InfiniBand,并查看驱动…

详解Maven如何打包SpringBoot工程

目录 一、spring-boot-maven-plugin详解 1、添加spring-boot-maven-plugin插件到pom.xml 2、配置主类(Main Class) 3、配置打包的JAR文件名 4、包含或排除特定的资源文件 5、指定额外的依赖项 6、配置运行参数 7、自定义插件执行阶段 二、Maven打…

LeetCode Hot100 23.合并K个升序链表

题目: 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 方法:分治,类似于归并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return mer…

canvas中实现画布内元素的拖拽(下)

在上篇实现基础上,实现仅能在画布区域内移动 const canvas document.createElement(canvas) canvas.width 400 canvas.height 400 canvas.id canvas document.body.appendChild(canvas) let ctx canvas.getContext(2d) //画笔// 状态标志 const statusConfig …

arp欺骗原理以及实现方式

我们知道了arp的作用,那么此时我们怎么可以用他来进行攻击呢?在一个局域网中,我们怎么实现呢? 原理: 这样B就可以做到中间人了,可以接受到两个主机的数据了。换句话来说,在同一个局域网内&…

C/C++ 有效的括号判断

题目: 给定一个只包括 (,),{,},[,]的字符串s,判断字符串是否有效。 约束: 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。…

【六】python观察者设计模式

6.1行为型模式简介 观察者设计模式是最简单的行为型模式之一,所以我们先简单了解一下行为型模式 创建型模式的工作原理是基于对象的创建机制的。由于这些模式隔离了对象的创建细 节,所以使得代码能够与要创建的对象的类型相互独立。结构型模式用于设计对象和类的结…

Python GUI教程:轻松构建用户界面

大家好,从网络开发到数据科学,Python被广泛应用于各个领域。本文将探索Python内置的用于创建图形用户界面(GUI)的库:Tkinter。无论是初学者还是经验丰富的开发者,了解如何创建Python GUI都可以增强构建交互…

Makefile基本指令

语法规则 目标 ... : 依赖 ...命令1命令2. . .1、目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。 2、默认情况下Makefile的第一个目标为终极目…

系统接口未找到报404异常统一返回处理

上篇博客:异常处理返回结构体,做到全局统一,仍然会出现一些情况。 针对未找到接口爆出404异常,返回结构体如果没有处理的话会变成下面这样,不会走全局异常处理,这样的话就没有完全做到全局异常统一处理。 …

es模板和索引简单操作简介

一、模板 1、创建模板 (1)请求url http://127.0.0.1:9201/_template/template_test (2)请求方式 PUT (3)请求体 { "index_patterns": ["test*"], "settings": { …

并发相关参数指标

指标 1、TPS和QPS 一、TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS CAPS 每个呼叫平均TPS&…

前端发送请求之参数处理---multipart/form-data与application/x-www-form-urlencoded

Content-Type就是指 HTTP 发送信息至服务器时的内容编码类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据。 其实前后端发送请求的方式有 text/plain、application/json、application/x-www-form-urlencoded、 multipart/form-data等&…

Axie Infinity 之后,Ronin 的潜力何在?

作者:stellafootprint.network 数据来源:Ronin Dashboard 备受欢迎的 Web3 游戏 Pixels 在 2023 年 10 月下旬从 Polygon 迁移到了专为游戏设计的区块链 Ronin。Pixels 此前作为 Polygon 上活跃用户(钱包数量)最多的 Web3 游戏&…

iPhone手机中备忘录如何改变字体颜色

作为一名iPhone用户,我经常使用手机备忘录来记录生活中的点点滴滴。这样,我的大脑就能从繁琐的记忆任务中解脱出来,专注于更重要的事情。 而且,我有一个特别的习惯,那就是使用不同颜色的字体来区分不同的备忘录。这样…

学习黑马vue

项目分析 项目下载地址:vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章,算是比较详细:vue安装与配置-CSDN博客 安装这两个插件可格式化代码,vscode这个软件是免费的,官网:…

什么是 Spring 框架?

Spring 框架是一个开源的、轻量级的企业级应用框架,用于构建 Java 应用程序。它提供了全面的基础设施支持,以简化企业级应用的开发。Spring 的核心目标是通过促进良好的设计原则和编程习惯来提高 Java 开发人员的效率和系统的可维护性。 Spring 框架的主…

2023-12-14 二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数

二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数 104. 二叉树的最大深度 思想:可以使用迭代法或者递归!使用递归更好,帮助理解递归思路!明确递归三部曲–①确定参数以及返回参数 ②递归结束条件 ③单层逻辑是怎么样…