gpt4 book ai didi

assembly - ARM汇编-基本中断处理

转载 作者:行者123 更新时间:2023-12-03 06:27:28 25 4
gpt4 key购买 nike

我目前在lpc2378上搞一些ARM汇编器,但是我写了一个循环来控制炉子的温度。我相信我需要实现某种中断处理才能完成我的项目。

当应用程序运行时,它将进入一个循环,等待Button_1的输入,然后循环继续进行并经历各个阶段,但它无法达到等待Button_2输入的作用。

因此,这里有两个问题,中断处理程序如何工作?以及如何将其实现到我的应用程序中。

这是我的Button_1代码:

;=========================================================================
; Wait for BUT1 to be pressed
;=========================================================================
WaitBUT1
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR

WaitForBUT1Pressed
ldr r0, = IO0PIN ; Address of FIO0PIN register
ldr r1, [r0] ; Read FIO0PIN in to r1
ands r1, r1, # B1_MASK ; Mask out BUT1
beq BUT1Pressed ; Exit LED toggle loop if button is pressed
B WaitForBUT1Pressed
BUT1Pressed

LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC

和我的Button_2代码:
;=========================================================================
; Wait for BUT2 to be pressed
;=========================================================================
WaitBUT2
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR

WaitForBUT2Pressed
ldr r0, = IO0PIN ; Address of FIO0PIN register
ldr r1, [r0] ; Read FIO0PIN in to r1
ands r1, r1, # B2_MASK ; Mask out BUT1
beq BUT2Pressed ; Exit LED toggle loop if button is pressed
B WaitForBUT2Pressed
BUT2Pressed

LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC

还有我的炉子控制回路:
LoopStart

BL WaitBUT1 ; wait until button 1 is pressed
BL heaterOn ; turn heater on
BL systemLedOn ; turn system LED on
BL readTemp ; Check ADC for temp
BL checkTemp ; Count down, check ADC for temp
CMP r3, #5 ; Compare timer with delay
BGT errorVal
SUBS r4, r2, r7 ;Performs r7 = r4 - r2 and sets condition register
BEQ LoopStart ; if equal nothing to do
BGT overTemp ; r7 < 0 case
BL errorLedOn
BL heaterOn
BL FanOff
B LoopStart

overTemp
BL errorLedOn
BL heaterOff
BL FanOn
B LoopStart


BL WaitBUT2
BL FanOff
BL errorLedOff
BL systemLedOff
BL heaterOff

B LoopStart

提前致谢。

最佳答案

如果尚未安装,则需要获取ARM ARM(《 ARM体系结构引用手册》)。曾经只有一个,但是现在有太多的内核,他们不得不将其拆分为不同的体系结构。左边是ARM体系结构的http://infocenter.arm.com,然后是引用手册,然后是ARMv5,是的,我知道您有一个ARMv4(ARM7TDMI)。以前是ARMv5手册,即THE手册。

它将涵盖异常向量等。

您可能已经知道在引导时执行了地址0x00000000的指令。
对于中断,将调用地址0x00000018的指令。

.globl _start
_start:
b reset ;@ 0x00000000 reset
b handler ;@ 0x00000004 undefined instruction
b handler ;@ 0x00000008 software interrupt swi
b handler ;@ 0x0000000C prefetch abort
b handler ;@ 0x00000010 data abort
b handler ;@ 0x00000014 dont know
b irq_handler ;@ 0x00000018 irq
b handler ;@ 0x000000

从ARM ARM中,您还应该看到寄存器已存储,尤其是r13堆栈指针,在中断模式下有一个单独的堆栈指针。因此,在启动时,当您设置普通堆栈时,您还需要为中断堆栈设置一些空间。
reset:
;@//mov r0, #(PSR_IRQ_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
mov r0,#0xD2
msr cpsr_c, r0
ldr sp, =0xD600C000

;@//mov r0, #(PSR_SVC_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
mov r0,#0xD3
msr cpsr_c, r0
ldr sp, =0xD600B000

在某些时候,您需要在cpsr中启用中断。您可能要等到启用了任何外设(芯片内,内核外)的中断后,再执行此操作。
;@ SVC MODE, IRQ ENABLED, FIQ DIS
mov r0,#0x53
msr cpsr_c, r0

您将需要阅读lpc部分的手册,以了解如何启用中断以及如何在发生中断时清除中断。

您需要在中断处理程序中执行的第一件事(在地址0x18处分支的代码)是将共享的(未存储的)寄存器保留在堆栈上,以免弄乱它们。如果您不返回中断的代码,则寄存器将已更改,并且该代码可能无法正常工作。由于您的项目似乎位于ASM中,因此您可以在应用程序中使用一些寄存器,并仅为isr保留一些注册者,而不必设置堆栈。如果要在处理程序中的任何位置使用bl,则需要将lr保存在堆栈中。

在某些时候,您的处理程序需要清除外围设备中的中断,以便在下一个中断之前不会再次触发该中断,因此必须阅读l​​pc手册。是的,当我说LPC时,我指的是NXP,以前是飞利浦...

最后一件事是,如果您已按下lr,弹出它并弹出其他寄存器(如果已按下它们),则使用此确切指令,机械臂将返回并将模式切换回被中断的模式(切换为使用那些模式)银行登记册)。
subs pc,lr,#4

请注意,您可能还需要获取特定内核的TRM(技术引用手册),这对于ARM来说通常是个好主意,在您的情况下为ARM7TDMI-S。在信息中心页面的左侧,转到ARM7处理器,而不是体系结构下的ARMv7,但位于具有ARM11,ARM9,ARM7的较低位置。

按钮弹跳时会造成困惑,因为它们会弹起并在I/O引脚上引起许多沿。查看您的其他帖子,我看不到您需要中断的地方。除非另有必要,否则通常应该避免中断。他们总体上都很凌乱。当然,有些设计是您无法避免的。在事件驱动的设计中,所有代码都是中断处理程序,应用程序中除了启动代码和无限循环(或某种 sleep )外什么都没有。

您可以使用中断来进行反跳,例如,如果您设置了计时器中断并为中断中的按钮采样了I/O引脚,则可以避免大量的跳动,但同时也可能会错过按一下按钮的风险。 。仅仅因为按钮I/O引脚连续两次而不是两次按下就被断言,所以您可以在某个位置更改状态变量,释放按钮时可以更改状态变量。该状态变量的边沿变化是应用程序感兴趣的。例如,当按钮从按下状态变为按下状态时,请执行某项操作;如果从按下状态变为未按下状态,则不执行任何操作,以等待按钮从未按下状态变为按下状态为例。

您还可以使用相同的定时器中断来启动或采样ADC。

由于您还没有解决这里提到的其他问题,因此我不会中断。首先找出问题所在,然后确定是否有需要中断的功能。类似于ADC的偶数/常规采样。

那应该足以让您入门。如果您尝试中断,请不要尝试将其作为此应用程序的一部分,而创建一个完全独立的应用程序,例如LED指示灯。更改中断处理程序中led的状态,和/或更改全局变量或在处理程序中注册,并为此进行forground监视并更改led。始终将您的问题/学习练习分为几部分,解决这些问题,然后将它们粘合在一起,再增加一件,进行测试,再增加一件,进行测试。

关于assembly - ARM汇编-基本中断处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10646399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com