6146|14

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请高手们帮分析为什么intLock无法锁住中断 [复制链接]

公司的一个项目采用MIPS的CPU
发现调用intLock()无效,各中断照样产生
用IDA反汇编出来的代码如下:
.text:80050524  # =============== S U B R O U T I N E =======================================
.text:80050524
.text:80050524
.text:80050524                 .globl intUnlock
.text:80050524 intUnlock:                               # CODE XREF: incaAscDevInit+A0p
.text:80050524                                          # incaAscOptsSet+390p ...
.text:80050524                 mtc0    $a0, SR          # Status register
.text:80050528                 jr      $ra
.text:8005052C                 nop
.text:8005052C  # End of function intUnlock
.text:8005052C
.text:80050530
.text:80050530  # =============== S U B R O U T I N E =======================================
.text:80050530
.text:80050530
.text:80050530                 .globl intLock
.text:80050530 intLock:                                 # CODE XREF: incaAscDevInit+20p
.text:80050530                                          # incaAscOptsSet:loc_80010E14p ...
.text:80050530                 mfc0    $v0, SR          # Status register
.text:80050534                 nop
.text:80050538                 sll     $0, 1
.text:8005053C                 sll     $0, 1
.text:80050540                 li      $t1, 0xFFFFFFFE
.text:80050544                 and     $t1, $v0
.text:80050548                 mtc0    $t1, SR          # Status register
.text:8005054C                 sll     $0, 1
.text:80050550                 sll     $0, 1
.text:80050554                 sll     $0, 1
.text:80050558                 sll     $0, 1
.text:8005055C                 jr      $ra
.text:80050560                 nop
.text:80050560  # End of function intLock
哪位大大帮分析下是怎么回事,CPU文档里提到的中断使能寄存器有3个(每个寄存器有32个中断位),不知道那个SR寄存器是怎么来的,mfc0    $v0, SR这段BIN码是40 02 60 00查MIPS指令得出SR的值是01100,这个寄存器是MIPS的中断状态寄存器么?为什么intLock无效??

最新回复

对了忘记告诉你了,MIPS的时钟中断寄存器是9号寄存器  详情 回复 发表于 2008-10-26 16:29
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没用过MIPS  帮顶学习!
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我查了资料了解到SR寄存器是中断使能和一些CPU模式等等的管理寄存器,intLock锁的最后一位就是中断使能开关(SR的IE),有找到一些资料说 SR的EXL 位和CPU的模式会导致SR的IE开关无效,求高人指教下这几个是什么关系,该怎么改CPU模式?SR的EXL位是1BIT位我将EXL位和IE位全置0了也没锁住中断。。。。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶起~求指教...
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
intLock()函数的功能是不让产生中断吗?应该是禁止中断抢占吧。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
高手来解答这个问题。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
没学过MIPS帮顶
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
intlock会调用自己提供的那个关中断的函数,那个函数你提供的对吗?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
MARK
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
貌似多年前我在PPC下遇到同样的问题,到后来因别的原因不了了之了.......
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 1 楼 tyrone3000 的回复:
没用过MIPS  帮顶学习!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 
一段时间没回来瞧了-.-
原因我找到了,也并不是7楼说的 "intlock会调用自己提供的那个关中断的函数"
不同CPU的锁中断方式不一样,但同款CPU锁中断的方式是一样的,编译器根据所选择的CPU编译出不同的intLock函数,比如选择PPC后编译出的BIN文件反汇编后可以看到intLock的函数是将MSR寄存器的第16位置0(还是置1忘了-.-)
帖子里说的无法锁住中断其实是一个错误的测试方法,我是用1个TASK里intLock后logMsg和1个中断函数里logMsg,发现两个logMsg都在串口输出了.
聪明的人也许发现了就是logMsg的时候导致锁中断失效,发现后才想起VXWORKS哪里好像有说明过在intLock后调用一些系统函数会使中断暂时失效.后来特意在PPC下验证了一些函数(忘了具体哪些-.-)特别是连semGive等等都会导致锁中断暂时失效,奇怪的是执行printf反而不会导致锁中断失效...不知道风河人设计的时候是怎么想的,有兴趣的朋友可以把编译出的BIN文件反汇编仔细看这几个函数就能知道原因了
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
mark
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

14
 
风河的Vxworks源代码里的intLock函数的实现原型是通过汇编指令来实现的。不同的CPU有不同的汇编指令。
我公司购买了Vxworks的源代码,我分析后得出结论,里面只有PPC750,PPC85XX,以及部分ARM的intLock()源代码,MIPS的应该
需要自己实现,不能直接调用。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
对了忘记告诉你了,MIPS的时钟中断寄存器是9号寄存器
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表