PowerPC VxWorks BSP分析(3.2)——POWERQUICC硬件-程序员宅基地

技术标签: 内存管理  

1.2 内存管理单元MMU
clip_image018
clip_image020
1.3 MPC860 中断
clip_image022
MPC860的整个中断体系结构有3个模块:PowerPC 核、SIU 中断控制器SIU IC(SIU Interrupt Controller)和CPM 中断控制器CPMIC(CPM Interrupt Controller)。
PowerPC Core 是指令执行单元,使用异常(Exception)的目的就是要打断它的正常执行,使它转入处理紧急事件的异常处理程序中执行。对于每一类异常,异常发生后PowerPC跳转执行的位置是不同的。这些不同的位置组成了一个表——异常向量表。不同类型的异常在异常向量表中的偏移量不同。例如系统重启异常在异常向量表中的偏移量是0x100,机器自检异常的偏移量是0x200,而外部中断在异常向量表中的偏移量是0x500等等。
clip_image024
SIU 中断控制器负责管理8 个外部中断源(IRQ0 ~7 )和8 个内部中断源(Level0~7)。其中IRQ0一般用作不可屏蔽中断,通过NMI 向PowerPC 内核请求中断,其余15个通过IREQ请求中断。对于8 个内部中断源,包括周期性的中断时钟(PIT)、实时时钟(RTC)、PCMCIA以及CPM等,用户可以通过对寄存器的操作,把它们设定为Level 0~7中的任何一级。这16个中断源之间的优先级SIU IC 已经设定了。其中IRQ0的优先级最高,Level0 其次,IRQ1 再次,依此类推,Level7的优先级最低。
clip_image026
在SIU IC进行SIU中断处理时,有几个重要的寄存器与之相关。它们是中断悬挂寄存器SIPEND、中断屏蔽寄存器SIMASK和中断向量寄存器SIVEC。
CPM中断控制器是对SIU中断控制器的下一级扩展。它管理通信处理模块的各个中断源,并向SIU IC申请中断处理。CPIC接收12个外部中断源和17个内部中断源的中断请求,经过屏蔽和判优处理后,把中断请求送往SIU中断控制器。通过设置CPIC的配置寄存器,CPM在SIU IC中的优先级可以是Level0~7中的任何一级,并且所有的CPM中断源都将以这个优先级向SIU 申请中断。在CPM IC内部,它也为每个中断源分配了一个中断向量号,并且分配了不同的优先级,还可以编程设定哪个中断源为最高优先级。
在CPM的中断源中,如果一个中断源有多个子功能可以产生中断请求,并且每一项子功能的中断请求都可以屏蔽,那么这个中断源称为子块可屏蔽中断。例如,对串行管理通道SMC(Serial Management Channels),每一个SMC有一个事件寄存器SMCE和一个屏蔽寄存器SMCM。用户可以通过对SMCM进行编程,屏蔽掉某项子功能的中断请求功能。假如用户要使用中断接收功能,就应该置位SMCM的RX位以打开接收中断。在中断服务程序中还要读取SMCE,以判断是哪个子功能产生的中断。如果SMCE的RX位已被置位,就表明产生了接收中断,应进入接收中断处理函数。
clip_image028
CPM IC中提供了一些可编程寄存器。通过对这些寄存器进行设置,可以设定CPM IC的工作方式。这些寄存器分别是CPM中断配置寄存器CICR、CPM中断屏蔽寄存器CIMR、CPM中断向量寄存器CIVR、CPM中断悬挂寄存器CIPR和CPM中断服务寄存器CISR。
编写MPC860中断应用程序主要有两个方面的内容:一个是中断初始化程序,另一个是中断服务程序。中断初始化程序首要的工作是初始化中断寄存器,包括打开SIMASK对应的屏蔽位、使能外部中断。如果要使用SIU的外部中断,应该初始化SIEL寄存器,以设定中断是低电平触发还是低跳变触发。如果使用了CPM中断,还应该初始化CICR、CIMR寄存器,以设定CPM在SIUIC中的中断优先级,以及它自身内部的最高优先级中断源。对于子块可屏蔽中断源,还应该打开对应的事件屏蔽寄存器。只有在初始化这些寄存器后,中断源产生的中断才能得到响应。
对于外部中断,PowerPC内核接收到中断请求信号后,会转入异常向量表中的外部中断偏移地址处(0x500)执行。这一段最大长度为256个字节的代码,也可以说是SIU中断的服务程序。在中断初始化程序中,还必须把SIU中断服务程序放到正确的位置。中断服务程序是中断产生后自动跳转执行的程序,它对中断进行处理。对于其中比较复杂的CPM中断,它有两级处理程序,分别是SIU中断服务程序和CPM中断服务程序。
clip_image030
在SIU中断服务程序中,要读取产生SIU中断的中断向量号,根据中断向量号判断中断源,然后跳转到对各个中断源处理的服务程序中执行。如果读到的中断向量号对应的是CPM,要转入CPM中断服务程序中执行。
CPM又有29个中断源,每个中断源对应不同CPM中断向量号。在CPM中断服务程序中,也要读取CPM中断向量号,然后根据中断向量号调用对应的中断处理程序。这样,所有的CPM中断源,在进入中断处理程序之前,都经过了SIU IC和CPM IC两级处理。另外,由于MPC860是RISC处理器,它有许多通用寄存器,在中断服务程序中应该把影响到的寄存器压入到堆栈中,在退出中断服务程序之前再恢复。
下面以CPM的SMC1用作串口,使用中断接收数据为例,说明MPC860的中断应用程序编写过程。
本程序的主函数是main()。它调用smc_init()进行smc初始化,然后循环等待接收数据。smc_init()是初始化函数。它设定smc1的工作方式,初始化接收描述字,然后初始化中断寄存器,并且把SIU中断服务程序拷贝到异常向量表的0x500处。Initbrn()是SIU中断服务程序,也就是外部中断产生后的入口程序。它读取SIU的中断向量号,如果是CPM中断,就调用CPM中断处理程序CPMHandler(),在这个程序中再读取CPM中断向量号,如果是CPM中断,就调用CPM中断处理程序CPMHandler(),在这个程序中再读取CPM中断向量号,处理SMC1发送过来的数据。
另外,函数getimmr()的作用是用汇编指令得到芯片内端口寄存器的基址,getmsr()的作用是读取机器状态字(MSR)的值,getevt()利用MSR的值得到的异常向量表的基址。整个程序代码如下:
#include "pc860.h" /*MPC860寄存器宏定义头文件*/
struct dprbase *pdpr; /*指向双端口内存基址的地址*/
void smc_init() /*初始化SMC函数*/
{
void intbrn(); /*定义SIU中断服务程序*/
int *ptrs,*ptrd; /*SIU中断服务程序搬移的源和目的地址*/
char intlv1=4;/*CPM中断级别*/
pdpr=(struct dprbase *)(getimmr() & 0xFFFF0000); /*得到端口寄存器的基址*/
…… /*初始化SMC的寄存器和工作参数,如工作模式,波特率等*/
…… /*初始化串口数据收发缓冲区的描述字,注意要把接收缓冲区描述字RxBD的中断位置为1*/
ptrs=(int *)intbrn; /*需要搬移的SIU中断服务程序源地址*/
ptrd=(int *)(getevt()+0x500);/*目标地址*/
do /*把SIU中断服务程序搬移到外部中断入口处*/
*ptrd++=*ptrs;
while(*ptrs++!=0x4c000064);/*0x4c000064是SIU中断服务程序返回指令RFI指令的二进制代码*/
pdpr->CICR.IRL2=(unsigned)(intlv1);/*设定CPM的中断级别为4*/
pdpr->CICR.HP0_HP4=0x1F; /*设定PC15为最高优先级中断*/
pdpr->CIMR.SMC1=1;/*打开CPM IC的SMC1中断屏蔽位*/
pdpr->SIMASK.ASTRUCT.LVM4=1;/*打开SIU IC的CPM中断屏蔽位*/
pdpr->CICR.IEN=1;/*使能CPM中断*/
pdpr->SMCE1=0xFF;/*清除SMC1的事件寄存器*/
pimm->SMCM1=1;/*打开子模块可屏蔽的接收中断*/
asm("mtspr 80,0");/*使能中断*/
…… /*使能SMC1的发送和接收功能*/
}
main() /*主函数*/
{
smc_init() /*初始化SMC1*/
while(1);/*等待接收*/
}
#pragma interrupt intbrn /*SIU中断服务程序
void intbrn()
{
void CPMHandler();/*定义CPM中断服务程序*/
asm("stwu r9,-4(r1");/*把GRR9压入堆栈*/
switch(pdpr->SIVEC.IC)/*读取SIU的中断向量号,转入相应处理程序*/
{
case 0x24;/*为CPM对应的中断向量号*/
asm("mfspr r9,8");/*把LR压入堆栈*/
asm("mfspr r9,8");/*把LR压入堆栈*/
asm("mfspr r9,8");/*把LR压入堆栈*/
asm("stwu r9,-4(r1)");
asm("bla CPMHandler")/*调用CPM中断处理函数*/
asm("lwz r9,0(r1)");/*把LR从堆栈中弹出*/
asm("addi r1,r1,4");/*恢复堆栈指针*/
asm("mtspr8,r9");
break;
default:;
}
asm("lwz r9,0(r1); /*把GPR9从堆栈中弹出/*
asm("addi r1,r1,4");/*恢复堆栈指针*/
}
void CPMHandler() /*CPM中断处理程序*/
{
unsigned v1;
pdpr->CIVR.IACK=1;/*把CIVR的IACK位置为1,以读取CIVR中的中断向量号*/
v1=pdpr->CIVR.VN;/*读取中断向量号*/
switch(pimm->CIVR.VN)/*根据中断向量号进行处理*/
{
case 4: /*SMC1的中断向量*/
…… /*SMC1中断处理程序,对接收到的数据进行处理*/
pimm->CISR=1<<(31-11);/*清除IN-SRVCE位*/
break;
default:;
}
}
getimmr() /*得到双端口寄存器的基址*/
{ asm("mfspr3,638");
}
getevt() /*得到中断入口的基址*/
{
if((getmsr() & 0x40)==0)/*如果MSR.IP等于0*/
return(0); /*中断入口在低位*/
else
return(0xFFF00000);/*中断入口在高位*/
}
getmsr() /*得到机器状态寄存器MSR的值*/
{
asm(mfmsr 3; /*把MSR的值读到r3中*/


 本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/134669,如需转载请自行联系原作者



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33796205/article/details/90065148

智能推荐

2024最新计算机毕业设计选题大全-程序员宅基地

文章浏览阅读1.6k次,点赞12次,收藏7次。大家好!大四的同学们毕业设计即将开始了,你们做好准备了吗?学长给大家精心整理了最新的计算机毕业设计选题,希望能为你们提供帮助。如果在选题过程中有任何疑问,都可以随时问我,我会尽力帮助大家。在选择毕业设计选题时,有几个要点需要考虑。首先,选题应与计算机专业密切相关,并且符合当前行业的发展趋势。选择与专业紧密结合的选题,可以使你们更好地运用所学知识,并为未来的职业发展奠定基础。要考虑选题的实际可行性和创新性。选题应具备一定的实践意义和应用前景,能够解决实际问题或改善现有技术。

dcn网络与公网_电信运营商DCN网络的演变与规划方法(The evolution and plan method of DCN)...-程序员宅基地

文章浏览阅读3.4k次。摘要:随着电信业务的发展和电信企业经营方式的转变,DCN网络的定位发生了重大的演变。本文基于这种变化,重点讨论DCN网络的规划方法和运维管理方法。Digest: With the development oftelecommunication bussiness and the change of management of telecomcarrier , DCN’s role will cha..._电信dcn

动手深度学习矩阵求导_向量变元是什么-程序员宅基地

文章浏览阅读442次。深度学习一部分矩阵求导知识的搬运总结_向量变元是什么

月薪已炒到15w?真心建议大家冲一冲数据新兴领域,人才缺口极大!-程序员宅基地

文章浏览阅读8次。近期,裁员的公司越来越多今天想和大家聊聊职场人的新出路。作为席卷全球的新概念ESG已然成为当前各个行业关注的最热风口目前,国内官方发布了一项ESG新证书含金量五颗星、中文ESG证书、完整ESG考试体系、名师主讲...而ESG又是与人力资源直接相关甚至在行业圈内成为大佬们的热门话题...当前行业下行,裁员的公司也越来越多大家还是冲一冲这个新兴领域01 ESG为什么重要?在双碳的大背景下,ESG已然成...

对比传统运营模式,为什么越拉越多的企业选择上云?_系统上云的前后对比-程序员宅基地

文章浏览阅读356次。云计算快速渗透到众多的行业,使中小企业受益于技术变革。最近微软SMB的一项研究发现,到今年年底,78%的中小企业将以某种方式使用云。企业希望投入少、收益高,来取得更大的发展机会。云计算将中小企业信息化的成本大幅降低,它们不必再建本地互联网基础设施,节省时间和资金,降低了企业经营风险。科技创新已成时代的潮流,中小企业上云是创新前提。云平台稳定、安全、便捷的IT环境,提升企业经营效率的同时,也为企业..._系统上云的前后对比

esxi网卡直通后虚拟机无网_esxi虚拟机无法联网-程序员宅基地

文章浏览阅读899次。出现选网卡的时候无法选中,这里应该是一个bug。3.保存退出,重启虚拟机即可。1.先随便选择一个网卡。2.勾先取消再重新勾选。_esxi虚拟机无法联网

随便推点

在LaTeX中使用.bib文件统一管理参考文献_egbib-程序员宅基地

文章浏览阅读913次。在LaTeX中,可在.tex文件的同一级目录下创建egbib.bib文件,所有的参考文件信息可以统一写在egbib.bib文件中,然后在.tex文件的\end{document}前加入如下几行代码:{\small\bibliographystyle{IEEEtran}\bibliography{egbib}}即可在文章中用~\cite{}宏命令便捷的插入文内引用,且文章的Reference部分会自动排序、编号。..._egbib

Unity Shader - Predefined Shader preprocessor macros 着色器预处理宏-程序员宅基地

文章浏览阅读950次。目录:Unity Shader - 知识点目录(先占位,后续持续更新)原文:Predefined Shader preprocessor macros版本:2019.1Predefined Shader preprocessor macros着色器预处理宏Unity 编译 shader programs 期间的一些预处理宏。(本篇的宏介绍随便看看就好,要想深入了解,还是直接看Unity...

大数据平台,从“治理”数据谈起-程序员宅基地

文章浏览阅读195次。本文目录:一、大数据时代还需要数据治理吗?二、如何面向用户开展大数据治理?三、面向用户的自服务大数据治理架构四、总结一、大数据时代还需要数据治理吗?数据平台发展过程中随处可见的数据问题大数据不是凭空而来,1981年第一个数据仓库诞生,到现在已经有了近40年的历史,相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末就开始了,从第一代架构出现到..._数据治理从0搭建

大学抢课python脚本_用彪悍的Python写了一个自动选课的脚本 | 学步园-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏12次。高手请一笑而过。物理实验课别人已经做过3、4个了,自己一个还没做呢。不是咱不想做,而是咱不想起那么早,并且仅有的一次起得早,但是哈工大的服务器竟然超负荷,不停刷新还是不行,不禁感慨这才是真正的“万马争过独木桥“啊!服务器不给力啊……好了,废话少说。其实,我的想法很简单。写一个三重循环,不停地提交,直到所有的数据都accepted。其中最关键的是提交最后一个页面,因为提交用户名和密码后不需要再访问其..._哈尔滨工业大学抢课脚本

english_html_study english html-程序员宅基地

文章浏览阅读4.9k次。一些别人收集的英文站点 http://www.lifeinchina.cn (nice) http://www.huaren.us/ (nice) http://www.hindu.com (okay) http://www.italki.com www.talkdatalk.com (transfer)http://www.en8848.com.cn/yingyu/index._study english html

Cortex-M3双堆栈MSP和PSP_stm32 msp psp-程序员宅基地

文章浏览阅读5.5k次,点赞19次,收藏78次。什么是栈?在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。栈的作用?局部变量内存的开销,函数的调用都离不开栈。了解了栈的概念和基本作用后我们来看M3的双堆栈栈cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。MSP的含义是Main..._stm32 msp psp

推荐文章

热门文章

相关标签