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

文章目录
前言
背景介绍
C28x内核
浮点单元(FPU)
快速整数除法单元(FINTDIV)
三角数学单元(TMU)
VCRC单元
CPU总线
指令流水线
总结
参考资料
前言
见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》
见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》
背景介绍
C28x CPU是一个32位的定点处理器,该器件借鉴了DSP的最佳特性、精简指令集计算(RISC)、MCU架构、固件和工具集。其在TI C2000 DSP芯片的整体架构中,所处的位置如下:

C28x内核
C28x CPU使用改进后Harvard架构和循环寻址。改进后的Harvard架构使指令和数据获取能够并行执行。CPU可以在读取指令和数据时,同时写入数据,以在整个流水线中保持单周期指令操作。CPU通过六条独立的地址/数据总线完成此操作。RISC特性包括:指令单周期执行、寄存器到寄存器操作和改进后的Harvard架构。MCU特性包括:通过直观的指令集、字节打包和解包以及位操作来实现易用性。C28x CPU的的组成结构如下:

CPU Block用于程序存储器寻址、提取数据;解码和执行指令(8级流水线);执行算术、逻辑和移位运算;以及控制CPU寄存器、数据存储器和程序存储器之间的数据传输。
Emulation logic Block用于监测和控制DSP的各种部件和功能,用于芯片Debug和Test。
Signals Block用于与提供一个CPU对外的接口,连接到memory、外围设备,对CPU和Emulation logic进行计时和控制,显示CPU和仿真逻辑状态,以及interrupts的应用。
浮点单元(FPU)
C28x通过增加浮点处理器(FPU)——支持IEEE单精度浮点运算的寄存器和指令,来扩展C28x原本定点CPU的功能。C28x+FPU,包含标准C28x寄存器集以及一组额外的浮点单元寄存器。额外的浮点单元寄存器如下:
• 八个浮点Result寄存器,RnH(其中n=0~7)
• 浮点Status寄存器(STF)
• 重复Block寄存器(RB)
Tips:除RB寄存器外,所有浮点寄存器都采用shadowed技术。这种影子化技术可用于更高优先级任务的中断,以实现浮点寄存器的快速上下文保存和恢复。
快速整数除法单元(FINTDIV)
C28x CPU的快速整数除法单元(Fast Integer Division, FINTDIV)独特地支持三种类型的整数除法(Truncated, Modulo, and Euclidean),这些整数除法具有不同的数据类型大小(16/16、32/16、32/32、64/32、64/64),采用无符号或有符号格式。
• C语言天然支持Truncated整数除法(/、% 算符)。
• Modulo除法和Euclidean除法是更高效的控制算法,并受C内在函数支持。
所有三种类型的整数除法都会产生商和余数分量,具有可截断特性,并在最少的系统周期内执行(32/32除法为10个周期)。此外,C28x CPU的快速除法功能,独特地支持浮点32位(5个周期内)和64位(20个周期内)除法的快速执行,。
三角数学单元(TMU)
三角函数加速器(trigonometric math unit, TMU),利用现有的C28x+FPU增加指令,加速执行常见三角函数和下表中所列的算术运算,以此来扩展C28x+FPU的功能。

TMU已添加指数指令IEXP2F32和对数指令LOG2F32,可支持计算浮点幂函数,用于C2000 Digital Control Library中的非线性比例积分微分控制(NLPID)组件。添加的这两条指令,可以将幂函数计算周期,从使用library emulation时的典型300个周期减少到不到10个周期。
Tips:TMU对现有指令、流水线和内存总线架构均未做任何更改。所有TMU指令都使用现有的FPU寄存器集(R0H至R7H)来执行运算。
VCRC单元
循环冗余校验(CRC)算法提供了一种简单的方法来验证大型数据块、通信数据包或代码段的数据完整性。C28x+VCRC可执行8 位、16位、24位和32位的CRC。例如,VCRC可以在10个系统周期内计算出10字节数据块的CRC。CRC Result寄存器包含当前CRC,每次执行CRC指令时,该CRC都会更新。
以下是VCRC的CRC计算逻辑使用的CRC多项式:
• CRC8 多项式 = 0x07
• CRC16 多项式1 = 0x8005
• CRC16 多项式2 = 0x1021
• CRC24 多项式 = 0x5d6dcb
• CRC32 多项式1 = 0x04c11db7
• CRC32 多项式2 = 0x1edc6f41
该模块可以在单个周期内为一个字节的数据计算CRC。CRC8、CRC16、CRC24和CRC32的CRC计算,是按字节完成的(而不是C28x内核计算CRC时读取完整的16位或32位数据),以便与各种标准规定的按字节计算要求保持一致。
VCRC单元还允许用户提供自己多项式(1b-32b)来满足自定义CRC要求。使用自定义多项式时,CRC执行时间会增加到三个系统周期。
CPU总线
CPU最大的作用就是寻址和读写数据。寻址就是ARAU(Address register arithmetic unit)要干的事情,即在Memory(包括RAM、ROM和寄存器)中找到当前想用的Address,比如program space(program counter PC指针)、data space和register space中的某个地址。读写数据就是在这个Address上提取Bytes或者放入Bytes。这些操作都需要通过CPU总线来完成,如下图所示:

Address总线是传输Address的,比如program space的22bit address,data space的32bit address,register space的映射地址。
Data总线是传输Bytes的,比如program space的程序指令,data space的变量值,register space的寄存器值。
C28x的6条独立CPU总线,互相之间的工作关系,如下表所示:

Tips:上述6条总线是独立的,所以可以同时运行,互不影响。但是PAB和DWDB这两个总线是复用的,比如Read program和Write program这两件事都需要用PAB总线,那么这两件事就不能同时执行,需要先执行一个然后再执行另一个。DWDB也同理。
指令流水线
C28x每条指令的执行都要经过8个独立的阶段,形成一个指令流水线(pipeline)。在任何时刻,最多可以有8条指令处于运行状态,这8条指令都处于不同的运行阶段。如下图所示:

Fetch 1 (F1):从Memory抓取指令的第一步,CPU在program address bus上发出指令所在的地址(22-bit);
Fetch 2 (F2):从Memory抓取指令的第二步,CPU在program read data bus上获取指令内容(32-bit);
Decode 1 (D1):指令解码第一步,识别和判定指令是否合法;
Decode 2 (D2):指令解码第二步,加载到指令寄存器中,完成解码;
Read 1 (R1):从Memory抓取Bytes的第一步,CPU在data read address bus上发出Bytes所在的地址(32-bit);
Read 2 (R2):从Memory抓取Bytes的第二步,CPU在data read data bus上获取Bytes内容(32-bit);
Execute (E):运行指令,CPU运行各种原始的multiplier、shifter、logic和ALU操作,把运算结果写入CPU的result寄存区;
Write (W):向Memory中写入Bytes,CPU在data write address bus上发出Bytes所在的地址(32-bit),在data write data bus上发出Bytes内容(32-bit)。
Tip1:指令不同阶段的读写可能会对同一位置进行操作,但流水线的保护机制会根据需要暂停某些指令,以确保对同一位置的读写按照编程顺序正确进行。
Tip2:一旦指令到达Decode 2阶段,即使有中断发生,也会先把这条指令运行到最后阶段完成。
Tip3:不同的指令会有不一样的执行过程,上述8个运行阶段不是一定都要运行,有的指令只需要运行其中的几个。
总结
以上就是本人在研发中使用嵌入式处理器的C28x内核时,一些个人理解和分析的总结,主要介绍了C28x内核的工作原理,展示了具体的使用方法,并对比分析了它的特点和适用场景。
后续还会分享另外几个最近解锁的嵌入式处理器新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。
另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。
参考资料
TMS320F28003x Real-Time Microcontrollers datasheet.pdf
版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

