【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录

前言

背景介绍

中断框架

外设中断

ePIE模块

CPU中断

中断嵌套

应用实例

总结

参考资料


前言

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

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

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

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

背景介绍

        本文要讲的中断系统是TI C2000 DSP的一种多任务处理机制。其在整体软件架构中发挥的作用如下图所示:

        Tips:中断任务调度不同于User软件调度,这里是芯片硬件层面的机制,切换速度快到系统时钟周期的级别。

中断框架

        TI C2000 DSP的中断路径分为三级外设、ePIE和CPU,如下图所示:

        C28x CPU有14条对外中断line,其中前12条(INT1到INT12)通过ePIE(增强型外设中断扩展)模块连接到各种外设中断,最后两条(INT13和INT14)直接连到Timer1和Timer2。

        ePIE有多达16*12个对外的中断Channel,每16个Channel组成一个Group,总共12个Group。每个Group的16Channel个由一个Mux(多路复用)连接到CPU的1条对外中断line。

        每个外设中一般都有多个中断,例如INT_ADCA1(ADC的A模块的通道1中断)、INT_ADCA2(ADC的A模块的通道2中断)等等,每个中断都连接到ePIE对外的中断Channel。每个中断也都对应一个ISR(中断服务程序),两种通过Vector Table(中断向量表)映射在一起。如下图所示:

        TI C2000 DSP的这种三级中断架构设计,使得CPU能够处理大量的外设中断。每一级都有其自身的使能和标志寄存器,这些寄存器的灵活配置,可以允许CPU处理一个中断ISR时让其他中断挂起,或者让其他中断的ISR嵌套在当前ISR中间。前者可以用于某些关键ISR期间禁用Other中断,后者可以用在软件修改中断的硬件优先级

外设中断

        TI C2000 DSP的外设子系统非常多,功能各不相同。每个外设也都有多个中断,主要用于调度跟本外设相关的任务。例如,外设SCI(serial communication interface)的中断系统,可以用于提取/填充FIFO、处理通信故障等,SCI的几个接收中断如下图所示:

        Tips:在ePIE的Vector Table中可以看到单个SCI通道的RX中断只有一个,例如ITN9.1的SCIA_RX中断,但是上面的框图中SCI接收的相关中断有那么多,这就是外设级的Mux(多路复用)在发挥作用。每条中断Line上都有Enable和Flag寄存器,当ITN9.1的SCIA_RX传递到CPU中的ISR时,再读取相应的Flag寄存器就可以判断具体是什么中断,然后再switch到子代码中。

ePIE模块

        TI C2000 DSP的ePIE模块为每个外围中断信号提供了一个通道,每个通道上都有单独的Flag位和Enable位寄存器,如下图所示:

        ePIE模块的这些通道根据相关的CPU中断进行分组,每个组内的16个通道组成一个16位Enable寄存器(PIEIERx)、一个16位Flag寄存器(PIEIFRx)和一个ACK寄存器(PIEACKx)。PIEACKx寄存器位充当该组的公共中断掩码。

        当外设中有多个中断同时发生,或者ePIE中挂着多个中断时,Mux模块就会去仲裁出优先级highest(通道号lowest)的送到CPU。当CPU接收到中断时,还要从ePIE的Vector Table中获取对应ISR的地址。

        ePIE模块中的优先级仲裁就是一个比大小的过程,也是芯片硬件层面的一个行为机制,User Code在这个阶段干涉不了优先级仲裁的结果。而且TI C2000 DSP的一百多个外设中断,每一个的优先级位置都是在芯片硬件层面定义好的,第一组和第二组的32个中断,优先级示例如下:

