проблемы с пониманием прерывания с MSP430 в сборке - PullRequest
0 голосов
/ 07 августа 2020

Я не понимаю, почему в этом коде reti используется два раза и почему jmp вызывается на P1.1, а jmp на P1.2 не вызывается. Это ошибка?

Спасибо.

;---------------------------------------------------------------------------
P1ISR   add.w &P1IV, PC 
        reti 
        reti 
        jmp     P1_1 
       ;jmp    P1_2 

P1_2   xor.b #L2, &P9OUT 
       bit.b #S1, &P1IN 
       jnz P1_2Fin 
       xor.b #L1, &P1OUT 
P1_2Fin reti

P1_1   xor.b #L1, &P1OUT 
       xor.b #S1, &P1IES 
       reti


.intvecPORT1_VECTOR, P1ISR

1 Ответ

2 голосов
/ 07 августа 2020

В Руководстве пользователя вашей микросхемы MSP сказано:

Прерывания портов

[…] Все флаги прерываний P1 имеют приоритет, а P1IFG.0 - наивысший и в сочетании с источником единственного вектора прерывания. Прерывание с наивысшим приоритетом генерирует номер в регистре P1IV. Это число можно оценить или добавить к счетчику программ для автоматического входа в соответствующую процедуру программного обеспечения. Отключенные прерывания P1 не влияют на значение P1IV. […] Любой доступ (чтение или запись) к младшему байту регистра P1IV, будь то слово или побайтный доступ, автоматически сбрасывает самый высокий флаг ожидающего прерывания. Если установлен другой флаг прерывания, сразу же генерируется другое прерывание после обслуживания исходного прерывания. […]

Пример программного обеспечения прерывания порта

В следующем примере программного обеспечения показано рекомендуемое использование P1IV и накладные расходы на обработку. Значение P1IV добавляется к P C для автоматического перехода к соответствующей процедуре. P2IV похож.

Числа на правом краю показывают необходимое количество циклов ЦП для каждой инструкции. Программные издержки для различных источников прерываний включают в себя задержки прерывания и циклы возврата из прерывания, но не саму обработку задачи.

;Interrupt handler for P1                           Cycles
P1_HND   ...             ; Interrupt latency            6
         ADD  &P1IV,PC   ; Add offset to Jump table     3
         RETI            ; Vector 0: No interrupt       5
         JMP  P1_0_HND   ; Vector 2: Port 1 bit 0       2
         JMP  P1_1_HND   ; Vector 4: Port 1 bit 1       2
         JMP  P1_2_HND   ; Vector 6: Port 1 bit 2       2
         JMP  P1_3_HND   ; Vector 8: Port 1 bit 3       2
         JMP  P1_4_HND   ; Vector 10: Port 1 bit 4      2
         JMP  P1_5_HND   ; Vector 12: Port 1 bit 5      2
         JMP  P1_6_HND   ; Vector 14: Port 1 bit 6      2
         JMP  P1_7_HND   ; Vector 16: Port 1 bit 7      2

P1_7_HND                 ; Vector 16: Port 1 bit 7
         ...             ; Task starts here
         RETI            ; Back to main program         5

P1_6_HND                 ; Vector 14: Port 1 bit 6
         ...             ; Task starts here
         RETI            ; Back to main program         5
...
...