ADI Blackfin DSP处理器-BF533的开发详解13:LDF内存分配的详解(含源代码)

news2025/1/12 23:44:51

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

功能介绍

ADSP上的LDF(Linker Description Files)连接器描述文件是处理器用来进行资源分配的文件,通过对LDF文件的修改,可以分配自己需要的空间片断。通常情况下,不需要对LDF文件进行修改,通过简单指令即可使用LDF文件分配的空间,本章介绍一下如何通过LDF文件指定代码使用内存。

LDF 文件的生成

用 Visual DSP++ 软件,连接好板卡,打开要添加 LDF 文件的工程,在工程名上按鼠标右键,选择“工程选项”。

在这里插入图片描述

在弹出窗口中选择“add Startup Code/LDF”

在这里插入图片描述

选择“Add an LDF and startup code”后,在左边窗口会出现关于 LDF 的选项操作。

在这里插入图片描述

如图,把使用外部 SDRAM 选项勾上,选择与板卡 SDRAM 容量匹配的选项,ADSP-EDU-BF533 板卡的 SDRAM容量为 32MB。选好后点“确定”。

在这里插入图片描述

在弹出的选择框上选择“是”

在这里插入图片描述

在工程里会自动添加 LDF 及其相关文件

在这里插入图片描述

LDF 文件说明

使用图形打开,在 LDF 文件上进行双击鼠标左键,或者按右键在弹出菜单中按下图选择,会弹出 LDF 文件的图形界面。

在这里插入图片描述

图形界面分左右两个窗口,左边为 LDF 文件分配的空间片断的标识符。右边为 DSP 整个空间的分配地址和使用情况。从左边的标识符中可以看到 SDRAM 区域分为 sdram0,sdram0_bank1, sdram0_bank2, sdram0_bank3 等区域,如果要使用 SDRAM 的空间,就可以通过这些描述符来定义。

在这里插入图片描述

可以点击右上角放大按钮,将内存分布放大,观察当前内存使用情况。

在这里插入图片描述

使用代码打开

在 LDF 文件上按右键在弹出菜单中按下图选择,会以代码方式打开文件。

在这里插入图片描述

在代码中,可以找到如下图代码,该代码是指定 DSP 所使用空间的大小分配表,可以根据需要修改其空间分配的大小。

在这里插入图片描述

搜索“MEM_SDRAM0_BANK1”,可以找到如下代码,该代码中调用了很多库函数,来定义空间功能,最后对该空间片断做了标识符映射,其标识符为“sdram0_bank1”,通过调用该标识符,可以使用该空间。如果自己定义一个
空间片断,可以在上面的空间地址中定义一个空间片断的地址区域,注意不要使空间重复,然后复制下面的代码,建立一个自定义空间的功能描述,修改为自己定义的描述符即可。

在这里插入图片描述

在 LDF 文件定义空间时,常在空间片断描述符后面看到“ZERO_INIT”标志,该标志表示在编译代码时,将该段空间清为 0,也可以不对该空间操作,其标识符写作“NO_INIT” 将 sdram0_bank0 初始化时数据清为 0:

在这里插入图片描述

在正常使用时,原则上不建议大家来修改 LDF 的代码,以免因为 LDF 文件问题,为开发后期来带麻烦。

如何使用 LDF 文件定义的空间

要在代码中使用 LDF 文件定义的空间,可以通过“section(“ *** ”)”指令来定义,“***”代表空间片断标识符,即用图形界面打开,在左边窗口中看到的空间片断名称。

如定义一个数组“buffer[10000]”,将其放到“sdram0_bank1”的空间地址中,可以定义如下:

在这里插入图片描述

在 VDSP 软件上,打开 memory 查看窗口

在这里插入图片描述

在窗口中输入定义的数组名称,按“回车”键,找到内存中该数组定义的位置。

在这里插入图片描述

从上图中可以看到,buffer 这个数组被定义在了 0x800000 这个地址区域,通过下图可以看出,这个地址位于sdram0_bank1 的起始地址。

在这里插入图片描述

除了将一个数组定义在指定的空间片断,还可以指定一个函数,定义在指定的片断,其定义方法是在函数前面加入定义使用空间的指令。

通过 memory 查看器,可以看到在默认情况下,“Set_PLL” 函数是定义在地址 0xffa00a1c 地址,该代码断位于“L1_CODE”地址。