CPU中断

        CPU中断与ePIE模块一样,也是为每条连接到CPU的中断Line提供Flag位和Enable位寄存器,如下图所示:

        CPU中断涉及的有一个Enable寄存器(IER)和一个Flag寄存器(IFR),这两个寄存器都是CPU内部寄存器。此外还有一个全局中断掩码(INTM),位于ST1寄存器,可以使用CPU的EINT指令(Clear INTM掩码,置为0,允许全局中断)和DINT指令(Set INTM掩码,置为1,禁止全局中断)进行配置。

        中断传播到CPU Interrupt Logic模块时,CPU要做的事情包括四部分:

        1、自动将IFR和IER置为0,将INTM置为1,这是芯片硬件层面的动作机制,目的是阻止再有中断进来。对于中断嵌套的应用后面再讲。

        2、保存现场,把堆栈和PC指针中的数据都保存起来。

        3、从Vector Table中抓取相应ISR的地址,执行中断服务程序。

        4、等ISR 执行Complete后,再回到前面保存的程序现场,回到主程序,并把各级中断Enable。

        当CPU阶段有多个中断同时发生,IFR寄存器中挂着多个中断时,Mux模块就会去仲裁出优先级highes的送到CPU Interrupt Logic模块。这里的优先级仲裁也是一个比大小的过程(芯片硬件层面的一个行为机制),但是不同于ePIM中的编号那么规则。在CPU阶段总共有32个中断,每一个的优先级位置也都是在芯片硬件层面定义好的,如下图所示:

        Tips:上图中的系统中断比较特殊,User能设计开发的空间很小,只需了解即可,无需过多关注。

中断嵌套

        默认情况下,TI C2000 DSP芯片内部的硬件机制是不对中断进行嵌套。也就是前文所讲述的,所有的中断都按照TI在芯片硬件层面设定好的优先级进行仲裁,等着高优先级的ISR先执行完,然后再执行低优先级的ISR。如果低优先级的ISR已经在执行过程中,高优先级的中断来了也要等前面的ISR执行完。这种方式是最保守,也最安全的一种应用方式

        但是在一些应用场景中,就是要求高优先级的ISR无条件地优先执行,甚至User需要改变TI在芯片硬件中定义的优先级顺序,重新设计一套Software优先级,这时候就需要用到中断嵌套了。例如,User设计的软件中用到INT1.5和INT2.4两个中断,要求INT2.4的优先级最高,无条件地优先执行,示例如下:

        上图中断的Software优先级设计和中断嵌套是User Code通过控制IER和PIEIERx等寄存器来实现的,具体过程如下图所示:

        1、开中断,User Code把INT1.5和INT2.4两条线路上的使能寄存器都Enable,用不到的线路都Disable;

        2、外设中断事件A发生,中断信号被PIEIFR1.5寄存器捕捉到;

        3、中断信号穿过PIEIER1.5之后,芯片硬件机制自动把PIEIER1.5 Disable;

        4、中断信号穿过PIEACK.1之后,芯片硬件机制自动把PIEACK.1 Disable;

        5、中断信号穿过INTM之后,芯片硬件机制自动把INTM Disable;

        6、中断信号到达CPU Interrupt Logic后,从Vector Table中抓取INT1.5的ISR的地址,开始执行该ISR;

        7 、User在INT1.5 ISR头部写入的Code重新把INTM Enable,以此保证INT2.4的中断线路是通畅的;

        8、INT1.5的ISR执行过程中,外设中断事件B发生了,中断信号一路传播到CPU Interrupt Logic(同步骤2、3、4、5);

        9、CPU暂停执行INT1.5的ISR,转去执行INT2.4的ISR

        10、INT2.4的ISR执行完后,返回继续执行INT1.5 ISR的后半段;

        11、两个ISR都执行完后,返回主程序继续执行。

应用实例

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


