当前位置: 技术问答>linux和unix
哪位帮忙把这个汇编宏,解析一下?
来源: 互联网 发布时间:2016-10-24
本文导语: 下面这个是Linux获取中断号的宏定义,一时还找不到这个汇编的语法,哪位帮忙把下面的句子解析一下呢 #define AVIC_NIMASK 0x04 @ this macro disables fast irq (not implemented) .macro disable_fiq .endm .macro get_irqnr_preamble, ba...
下面这个是Linux获取中断号的宏定义,一时还找不到这个汇编的语法,哪位帮忙把下面的句子解析一下呢
#define AVIC_NIMASK 0x04
@ this macro disables fast irq (not implemented)
.macro disable_fiq
.endm
.macro get_irqnr_preamble, base, tmp
ldr base, =avic_base
ldr base, [base]
ldr r4, [base, #AVIC_NIMASK]
.endm
.macro arch_ret_to_user, tmp1, tmp2
.endm
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
@ Load offset & priority of the highest priority
@ interrupt pending from AVIC_NIVECSR
ldr irqstat, [base, #0x40]
@ Shift to get the decoded IRQ number, using ASR so
@ 'no interrupt pending' becomes 0xffffffff
mov irqnr, irqstat, asr #16
@ set zero flag if IRQ + 1 == 0
adds tmp, irqnr, #1
bicne tmp, irqstat, #0xFFFFFFE0
strne tmp, [base, #AVIC_NIMASK]
streq r4, [base, #AVIC_NIMASK]
.endm
@ irq priority table (not used)
.macro irq_prio_table
.endm
#define AVIC_NIMASK 0x04
@ this macro disables fast irq (not implemented)
.macro disable_fiq
.endm
.macro get_irqnr_preamble, base, tmp
ldr base, =avic_base
ldr base, [base]
ldr r4, [base, #AVIC_NIMASK]
.endm
.macro arch_ret_to_user, tmp1, tmp2
.endm
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
@ Load offset & priority of the highest priority
@ interrupt pending from AVIC_NIVECSR
ldr irqstat, [base, #0x40]
@ Shift to get the decoded IRQ number, using ASR so
@ 'no interrupt pending' becomes 0xffffffff
mov irqnr, irqstat, asr #16
@ set zero flag if IRQ + 1 == 0
adds tmp, irqnr, #1
bicne tmp, irqstat, #0xFFFFFFE0
strne tmp, [base, #AVIC_NIMASK]
streq r4, [base, #AVIC_NIMASK]
.endm
@ irq priority table (not used)
.macro irq_prio_table
.endm
|
很简单啊,根据宏的名字就能判断出个大概,获得irq号,并且是可抢占的
base,tmp是参数
.macro get_irqnr_preamble, base, tmp
ldr base, =avic_base
ldr base, [base]
ldr r4, [base, #AVIC_NIMASK]
.endm
base,tmp是参数
.macro get_irqnr_preamble, base, tmp
ldr base, =avic_base
ldr base, [base]
ldr r4, [base, #AVIC_NIMASK]
.endm
|
看你的中断号4294950914=0xFFFC0002, 应该是该中断应该跳转去的向量地址,不是中断号吧?是说发生这个中断你应该执行0xFFFC0002的代码吧?看看你的数据手册的VIC的部分应该就明了了。
中断号获取一般使用get_irqnr_and_base。 不好意思,用的一直是三星和我们公司的没有VIC的芯片,如果说对了记得把分给我喔!!呵呵
|
看你的中断号4294950914=0xFFFC0002, 应该是该中断应该跳转去的向量地址,不是中断号吧?是说发生这个中断你应该执行0xFFFC0002的代码吧?看看你的数据手册的VIC的部分应该就明了了。
中断号获取一般使用get_irqnr_and_base。 不好意思,用的一直是三星和我们公司的没有VIC的芯片,如果说对了记得把分给我喔!!呵呵
中断号获取一般使用get_irqnr_and_base。 不好意思,用的一直是三星和我们公司的没有VIC的芯片,如果说对了记得把分给我喔!!呵呵
|
Linux中的ASM是AT&T ASM.
|
赞同。ARM-Linux基本的指令还是ARM汇编,如果能够看懂ARM汇编,看Linux这些AT&T的汇编并不难.总之还是要学习ARM 基础知识的问题。
|
楼主这个问题是比较奇怪,刚才看了看i.MX27的文档,按理说在
mov irqnr, irqstat, asr #16
这步就已经可以将中断号从NIVECSR寄存器中读出并右移16位就可以得到中断号。现在移位的结果是0xffffc002.这个寄存器是只读的,最高位默认是0,ASR不可能移位出0xFFFF.楼主你确认你读的地址是正确的吗?
mov irqnr, irqstat, asr #16
这步就已经可以将中断号从NIVECSR寄存器中读出并右移16位就可以得到中断号。现在移位的结果是0xffffc002.这个寄存器是只读的,最高位默认是0,ASR不可能移位出0xFFFF.楼主你确认你读的地址是正确的吗?
|
当然这个0xFFFC0002可能是你设置的,或者系统上电的默认值,在我的印象中VIC是需要设置的
|
问下,要看懂这些代码? 需要学习哪些知识? 我对这些代码太好奇了,可惜学习无门.