【研发日记】嵌入式处理器技能解锁(四)——TI C2000 DSP的Memory

news2024/12/26 6:21:55

文章目录

前言

背景介绍

Memory映射

RAM

ROM

外设Register

Memory分配

应用实例

总结

参考资料


前言

        见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》

        见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》

        见《【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核》

背景介绍

        本文要讲的Memory是TI C2000 DSP的片上存储器。其在芯片的整体架构中,所处的位置如下:

        Tips:除了上图中的ROM和RAM,另外的外设寄存器从广义的角度讲也是Memory的一部分。

Memory映射

        存储器映射表,描述了存储器中各个组成部分的地址,用于读写寻址,如下图所示:

RAM

        TI C2000 DSP的RAM由三个部分组成:Mx RAM、LSx RAM和GSx RAM。

        M0 RAM和M1 RAM,总计4KB,是两个具有专用功能的RAM模块,与CPU紧密耦合,只有CPU可以访问,软件开发人员一般不用关注。

        LS0-7 RAM,总计32KB,是本地共享RAM(Local shared RAM),CPU、CLA和BGCRC可访问,可以用作软件的堆栈等通用功能,需要软件开发人员关注。

        GS0-3 RAM,总计32KB,是全局共享RAM(Global shared RAM),除了CPU、CLA和BGCRC可访问,另外HIC和DMA也都具有对这些存储器的完全读写访问权限,比LSx RAM具有更广泛的用途,可供软件开发人员更灵活地使用。

        Tips:另外的几种消息RAM是特定模块的专用RAM,在对应功能启用时用于共享数据。

ROM

        TI C2000 DSP的ROM也是由三个部分组成:Boot Rom、Secure Rom和Flash Bankx。

        Boot Rom,总计64KB,里边中存放着芯片厂家制定的一些代码,芯片每次复位后都要先执行这里的代码,然后才开始执行软件开发人员编译的代码。Boot ROM中代码的功能是芯片层面的初始化(不是main函数中的初始化),去执行一些类似于clear RAM这样的任务,软件开发人员只需要知道这部分的存在即可,一般不需要特别关注。

        Secure Rom,总计48KB,是一些具有更高权限的存储区域,CPU和外设通过常规的方式无法对其读写,需要使用特殊的API和Password才能访问。Secure ROM中是芯片厂家为用户提供的特定功能(function),如果没有启用这些功能,一般也不需要关注。

        Flash Bank 0-2,总计3*128KB。其中每个组(Bank)又由16个扇区(Selector)组成,总计16*8KB。每个扇区(Selector)又由64个页(Page)组成,总计64*128Byte。是通用型存储空间,可以存放软件开发人员的Code和Bytes。在程序运行时,CPU可以直接在上面寻址并抓取指令和Bytes。

        Tips:另外还有一种OTP(one-time programmable) ROM,它只能写入一次,不能擦除。一般用于存放芯片ID或者ECU ID,以及一些Configure和其他出厂信息。

外设Register

        外设(Peripheral)寄存器是DSP各个外设子系统(例如ADC)的存储单元,其特点时固定地址存储固定数据。DSP的外设子系统非常多,功能各不相同。每个外设也都有很多寄存器,主要用于Configure外设的模式和反馈外设的Status/Result。外设ADC(Analog to Digital Converter)的部分寄存器,示例如下:

        Tips:外设寄存器的用法与各个外设的功能高度相关,后面用到哪个外设时再针对性研究。

Memory分配

        软件开发人员在使用TI C2000 DSP芯片时,Memory主要被分配成如下几个部分:

        Stack(栈):包含临时创建的局部变量、函数调用入口的参数、函数返回值、const修饰的局部常量。

        Heap(堆):用于存放程序运行中被软件开发人员动态分布的内存段,可增可减,一般用malloc等函数实现动态分布内存。用malloc函数分布的内存,必须用free进行内存释放,否则会造成Memory溢出。

        Global/Static:这两种变量都具有穿越代码运行周期的能力(只是作用范围不同),所以需要在Memory中分配固定的地址

        Zi-data:表示未初始化赋值(Zero initialized)的全局变量和Static修饰的变量,它是直接在RAM中分配一个固定地址

        Code(Instruction):字面指软件开发人员写的代码,但是在Memory中已经是编译后的东西,它被划分为指令和数据两部分,上图中的Code准确讲应该叫指令(Instruction)。

        Ro-data:字面指只能读取的数据,即程序中定义的常量,例如#define 宏定义、用const修饰过变量等。这些常量是一直在ROM中的,芯片运行起来后CPU直接从ROM中读取。

        Rw-data:字面指可读可写的数据,它实际上包括了堆、栈和全局变量等。这些数据又分为已被初始化赋值的和未被初始化赋值的。但是在Memory分配图中为了便于描述,把Rw-data理解为已被初始化的即可。ROM中的Rw-data从烧录文件中而来,在Memory中是固定地址和固定Value的。芯片启动时会被移到RAM中使用,芯片运行起来之后Rw-data就是动态变化的了,堆栈的地址和Value都会实时变化,Global/Static只有Value会变化

