Как установить регистр ПК (счетчик программ) на другую функцию (для планировщика)

Я пытаюсь реализовать планировщик для Arduino Mega 2560. Думаю, мне не хватает понимания, как установить в регистр ПК другую инструкцию. Вот мой простой подход:

void dummy(){
    digitalWrite(LED_BUILTIN, HIGH);
 }

в голом методе ISR:

SP = (uint16_t)(&dummy)
__asm volatile(
"reti     \n\t"
)

Однако это не работает. Как регистр ПК должен быть установлен для определенной функции или там, где он был в предыдущем процессе для подхода планировщика?

, 👍1


1 ответ


Лучший ответ:

1

Это:

SP = (uint16_t)(&dummy)

меняет указатель стека. Не то, что вы хотите. Вы хотите вместо этого push адрес назначения в стек. Однако вместо моделируя возврат функции, должно быть проще выполнить косвенный переход:

asm volatile("ijmp" :: "z"(dummy));

Не забывайте, что ваш незащищенный ISR должен сохранять все используемые вызовы. регистры, а также SREG, r0 и r1 в его пользовательском прологе. И восстановить их в своем эпилоге. Проверьте вызов AVR соглашения.

,

Спасибо за быстрый ответ, я сохраняю все регистры r0, .., r31 и __SREG__ в стек, однако я не уверен, как сохранить ПК в стек и перезагрузить его., @Mustafa Otbah

@MustafaOtbah: ПК уже был спасен прерыванием. Обычно вы восстанавливаете его с помощью reti. Возможно, вам следует расширить свой вопрос и более подробно объяснить, как вы собираетесь управлять сохранением и восстановлением контекста задачи, что вы уже сделали, а что не работает., @Edgar Bonet