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 开发环境&#…

【infiniband】安装驱动

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

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

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

arp欺骗原理以及实现方式

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

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

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

【六】python观察者设计模式

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

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

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

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这个软件是免费的,官网:…

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

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

更改Android Studio的.android和.gradle文件夹默认位置

一、首先关闭Android Studio, 二、目标位置新建文件夹 这一步,为了省去麻烦,我并没有直接在我的目标位置新建文件夹,而是把C盘下的.android和.gradle文件夹整个复制过来,和SDK都在同一目录下,感觉这样可以…

MySQL:从MySQL看主从架构高可用性实现

目录 1 主备延迟 1.1 主备延迟 1.2 主备延迟的来源 1.2.1 主备机性能有差距 1.2.2 备库压力大 1.2.3 大事务 1.3 主备延迟的排查思路 3)查看MySQL状态 2 主备切换策略 2.1 可靠性优先策略 2.2 可用性优先策略 2.3 常见切换技术 从进入互联网时代开始&a…

class083 动态规划中用观察优化枚举的技巧-下【算法】

class083 动态规划中用观察优化枚举的技巧-下【算法】 算法讲解083【必备】动态规划中用观察优化枚举的技巧-下 code1 1235. 规划兼职工作 // 规划兼职工作 // 你打算利用空闲时间来做兼职工作赚些零花钱,这里有n份兼职工作 // 每份工作预计从startTime[i]开始、e…

GaussDB如何创建和管理视图

GaussDB如何创建和管理视图 一、什么是视图 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的&#x…

基于ssm的“游侠”旅游信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本“游侠”旅游信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的…

自动灭火贴哪个牌子好?看懂灭火贴原理应该这么选!

随着大家安全意识的增强,无论是日常生活还是工业生产,都可以看到灭火器的踪影。但是往往在火情中,人们很难第一时间发现危险并及时扑灭,或多或少会造成财产损失,甚至影响到生命安全。近几年,自动灭火贴应运…

第十五章 React使用UI(Ant Design)框架

一、专栏介绍 😆😆 欢迎加入本专栏!本专栏将引领您快速上手React,让我们一起放弃放弃的念头,开始学习之旅吧!我们将从搭建React项目开始,逐步深入讲解最核心的hooks,以及React路由、…

【论文翻译】Learning Deep Features for Discriminative Localization

原文:Learning Deep Features for Discriminative Localization 摘要 在这项工作中,我们重新审视了文献[13]中提出的全局平均池化层,并阐明了它如何明确地使卷积神经网络具有出色的定位能力,尽管该网络是在图像级标签上进行训练的…

排序算法:【冒泡排序】、逻辑运算符not用法、解释if not tag:

注意: 1、排序:将一组无序序列,调整为有序的序列。所谓有序,就是说,要么升序要么降序。 2、列表排序:将无序列表变成有序列表。 3、列表这个类里,内置排序方法:sort( )&#xff0…