Исполнительные банки MSP430

Я новичок в архитектуре MSP430, и я портирую ОСРВ, написанную для ARM Cortex M3, в эту архитектуру. В архитектуре ARM Cortex есть регистры PSP и MSP для хранения значений стека для режимов выполнения.

Как я понимаю из архитектуры MSP430 существует только один регистр указателя стека (SP).

Вот мои вопросы:

-Есть ли только один банк регистров для SP в контексте прерывания / выполнения?

-Могу ли я использовать обычные функции C для обработки прерываний в MSP430, как в ARM Cortex?

-Как MSP430 обрабатывает (сохраняет / восстанавливает) регистры во время выполнения прерывания (в частности, SP, SR и ПК)?


person albin    schedule 17.06.2014    source источник


Ответы (1)


  1. С точки зрения регистров MSP430 банков нет, это единственный регистр SP в контексте. введите описание изображения здесь

  2. Да, вы можете использовать функции C для обработки прерываний ссылка

__interrupt void MyFuncISR(void)

или это также может быть как

#pragma vector=TIMER0_A0_VECTOR    
__interrupt void
ta0cc0_isr (void)

в этом случае компилятор установит правильный вектор прерывания по заданному вами определению / имени

3. Логика прерывания выполняет следующее: 1. Любая выполняемая в данный момент инструкция завершается. 2. ПК, который указывает на следующую инструкцию, помещается в стек. 3. SR помещается в стек и так далее, см. Ниже: введите описание изображения здесь

person Ruslan Gerasimov    schedule 18.06.2014
comment
(ответ 2) Архитектура MSP430 не поддерживает функции C в качестве обработчиков прерываний. Поэтому вы используете спецификатор __interrupt для изменения соглашения о вызовах. В контексте прерывания вы должны вернуться из обработчика через reti, чтобы извлечь sr из стека. С другой стороны, в обычном вызове C вы должны использовать инструкции ret. - person albin; 25.06.2014
comment
Компилятор автоматически помещает reti в возврат вызова прерывания C со спецификатором __interrupt, не так ли? Поэтому предложил спецификатор __interrupt. - person Ruslan Gerasimov; 26.06.2014
comment
Проблема начинается с этого момента, если вы хотите переключить контекст в ISR (например, прерывание по таймеру), вам также следует подумать о том, чтобы не сохранять / восстанавливать SR. Это делается аппаратно. Напротив, вы должны сохранять / восстанавливать SR при обычном выполнении. Вкратце, вы не можете использовать единую схему сохранения / восстановления как для выполнения, так и для контекста ISR. В ARM Cortex M контроллер прерываний соответствует AAPCS (Стандарт вызова процедур приложения ARM), поэтому вы можете использовать обычные функции C (без использования специальных спецификаторов, например: __interrupt, __irq, __attribute __ ((interrupt (irq))) и т. Д.) как обработчики прерываний. - person albin; 26.06.2014