在这里插入图片描述

现指定“Set_PLL”函数将其放入“sdram0_bank2”空间

在这里插入图片描述

在 Visual DSP++ 软件上,如果定义的数组过大,超过了 L1 的空间,即使不使用“section”指令指定放置在SDRAM 空间,系统也会自动将该数组放置在 SDRAM 空间中,但前提是必须使用该工程生成 LDF 文件。

对于早期的 VDSP 软件版本,则没有该功能,必须指定数组放置的空间。如果该工程没有自动生成 LDF 文件,也可以拷贝其他的 LDF 文件到该工程文件夹下,然后添加到该工程中,同样可以通过“section”指令指定使用。

代码实现功能

代码实现了通过工程生成 LDF 文件,通过“section”指令定义一个数组和一个函数的空间,通过 memory 查看器查看该数组和函数定义的空间地址。运行代码,代码会将变量 i 生成的数据写入 buffer 数组内。

可以看到通“section”指令指定的数组和函数位于内存中位置的变化。

完整代码

#include <cdefBF533.h>

section(“sdram0_bank1”) unsigned char buffer[100000];

section(“sdram0_bank2”)
void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void main(void)
{
unsigned int i;

Set_PLL(16,4);
Init_EBIU();	
Init_SDRAM();
for(i=0;i<1000;i++)
	buffer[i] = i;

return 0;  	

}

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

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

相关文章

中国新能源汽车产销量居世界第一,SCM系统实现企业订单可持续高效流转

近年来&#xff0c;中国汽车产业发生了翻天覆地的变化&#xff0c;而新能源汽车正是这一巨变的中坚力量。从不足10万辆&#xff0c;到突破千万辆&#xff0c;新能源汽车在国家政策扶持下&#xff0c;产品供给不断丰富、企业创新活力竞相迸发、使用环境日臻完善以及消费者认可度…

【MOOC】数据结构-2022秋期末考试

判断题 T 解析 第一个地址为2&#xff0c;第二个地址为21&#xff0c;第三个地址为24&#xff0c;第四个为29&#xff0c;即下标为0。 T 解析 在任一有向图中&#xff0c;所有顶点的入度之和等于所有顶点的出度之和。 F 解析 应该是当且仅当该树是满二叉树 F 解析 应该是交换次…

ABAP中的类与对象(Local class )

文章目录1 Definition1.1 What is the object&#xff1f;1.2 Differentiation of classes2 Factor of class2.1 classification2.2 Class Definition3 Access area4 Create local class4.1 Define the project of class (Attributes , Method, Event)4.2 Implement method of …

【C++进阶】哈希(万字详解)—— 学习篇(上)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

成功的软件项目管理的职责和方法

软件项目管理是指项目管理的一个分支&#xff0c;专注于软件和Web项目的规划、资源分配、执行、跟踪和交付。软件开发领域的项目管理不同于经典的项目管理&#xff0c;因为软件项目有一个特殊的生命周期&#xff0c;包括多轮测试、更新和客户反馈。大多数IT项目都依赖敏捷方法来…

简介Object类+接口实例(深浅拷贝、对象数组排序)

本期目录前言一、初识Object类&#x1f351;1、toString()&#x1f351;2、hashCode()&#x1f351;3、equals()&#x1f351;4、clone()三、对象的深浅拷贝&#x1f351;1、浅拷贝&#x1f351;2、深拷贝&#x1f351;3、深浅拷贝的特点二、对象数组排序&#x1f351;1、通过C…

什么是BadUSB攻击以及如何预防

BadUSB 攻击是指 USB 设备存在内置固件漏洞&#xff0c;该漏洞允许自身伪装成人机接口设备。一旦连接到其目标计算机&#xff0c;BadUSB 就可以谨慎地执行有害命令或注入恶意负载。 一种常见的BadUSB攻击类型是橡皮鸭。它可以通过使用使用隐藏漏洞创建的闪存驱动器来执行&…

第二证券|卡塔尔给体育烧的钱,不止世界杯

11月&#xff0c;世界杯史上首次在北半球冬季打响。 全世界的目光也聚焦到了卡塔尔——这个面积仅11576平方千米、人口不足300万的中东小国。 虽然面积小&#xff0c;卡塔尔人花钱却很大方。 本届世界杯总计2200亿美元的投入&#xff0c;为历届世界杯花费之最。巴西世界杯和俄…

