当前位置: 首页 > news >正文

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

文章目录

前言

背景介绍

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


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

相关文章:

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

文章目录 前言 背景介绍 Memory映射 RAM ROM 外设Register Memory分配 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见《…...

Ubuntu离线安装docker

查看操作系统版本&#xff1a; rootzyh-VMware-Virtual-Platform:~/install# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04 LTS Release: 24.04 Codename: noble rootzyh-VMware-Virtual-Platform:~/install#…...

【抓耳挠腮,还是升职加薪,一起来画架构图!】

1. 焦头烂额 最近又遇到个焦头烂额的事情 &#xff0c;老板有了新想法&#xff0c;业务有所转向&#xff0c;需要新的方案设计 &#xff0c;架构设计&#xff0c;以进行后续实施。很快&#xff0c;第一次汇报来了&#xff0c; 由于前期准备时间短&#xff0c;模块拆分不清晰&a…...

算法的学习笔记—合并两个排序的链表(牛客JZ25)

&#x1f600;前言 在算法面试中&#xff0c;链表问题是经常遇到的考点之一&#xff0c;其中合并两个排序链表是一个非常经典的问题。本文将详细介绍如何通过递归和迭代两种方式实现两个有序链表的合并。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f600;合并…...

《虚拟之旅:开启无限可能的机器世界》简介:

1.Ubonto的介绍&#xff1a; Ubuntu 是一个流行的开源操作系统&#xff0c;基于 Linux 内核。 它具有以下一些特点和优势&#xff1a; 开源免费&#xff1a;任何人都可以免费使用、修改和分发。丰富的软件库&#xff1a;通过软件包管理器可以方便地安装各种应用程序。良好的…...

centos7 服务器搭建

1. 查看 centos 版本 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)2 .查看 ip地址 ip addr sudo yum install net-tools -y 3. 是否能够上网 ping www.baidu.com ping 114.114.114.114 sudo systemctl restart network 4. DNS 更新DNS配置 编辑/etc/r…...

【Godot4自学手册】第四十五节用着色器(shader)制作水中效果

本节内容&#xff0c;主要学习利用着色器制作水波纹效果&#xff0c;效果如下&#xff1a; 一、搭建新的场景 首先我们新建场景&#xff0c;根节点选择Node2D&#xff0c;命名为Water&#xff0c;给根节点添加两个Tilemap节点&#xff0c;一个命名为Background主要用于绘制地…...

VMware Workstation Pro 安装 Ubuntu Server

这里写目录标题 VMware Workstation Pro 安装 Ubuntu Server1. 启动选项2. 系统语言3. 安装程序升级4. 键盘配置5. 安装类型6. 网卡配置7. 代理配置8. 系统镜像配置9. 硬盘配置10. 账户配置11. Ubuntu Pro 版本12. SSH 服务13. 推荐软件14. 安装成功15. 第一次重启报错16. 登录…...

智能化包括自动化与非自动化

智能化通常指的是系统或设备具备智能功能&#xff0c;以提高其自主性和效率。智能化可以分为自动化与非自动化两大类&#xff0c;每一类都有其独特的特点和应用场景。 一、自动化 自动化指的是系统能够在无需人为干预的情况下完成任务或操作。自动化系统通常依赖于预设的规则、…...

微前端架构的容器化部署:策略、实践与优势

随着微服务架构的兴起&#xff0c;微前端架构也成为现代Web应用开发的热门趋势。容器化技术&#xff0c;以其轻量级、可移植性和易于管理的特点&#xff0c;成为微前端部署的理想选择。本文将详细介绍微前端架构下应用容器化部署的策略、实践步骤以及这一方法的优势。 容器化技…...

面试题(网络、js、框架)

自我介绍 您好&#xff0c;面试官&#xff01;我叫[您的姓名]&#xff0c;非常荣幸能有机会参加这次面试。 在过去的 3 年里&#xff0c;我一直专注于前端开发领域&#xff0c;积累了丰富的实践经验。 在 Vue.js 项目中&#xff0c;我能够熟练运用组件化开发模式&#xff0c;实…...

C语言典型例题40

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目 例题3.8 运输公司对用户计算运费。路程&#xff08;以s表示&#xff0c;单位为千米&#xff09;&#xff0c;吨/千米运费越低。标准如下&#xff1a; s<250 没…...

【大模型部署及其应用 】使用 Ollama 和 Ollama WebUI 在本地运行 Llama 3

使用 Ollama 和 Ollama WebUI 在本地运行 Llama 3 目录 开始使用 Llama 3设置 Ollama WebUI访问 Ollama WebUI使用 Docker GenAI Stack 的 Llama 3骆驼 2 与 骆驼 3...

uniapp-部分文件中文乱码

一、问题 在开发时遇到&#xff0c;部分页面的中文显示乱码&#xff0c;如图 搜索了一下解决方法&#xff0c;这里记录一下 二、问题原因&#xff1a; 页面的编码格式不是 utf-8 造成的 三、解决方法 打开出现乱码页面选择编译器左上角的文件 > 以指定编码重新打开 选择U…...

Day41 | 647. 回文子串 516.最长回文子序列

语言 Java 647. 回文子串 回文子串 题目 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 思路 动规五部曲来分析 1.dp数组的含义&#x…...

全面解析Gerapy分布式部署:从环境搭建到定时任务,避开Crawlab的坑

Gerapy分布式部署 搭建远程服务器的环境 装好带docker服务的系统 Docker:容器可生成镜像&#xff0c;也可拉去镜像生成容器 示例&#xff1a;将一个环境打包上传到云端(远程服务器)&#xff0c;其他8个服务器需要这个环境直接向云端拉取镜像生成容器,进而使用该环境,比如有MYS…...

Springboot项目中使用druid实现多数据源和动态数据源,因数据库不可用导致的项目挂起的处理方案

Springboot项目中使用druid因数据库不可用导致的项目挂起的处理方案 在Spring Boot项目中使用Druid实现多数据源和动态数据源管理是一个常见的场景。通过合理的配置和错误处理机制&#xff0c;您可以有效地管理数据源&#xff0c;避免因数据库不可用而导致整个项目挂起。 1.…...

多线程 03:知识补充,静态代理与 Lambda 表达式的相关介绍,及其在多线程方面的应用

一、概述 记录时间 [2024-08-16] 前置知识&#xff1a;Java 基础篇&#xff1b;Java 面向对象 多线程 01&#xff1a;Java 多线程学习导航&#xff0c;线程简介&#xff0c;线程相关概念的整理 多线程 02&#xff1a;线程实现&#xff0c;创建线程的三种方式&#xff0c;通过多…...

机器学习中的距离概念

距离在机器学习中应用广泛&#xff0c;包括欧式距离、曼哈顿距离、内积距离和KL距离。 下面总结一下。 机器学习中的距离 欧式距离曼哈顿距离内积距离KL距离距离作为损失函数(MSE/MAE...)欧式距离与内积距离的联系☆距离的有效性 欧式距离 欧式距离&#xff08;Euclidean Dis…...

Java 如何判断map为null或者空

1.示例一 在Java中&#xff0c;如果我们想判断一个Map是否为null或者空&#xff08;即没有任何键值对&#xff09;&#xff0c;我们可以使用以下的方法。下面是一个完整的示例代码&#xff0c;展示了如何进行这样的判断&#xff1a; import java.util.HashMap; import java…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...

解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护

摘要 本文以健康管理应用为例&#xff0c;展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制&#xff0c;实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码&#xff0c;演示鸿蒙系统如何平衡功能需求与隐私安…...