应用实例

        这里展示一个示例Demo代码,直接用代码中的注释进行说明。

Demo.c File
#include <xxxx.h>
uint16 Val1 = 1;	//Val1是Global变量,并且已经初始化了,在RAM的Rw-data区域有一个固定地址。但是为了芯片下电时不丢失,所以在ROM的Rw-data区域中也有一个地址来存放。Val1在ROM中的Value一直都是1,但是在RAM中的Value会随着代码的运行而变化。
static uint16 Val2 = 2;	// Val2也是已初始化的Static变量,跟Val1的Memory分配是一样的Rw-data区域。这里的static修饰代表它的作用范围有限。
uint16 Val3;	//Val3也是Global变量,但是未初始化,所以分配在RAM中Zi-data区域的一个固定地址。
const uint16 Val4 = 4;	//Val4被const修饰了,是一个常量,分配在ROM的Ro-data区域。

uint16 DemoFcn(uint16 Num)	//Num是函数入口的参数,分配在Stack区域
{
	uint16 Var5 = 5;	//Var5是局部变量,只在DemoFcn()函数调用时临时使用,所以分配在RAM Stack区域的一个随机地址,DemoFcn()函数退出时就会把这个Memory释放掉。因为Var5有一个初始值,所以在ROM栈区也会分配一个空间。
	static uint16 Var6 = 6;	// Var6被static修饰,代表它的Value要穿越芯片运行周期,即下一次读取Var6时,它前一次写入的值仍能被读到,所以它被非标配在RAM中Rw-data区域的固定地址上。
    const uint16 Var7 = 7;  // Var7被const修饰,所以是常量,但是它只在DemoFcn()函数中短暂使用,所以是局部常量,被分配在RAM中Rw-data的Stack区域。
	void *p;
	p = malloc(8); //动态分配一个size 8的Memory,p是这片Memory区域的起始地址,它是分配在RAM Heap区域的一个随机地址。
	*p = 1;	//使用这片区域
	*(p+1) = 2;	//使用这片区域
	free(p); 	//释放这片区域
    return (Num+*p);	//函数的返回值存放在RAM Stack区域
}
 
void main()
{
	uint16 Var8 = 0;	//Var8是局部变量,分配在RAM Stack区域的一个随机地址。
	Var8 = DemoFcn (9);	//存放在RAM Stack区域的函数返回值,赋给Var8。
}

        Tips:除了上述的Data,还有内部的赋值、加法等运算,会被编译常指令(Instruction),然后分配在ROM的Code区域

总结

        以上就是本人在研发中使用嵌入式处理器Memory时,一些个人理解和分析的总结,主要介绍了TI C2000 DSP Memory的工作原理,展示了具体的使用方法,并对比分析了它的特点和适用场景。

        后续还会分享另外几个最近解锁的嵌入式处理器新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。

参考资料

        TMS320F28003x Real-Time Microcontrollers datasheet.pdf


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

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

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

相关文章

在线excel/csv转json数据

具体请访问&#xff1a;在线Csv/Excel(xls/xlsx)转Json格式工具

编程语言进化史

编程语言多到你想象不到。 图片来自: 程序设计语言概念 发展历史 自从1946年冯诺依曼原理被提出&#xff0c;计算机数据和指令是通过二进制形式以及后来的汇编语言(二进制助记符)&#xff0c;但依然没有改变容易出错的本质。1951年Rutishauser提出的用编译程序实现高级语言的思…

开放平台: 签名密钥、回调地址、ip白名单管理。

文章目录 引言I 渠道信息管理(签名密钥)表设计渠道信息管理服务商API配置导出II 签名校验兼容图片上传接口验签规则方案2III 工具类开放平台字典服务接口txt文件的下载see also引言 需求: 提供给下游的开放平台,需要对接口做签名密钥、回调地址、ip白名单管理。 涉及的功…

JS实现一键点击按钮复制文本

JS实现一键点击按钮复制文本 背景描述JS代码实现 背景描述 现在有这样一个需求&#xff0c;想要在页面实现点击按钮&#xff0c;一键复制指定列表字段内容的操作&#xff0c;就像这样的效果 复制成功之后的内容在Notepad 粘贴可以看到 正式列表中链接地址字段的内容&#xf…

【学习笔记】Day 15

一、进度概述 1、《地震勘探原理》第八、九章 二、详情 对于第八章&#xff0c;主要讨论地震资料岩性解释的基本方法&#xff0c;对于利用地震信息进行储层的物性预测于解释、储层的含油性分析与解释、地震地层学解释、层序地层学解释、地球物理资料综合解释等内容。 第五、六…

【图解秒杀系列】秒杀技术点——静态化

【图解秒杀系列】秒杀技术点——静态化 什么是静态化、静态化的作用如何实现静态化FreeMarker、Thymleaf处理流程问题 OpenResty Lualua_shared_dict & lua-resty-template处理流程具体操作 什么是静态化、静态化的作用 静态化就是指通过某种静态化技术&#xff0c;将原本…

【动态规划、dp】P1091 [NOIP2004 提高组] 合唱队形 题解