java基于springboot的新生宿舍管理系统-计算机毕业设计

项目介绍 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;新生宿舍管理系统当然也不能排除在外。新生宿舍管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发…

海外社媒运营,推特内容营销

Twitter 成立于 2006 年&#xff0c;已成为全球第三大用户社交平台&#xff0c;月活跃用户达 3.89 亿。推特最大的特点就是字数限制和信息短小&#xff0c;正好符合现代人的阅读习惯。 对于跨境卖家来说&#xff0c;推特不仅可以获取有价值的客户信息&#xff0c;收集粉丝反馈…

大学电子系C++模拟考试之一

随手附上一些代码&#xff0c;未必是最优解&#xff0c;仅供参考。 加密四位数 【问题描述】 输入一个四位数&#xff0c;将其加密后输出。方法是将该数每一位的数字加9&#xff0c;然后除以10取余作为该位上的新数字&#xff0c;最后将千位上的数字和十位上的数字互换&#…

7个成功的DTC品牌出海营销策略,提高海外客户的忠诚度!

关键词&#xff1a;DTC品牌出海、DTC营销、客户忠诚度 近年来&#xff0c;普通消费者关心的事情发生了巨大变化。 60% 的消费者会特意从品牌而不是第三方零售商处购买。 从大型零售商处购买再成为主流。人们希望与他们关心并感到关心的品牌建立关系。他们希望支持独立企业并找到…

Spring中IOC容器

IOC入门案例思路分析 1.管理什么&#xff08;Service和Dao&#xff09; 2.如何将管理的对象存放到IOC容器&#xff08;配置applicationContext.xml&#xff09;第二步 3.将管理的对象存放到IOC容器&#xff0c;如何获取IOC容器 第三步 4.获取到IOC容器后&#xff0c;如何从…

纷繁复杂见真章,华为云产品需求管理利器CodeArts Req解读

摘要&#xff1a;到底什么是需求&#xff1f;又该如何做好需求管理&#xff1f;本文分享自华为云社区《纷繁复杂见真章&#xff0c;华为云产品需求管理利器 CodeArts Req 解读》&#xff0c;作者&#xff1a;华为云头条 。 2022 年 8 月&#xff0c;某国国税局获得数十亿美元新…

【Keras计算机视觉OCR文字识别】文字检测算法中CTPN、CRAFT的讲解(图文解释 超详细)

觉得有帮助麻烦点赞关注收藏~~~ 一、OCR文字识别的概念 OCR&#xff08;Optical Character Recognition&#xff09;图像文字识别是人工智能的重要分支&#xff0c;赋予计算机人眼的功能&#xff0c;可以看图识字。如图6-1所示&#xff0c;图像文字识别系统流程一般分为图像采…

干掉满屏的 try-catch,这样写太香了!

背景 软件开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;就我自己来说&#xff0c;至少有一半以上的时间都是在处理各种异常情况&#xff0c;所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块&#xff0c;不仅有大量的冗余代码&#xf…

Windows系统如何部署Rabbit和启动Rabbit服务

如何部署Rabbit和启动Rabbit服务第一步&#xff1a;安装otp下载OPT应用&#xff1a;安装OPT第二部&#xff1a;安装Rabbit下载Rabbit安装Rabbit执行命令&#xff0c;添加可视化插件第三步&#xff1a;启动Rabbit服务第四步&#xff1a;在网页验证rabbit服务器启动第一步&#x…

题目给出一个字符串s1,我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树

题目给出一个字符串s1&#xff0c;我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树 下面是s1“coder”的一种二叉树的表现形式&#xff1a; 将字符串乱序的方法是&#xff1a;选择任意的非叶子节点&#xff0c;交换它的两个孩子节点。 例如&#xff1…

图扑虚拟现实解决方案,实现 VR 数智机房

如今&#xff0c;虚拟现实技术作为连接虚拟世界和现实世界的桥梁&#xff0c;正加速各领域应用形成新场景、新模式、新业态。 效果展示 图扑软件基于自研可视化引擎 HT for Web 搭建的 VR 数据中心机房&#xff0c;是将数据中心的运营搬到 VR 虚拟场景。以数据中心实际场景为…

new String 到底创建几个对象的问题困扰

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…