相关文章:
【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核
文章目录 前言 背景介绍 C28x内核 浮点单元(FPU) 快速整数除法单元(FINTDIV) 三角数学单元(TMU) VCRC单元 CPU总线 指令流水线 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解…...
LeetCode.27.移除元素
题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以…...
redis面试(十二)可重入锁总结
可重入锁总结 从实现原理以及源码的层面,真正剖析和了解到了redis分布式锁的企业级的实现,这个分布式锁实现的还是非常漂亮的,麻雀虽小,五脏俱全,分布式的可重入锁,总结一下流程 (1࿰…...
软件测试知识点3
063、一份测试计划应该包括哪些内容? 背景、项目简介、目的、测试范围、测试策略、人员分工、资源要求、进度计划、参考文档、常用术语、提交文档、风险分析。 065、如何定位测试用例的作用? 组织性:编写、组织性、功能覆盖、重复性、跟踪、测试确认 066、什么…...
WPF Treeview开启虚拟化后如何找到TreeViewItem
用VirtualizingStackPanel的BringIndexIntoViewPublic方法就好,没必要像微软给的例子那样还要继承一个VirtualizingStackPanel /// <summary> /// Recursively search for an item in this subtree. /// </summary> /// <param name"container…...
给python初学者的一些建议
写在开篇 关于Python,可以这么说,这几年借着数据科学、机器学习与人工智能的东风,Python 老树开新花,在风口浪尖上居高不下。 Python 之所以这么受大家的青睐,是因为它语言简洁,上手容易,让非…...
【Python学习手册(第四版)】学习笔记17-作用域
个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文介绍Python作用域,介绍了变量名解析的LEGB原则,以及内置作用域,全局作用域global语句,嵌套作用域及nonlocal语…...
大语言模型(LLM)文本预处理实战
大语言模型(LLM)文本预处理实战 文章目录 大语言模型(LLM)文本预处理实战2.1 理解词嵌入2.2 文本分词2.3 将 token 转换为 token ID2.4 添加特殊上下文 token2.5 字节对编码 (BytePair Encoding, BPE)2.6 使用滑动窗口进行数据采样…...
宠物健康新守护:智能听诊器的家庭应用
宠物已成为我们情感的寄托和生活的一部分,为宠物的健康守护带来了科技的温度。 科技与关怀结合 这款智能听诊器,以其科技感和关怀精神,为宠物的健康监测提供了全新的视角。 家庭友好设计:考虑到家庭使用环境,智能听…...
六、go函数
函数在任何语言中并不难理解,但是不论是有几年开发经验的人,真正想要写好一个函数并不是那么容易的 1、go语言中函数结构 func main() {fmt.Println(isEven(2)) } func isEven(x int) bool {return x%2 0 }(这里我写了一个简单的判断是否是…...
高原型垂直起降高速无人机技术详解
1. 技术概述 高原型垂直起降高速无人机(High-Altitude Vertical Take-off and Landing High-Speed Unmanned Aerial Vehicle, HAVTHS UAV)是针对高原复杂环境设计的一种先进无人机系统。它结合了垂直起降的灵活性与高速飞行的能力,能够克服高…...
Selenium + Python 自动化测试10(unittest概念)
我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上几篇我们讨论了元素的定位方法、操作方法以及一些特殊元素的操作。 在实际的测试项目组中每个模块会写多条案例,如第一条用例那里我们的登录。登录的话就可以有多…...
大数据-67 Kafka 高级特性 分区 分配策略 Ranger、RoundRobin、Sticky、自定义分区器
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
深度学习与图像修复:ADetailer插件在Stable Diffusion中的应用
文章目录 引言ADetailer插件介绍插件安装常用模型控制提示词参数配置参数详解 实践建议 示例插件的对比:1. ADetailer插件2. Photoshop插件(如Nik Collection)3. GIMP插件(如GMIC)4. Affinity Photo插件 结语 引言 无…...
【Pytorch】topk函数
topk 是 PyTorch 中的一个函数,用于从张量中选取最大(或最小)的 k 个元素及其对应的索引。其定义如下: values, indices torch.topk(input, k, dimNone, largestTrue, sortedTrue, *, outNone)参数说明 input (Tensor): 输入张…...
使用mybatis注解和xml映射执行javaWeb中增删改查等操作
Mapper接口 使用注解执行SQL语句操作和相应的Java抽象类(对于简单的增删改查使用注解) Mapper public interface EmpMapper {// 根据id删除员工信息Delete("delete from mybatis.emp where id#{id}")public int EmpDelete(Integer id);// 查…...
SpringBoot3 响应式编程
Spring Boot 3 中的响应式编程是一个重要的特性,它允许开发者构建非阻塞、异步和基于事件的应用程序,这对于处理高并发和实时数据流的应用场景尤为重要。以下是对Spring Boot 3响应式编程的详细解析: 一、响应式编程概述 响应式编程是一种编…...
【C++ 面试 - 基础题】每日 3 题(二)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
Modelica建模,Modelica语言的学习,技术调研工作
Modelica建模,Modelica语言的学习,技术调研工作 参考资料: 苏州同元软控信息技术有限公司 - 同元 Modelica 再探冷却 modelica学习-CSDN博客 1、 Modelica简介 Modelica是由Modelica协会维护、免费开放的物理系统面向对象的统一建模语言规…...
Oracle数据字典之——v$lock 和v$locked_object
v$lock视图 v$lock视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下: 11g如下: 字段名称类型说明ADDRRAW(8)锁定状态对象的地址KADDRRAW(8)锁的地址SIDNUMBER会话(SESSION)标识;TYPE…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