题意 n n n 位同学站成一排&#xff0c;音乐老师要请其中的 n − k n−k n−k 位同学出列&#xff0c;使得剩下的 k k k 位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设 k k k 位同学从左到右依次编号为 1 , 2 , … , k 1,2, …,k 1,2,…,k&#xff0c;他…

Qt-创建第一个Qt项目(3)

目录 新建项目 设置路径 选择构建工具 父类的选择 各个父类的介绍 国际化相关的选项 选择SDK Summary选择 项目初见 新建项目 这一点和在VS里面是一样的&#xff0c;我们首先都得创建一个项目出来 进去之后就是选择项目模板了 我们使用默认的就行了&#xff0c;左边…

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评

Q&#xff1a;顺丰科技2025届校园招聘面向对象是&#xff1f; A&#xff1a;2025届应届毕业生&#xff0c;毕业时间段为2024年10月1日至2025年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘&#xff09;。 Q&#xff1a;我可以投递几个岗…

涉密载体管控系统DW-S402|实现载体管控新模式

涉密载体管控系统DW-S402是用于对各种涉密载体进行有效管理的智能柜&#xff08;智能管理系统&#xff09;&#xff0c;基于物联网技术实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 载体管控软件对涉密…

可用性检查和短缺部件检查

可用性检查 可用性检查有两种类型&#xff1a; “库存管理”中库存类型的可用性检查&#xff08;静态可用性检查&#xff09;从“物料需求计划”的角度检查可用库存&#xff08;动态可用性检查&#xff09; 库存类型的可用性检查&#xff08;静态可用性检查&#xff09; 此项…

全面解析ETL:数据仓库架构中的关键处理过程

目录 一、数据仓库架构中的ETL 二、数据抽取 &#xff08;1&#xff09;逻辑抽取 &#xff08;2&#xff09;物理抽取 &#xff08;3&#xff09;变化数据捕获 三、数据转换 四、数据装载 &#xff08;1&#xff09;提高装载效率 &#xff08;2&#xff09;处理装载失败 五、ET…

MacOS 下运行 GPT-SoVITS

系统环境&#xff1a; # 安装 ffmpeg brew install ffmpeg # 查看版本 ffmpeg -version # 拉取项目代码 git clone --depth1 https://github.com/RVC-Boss/GPT-SoVITS cd GPT-SoVITS # 安装好 Miniconda 之后&#xff0c;先创建一个虚拟环境&#xff1a; conda create -n GPT…

关于Qt的系统总结

查看详情http://100bcw.com/qt6.htm 编译环境与开发流程 开发QT有两种IDE可以使用,一种是使用 VS + Qt 的插件,另一种就是使用QtCreator工具。前一种是微软的工具,用的都比较多容易上手,缺点是信号槽的支持不太好,需要手写,不能自动生成,另外可能有中文编码的问题。后一…

PSINS工具箱函数介绍——trjfile

文章目录 关于工具箱使用方法运行代码运行方法运行结果输出数据的解释 源代码 关于工具箱 trjfile是导入轨迹数据的函数&#xff0c;在文件夹"psins \base\io"里面&#xff0c;用于导入轨迹相关的mat文件。 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲…

Centos7.9 Kickstart自动应答,无人值守安装

有时候安装一两台服务器是轻松的事&#xff0c;但是如果要安装2&#xff0c;3百台的时候那就不是很轻松了&#xff0c;这时候无人值守的操作系统安装就变得非常重要。通过网络自动安装是非常方便而且快捷的。 先关闭防火墙吧 systemctl stop firewalld systemctl disable fire…

安卓蓝牙日志的获取方法

有过蓝牙调试经历的同学们可能都知道&#xff0c;在安卓系统中&#xff0c;在手机的设置–>开发人员页面下有一个开启蓝牙HCI信息收集日志选项开关&#xff0c;如下图中标红处&#xff0c; 打开该开关&#xff0c;就可以收集本机发送和接收的蓝牙HCI包。蓝牙包的数据会保存在…

Java算法解析一:二分算法及其衍生出来的问题

这个算法的前提是&#xff0c;数组是升序排列的 算法描述&#xff1a; i和j是指针可以表示查找范围 m为中间值 当目标值targat比m大时&#xff0c;设置查找范围在m右边&#xff1a;i m-1 当目标值targat比m小时&#xff0c;设置查找范围在m左边&#xff1a;j m1 当targat的…

苹果手机垃圾清理:释放存储空间的终极指南

随着iPhone成为我们日常生活的重要组成部分&#xff0c;我们越来越多地依赖它来处理个人和工作相关的事务。然而&#xff0c;长时间的使用会让iPhone积累大量不必要的数据和文件&#xff0c;这些所谓的“手机垃圾”不仅占用了宝贵的存储空间&#xff0c;还可能影响设备的性能。…

【Vite】模块热替换 HMR

概述 Vite 提供了一套原生 ESM 的 HMR API。 具有 HMR 功能的框架可以利用该 API 提供即时、准确的更新&#xff0c;而无需重新加载页面或清除应用程序状态。当通过 create-vite 创建应用程序时&#xff0c;所选模板已经预先配置了相关的集成。 HMR API Vite 通过特殊的 imp…