Как установить регистр ПК (счетчик программ) на другую функцию (для планировщика)
Я пытаюсь реализовать планировщик для Arduino Mega 2560. Думаю, мне не хватает понимания, как установить в регистр ПК другую инструкцию. Вот мой простой подход:
void dummy(){
digitalWrite(LED_BUILTIN, HIGH);
}
в голом методе ISR:
SP = (uint16_t)(&dummy)
__asm volatile(
"reti \n\t"
)
Однако это не работает. Как регистр ПК должен быть установлен для определенной функции или там, где он был в предыдущем процессе для подхода планировщика?
@Mustafa Otbah, 👍1
1 ответ
Лучший ответ:
Это:
SP = (uint16_t)(&dummy)
меняет указатель стека. Не то, что вы хотите. Вы хотите вместо этого
push
адрес назначения в стек. Однако вместо
моделируя возврат функции, должно быть проще выполнить
косвенный переход:
asm volatile("ijmp" :: "z"(dummy));
Не забывайте, что ваш незащищенный ISR должен сохранять все используемые вызовы.
регистры, а также SREG
, r0
и r1
в его пользовательском прологе. И
восстановить их в своем эпилоге. Проверьте вызов AVR
соглашения.
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Кнопка двойного состояния Nextion
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
- Запуск двух шаговых двигателей с двумя поворотными энкодерами
- Как создать задержки на языке ассемблера AVR
- Мой код Arduino компилируется, когда я не вижу в нем ничего плохого
- Как настроить выводы ввода-вывода второго квадратурного декодера в Arduino IDE
Спасибо за быстрый ответ, я сохраняю все регистры r0, .., r31 и __SREG__ в стек, однако я не уверен, как сохранить ПК в стек и перезагрузить его., @Mustafa Otbah
@MustafaOtbah: ПК уже был спасен прерыванием. Обычно вы восстанавливаете его с помощью
reti
. Возможно, вам следует расширить свой вопрос и более подробно объяснить, как вы собираетесь управлять сохранением и восстановлением контекста задачи, что вы уже сделали, а что не работает., @Edgar Bonet