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

news2024/12/25 9:02:13

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 = 0x000002
   RAMM0           	: origin = 0x0000F3, length = 0x00030D

   RAMLS0          	: origin = 0x008000, length = 0x002000
   RAMLS1      		: origin = 0x00A000, length = 0x000800
   RESET           	: 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 = 0x000800
   RAMLS6      : origin = 0x00B000, length = 0x000800
   RAMLS7      : origin = 0x00B800, length = 0x000800
   
   RAMGS0      : origin = 0x00C000, length = 0x002000
   RAMGS1      : origin = 0x00E000, length = 0x002000
   RAMGS2      : origin = 0x010000, length = 0x002000
   RAMGS3      : 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)
#endif

   ramgs0           : > RAMGS0,    PAGE = 1
   ramgs1           : > 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.coloradmin.cn/o/1312422.html

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

相关文章

【C语言初阶】什么操作符你还没搞懂?试试这篇文章让你彻底理解各种操作符!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、 算术操作符:1.1 加减乘除 二、 移位操作符:2.1 计算机中整数的存储2.2 >> 右…

arp欺骗原理以及实现方式

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

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)1、概念:什么是 JVM ?JVM 的作用? 2、JVM 的主要组成部分?类加载器(Class Loader):简单…

坚鹏:美国智库认为中国在70%战略产业里领先,美国正迅速衰落

【重榜】2023年12月13日,美国智库信息技术与创新基金会(ITIF)发布重榜报告,认为中国在70%战略产业里领先,美国正迅速衰落。美国智库ITIF认为在计算机和电子产品、化工品、机器设备、机动车、基本金属、金属制品、电气设…

linux 网络子系统 摘要

当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的M…

精细化工ERP系统是什么?精细化工ERP软件包含哪些模块

化工是比较特殊的行业,日常的生产经营活动比较繁杂,传统的手工管理模式逐渐不能满足现代化工管理需求。进入信息化时代,如何顺应现代化工市场发展,是摆在很多化工企业面前的难题。 随着行业竞争愈加激烈,各种成本的上…

Word写大论文常见问题(持续更新)

脚注横线未定格 解决方案:“视图”-“草图”,“引用”-“显示备注”-选择“脚注分隔符”,把横线前的空格删掉。

基于Java SSM框架实现抗疫医疗用品销售系统项目【项目源码+论文说明】

基于java的SSM框架实现抗疫医疗用品销售系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,抗疫医疗用品销售平台当然也不能排除在外。抗疫医疗用品销售平台是以实…

亿欧网首届“元创·灵镜”科技艺术节精彩纷呈,实在智能AI Agent智能体展现硬核科技图景

12月4日-10日,持续一周的首届“元创灵镜”科技艺术节在海南陵水香水湾拉开帷幕,虚实交互创造出的“海岛之镜”开幕式呈现出既真实又虚幻的未来感,融入前沿科技元素的艺术装置作品在“虚实之镜&自然生长”科技艺术展诠释着浪漫想象&#x…

爬虫chrome浏览器抓包说明

chrome浏览器抓包说明 目标:掌握chrome在爬虫中的使用 1. 新建隐身窗口(无痕窗口) 作用:在打开无痕窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,这样就能够尽可…

jpa 修改信息拦截

实现目标springbootJPA 哪个人,修改了哪个表的哪个字段,从什么值修改成什么值 Component // 必须加 Slf4j Configurable(autowire Autowire.BY_TYPE) public class AuditingEntityListener {// 线程变量,保存修改前的 objectprivate Thre…

PyVMomi 克隆虚拟机时将磁盘改为Thin模式

需求介绍: 之前已经使用pyvmomi库实现了虚拟机的自动备份,不过由于备份的虚拟机都是较为重要的系统,磁盘都是厚置备模式,终于有一天,备份目标的空间不够了,导致几个虚拟机无法备份。在不想增加磁盘的情况下…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 (lftp)匿名用户的一些操作(lftp {ip})ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…

Leetcode—380.O(1) 时间插入、删除和获取随机元素【中等】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—380.O(1) 时间插入、删除和获取随机元素 算法思想 实现代码 class RandomizedSet { public:vector<int> nums;unordered_map<int, int> dict;RandomizedSet() {srand((unsigned)time(NULL));}bool insert(…

如何为您的项目选择最优化的 RTLS系统方案

到 2030 年&#xff0c;实时定位市场预计将是当今市场规模的 10 倍&#xff1b;各种全球宏观经济趋势加剧了 RTLS 的指数增长&#xff0c;其中包括&#xff1a; 企业投资回报率的压力增加&#xff0c;从而扩大了对数字化、简化数据和分析的需求&#xff0c;尤其是在 COVID-19 之…

PS扣印章

1 印章区域图片 2 3 吸取印章上的颜色&#xff0c;调节容差&#xff0c;尽量小一点&#xff0c;过大会将背景也进来 4 CtrlJ 把选区复制出来&#xff0c;这个印章图层比较淡&#xff0c;可以通过多复制几个叠加或通过叠加模式来调节。 5 对几个图层选中后CtrlE合并图层 6 选…

Linux查询指定时间点段日志Linux查询指定文件

Linux服务器高效查询日志查询文件 Ⅰ、常用几种日志查询语法Ⅱ、常用几种查询语法 Ⅰ、常用几种日志查询语法 #查询某日志前xx行日志 head -n 行数 日志文件名 #查询某日志后xx行日志 tail -n 行数 日志文件名 #查询固定时间点日志&#xff08;前提是这个时间点确实有日志输出…

观测云产品更新 | 智能监控、数据访问、指标分析等优化

观测云更新 监控 > 智能监控 1、新增「智能监控」&#xff0c;您只需要在检测规则中设置好检测范围和通知对象即可快速开启监控。支持「主机监控」、「日志监控」、「应用监控」&#xff0c;每个监控包含的检测项如下&#xff1a; 智能监控器检测项主机监控CPU的突增/突降…

PyQt6 一个简单的例子

PyQt6简单例子 需求代码目录代码实现代码运行效果 需求 1、通过PyQt6实现一个小的应用程序&#xff0c;并设置应用程序的图标&#xff0c;应用程序的标题&#xff0c;然后再提示一个气泡框&#xff0c;不过显示一会就会消失不见。 代码目录 在PyQt文件夹下新建一个包&#x…