// C28x ISR Code	// 
// Enable nested interrupts	// 
// INT2.2的Software优先级Highest,无条件插入INT2.1的ISR中	//void EPWM1_TZINT_ISR(void)	//INT2.1的ISR
{uint16_t TempPIEIER;TempPIEIER = PieCtrlRegs.PIEIER2.all; // Save PIEIER register for later//*****到这,所有中断线路都被芯片硬件机制自动Disable了,需要如下代码把INT2.2的中断线路打通*****////允许Group2的中断进CPU(IER是1使能)IER |= 0x002;	//Group2置1,其他Group保持不变;      IER &= 0x002;	//Group2不变,其他Group置0;//最终效果:只有Group2传播途径的通畅的;//允许INT2.2中断(PIEIER是1使能)PieCtrlRegs.PIEIER2.all |= 0x0002;	//INT2.2置1,其他Channel保持不变;PieCtrlRegs.PIEIER2.all &= 0x0002;  //INT2.2,其他Channel置0;//最终效果:只有2.2的传播途径的通畅的//这里手动再把它置1(PIEACK是0使能)PieCtrlRegs.PIEACK.all &= ~(0x002);  // Enable PIE Group2 interrupts//等流水线上的指令走一走asm("NOP");	// Wait one cycle//开全局中断(INTM是0有效)EINT;	// Clear INTM(置0) to enable interrupts//*****到这,已经把INT2.2的中断线路打通打通了*****///**************下面这段时间如果2.2的中断发生了就会进来,CPU就会跳转去执行2.2的ISR*************//// Insert ISR Code here.......// for now just insert a delay//for(i = 1; i <= 10; i++) {}////********************************************************************************************//// Restore registers saved:		DINT;									// Set INTM(置1) to disable interrupts,因为马上就要退出ISR(switch context)了PieCtrlRegs.PIEIER2.all = TempPIEIER;	//人为干预的再把它恢复了,因为Group2后面可能还有其他挂起的中断
}
//退出2.1的ISR,芯片硬件机制又会自动设置寄存器,以此保证中断传播线路畅通

总结

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

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

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

参考资料

        TMS320F28003x Real-Time Microcontrollers datasheet.pdf


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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…

无人机RTK定位定向技术详解

无人机RTK&#xff08;Real-Time Kinematic&#xff0c;实时动态差分技术&#xff09;定位定向技术&#xff0c;是无人机领域的一项高精度导航与定位技术。它结合了全球导航卫星系统&#xff08;如GPS、GLONASS、Galileo、BDS等&#xff09;与实时差分技术&#xff0c;通过地面…

超越GPT4V,最强多模态MiniCPM-V2.6模型分享

MiniCPM-V2.6是由OpenBMB开发的一款多模态大型语言模型&#xff08;MLLM&#xff09;&#xff0c;专为视觉-语言理解设计。 MiniCPM-V2.6模型能够处理图像、视频和文本输入&#xff0c;并提供高质量的文本输出。 MiniCPM-V 2.6模型在单图像理解方面超越了广泛使用的专有模型&…

机器学习课程学习周报九

机器学习课程学习周报九 文章目录 机器学习课程学习周报九摘要Abstract一、机器学习部分1.1 Word Embedding1.1.1 词嵌入的基本概念1.1.2 word2vec连续词袋模型CBOW1.1.3 word2vec跳字模型Skip-gram 1.2 Transformer代码实践DatasetDataloaderModelLearning rate scheduleModel…

windows javascript 打开、关闭摄像头

1. 效果 打开摄像头 关闭摄像头&#xff08;包括指示灯也关了的&#xff09; 2. 代码 open_close_camera.html // open_close_camera.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>use camera</title>…

使用Dotween制作按钮弹性动画效果

效果&#xff1a; 方式&#xff1a; 优点&#xff0c;不需要写任何代码、稳定、可自定义效果

Agent实际落地的应用 未来生活的无形助手

在这个信息爆炸的时代&#xff0c;我们每个人都在追求更高效的生活方式。想象一下&#xff0c;如果有一个无形的助手&#xff0c;能够理解我们的需求&#xff0c;自动处理繁琐的任务&#xff0c;甚至为我们提供个性化的建议&#xff0c;那将是多么美好的体验&#xff01;这正是…

数字模拟IC设计前端、后端、前仿、后仿新版虚拟机

虚拟化平台&#xff1a;VMware Workstation 15 Pro以上版本 操作系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 一、射频模拟IC设计必备软件 Cadence IC06.18.350/IC23.10.080&#xff08;virtuoso&#xff09; Cadence SPECTRE23.10.538-isr10 Cadence ASSURA04.…

Spring Boot OAuth2.0应用

本文展示Spring Boot中&#xff0c;新版本OAuth2.0的简单实现&#xff0c;版本信息&#xff1a; spring-boot 2.7.10 spring-security-oauth2-authorization-server 0.4.0 spring-security-oauth2-client 5.7.7 spring-boot-starter-oauth2-resource-server 2.7.10展示三个服务…

远程供水无障碍,管线车助力全面消防防护_鼎跃安全

夏季是各类自然灾害的高发季节&#xff0c;其中森林火灾尤为频繁。这一时期的气候特征是干旱少雨&#xff0c;伴随着高温和强风&#xff0c;使得森林火灾的发生频率大幅增加。由于夏季空气湿度低&#xff0c;植被含水量减少&#xff0c;一旦出现火源&#xff0c;火势极易蔓延。…

数据结构-链表-第二天

结合leetcode学习c 链表比数组更易增加和删除数据&#xff0c;但访问速度更慢 定义 链表&#xff08;linked list&#xff09;是一种线性数据结构&#xff0c;其中的每个元素都是一个节点对象&#xff0c;各个节点通过“引用”相连接。 引用记录了下一个节点的内存地址&#…

windows本地搭建zookeeper和kafka环境

zookeeper 1.1 下载zookeeper 下载地址 随便进一个站点&#xff0c;默认是新版本&#xff0c;旧版本点击archives进入&#xff0c;选择合适的版本下载&#xff0c;本文使用的是3.7.2 下载时候选择apache-zookeeper-3.7.2-bin.tar.gz 格式的&#xff0c;编译后的&#xff0c;解…

centos 虚拟机器刚刚安装没有ip地址的问题

刚刚安装好的虚拟机器&#xff0c;我们通过 ip addr 查看ip发现是这样的 该虚拟机器没有ip地址&#xff0c;那么怎么办 原来是在/etc/sysconfig/network-scripts/ifcfg-ens33中关于网络的配置有问题 ONBOOTno 表示不开启网卡&#xff0c;我们需要将这个值进行修改为yes 当前…

prolog 基础 - 关系和属性

首先进入环境&#xff1b; 看一下一开始的提示符是 ?- &#xff0c;现在可以用write语句输出一些东西&#xff1b; 根据资料&#xff0c;在prolog中&#xff0c; 两个对象之间的关系&#xff0c;使用括号表示。比如&#xff0c;jack的朋友是peter&#xff0c;写成friend(ja…

嵌入式堆栈、ARM寄存器

栈里面存放的内容&#xff1a;局部变量和系统信息&#xff0c;函数调用链路也是系统信息的一环 ARM寄存器 LR&#xff1a;程序跳转的时候&#xff0c;返回到的地址就保存到此处 PC&#xff1a;程序计数器&#xff0c;pc 要执行的下一条指令地址&#xff0c;就存放在此处&#…

QT error: undefined reference to `vtable for Net‘

报错 C:\Users\Administrator\Desktop\VideoHill\GikISearch\net.cpp:4: error: undefined reference to vtable for Net 以下是两个可能错误原因 1&#xff0c;未定义Q_OBJECT 宏 在头文件中加上 加上#include <QObject>&#xff0c; 改写继承QObject 和定义宏 …

Unity3D 遍历预制体

Unity3D 遍历预制体进行批量化处理。 遍历预制体 有时候&#xff0c;我们需要对一些预制体资源进行批量化处理&#xff0c;如果每一个预制体都手动处理&#xff0c;就会耗费很多时间精力&#xff0c;也容易出错。 我们可以写一个脚本遍历预制体&#xff0c;对预制体进行修改…

电脑U口管理软件分享|U口管理软件哪个好?

电脑U口&#xff08;即USB端口&#xff09;管理软件是保护电脑安全、防止数据泄露和恶意软件入侵的重要工具。 在选择U口管理软件时&#xff0c;需要考虑其功能、易用性、安全性以及是否满足个人或企业的具体需求。以下是一些值得推荐的电脑U口管理软件及其特点&#xff1a; 1…

白酒与旅行日记:探索世界,品味美酒

在旅行的道路上&#xff0c;我们追寻着不同的风景&#xff0c;体验着不同的文化。而白酒&#xff0c;作为中国文化的瑰宝&#xff0c;也在这一旅途中扮演着不同的角色。它不仅仅是一种饮品&#xff0c;更是一种情感的寄托&#xff0c;一种文化的传承。今天&#xff0c;就让我们…

.net maui安卓开发中使用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…