PIC32 Получить/установить программный счетчик

Во-первых, я провел небольшое исследование:

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

Я использую устройство PIC32MX340F512 на плате разработчика uC32 (игнорируйте тот факт, что он предназначен для Aurduino).

Я могу получить значение EPC (счетчик программы исключений), но он сохраняет только значение PC из последнего исключения. Но вы можете написать в него и вызвать eret инструкцию asm, чтобы перейти на ПК к его местоположению. Если я смогу создать поддельное исключение в интересующей позиции кода, я, вероятно, смогу тогда получить значение? Кажется хакерским.

Я видел примеры, когда люди писали на ПК через регистры PCL и PCH, но они, похоже, не определены в моем рабочем пространстве MPLAB (компилятор XC).

Любые идеи? Я включил суть от TNKernel, которая выполняет переключение контекста для устройства PIC32, но она находится в сборке, и я, к сожалению, ее не понимаю. Но это выглядит так, как будто это сделано в ISR, что имеет смысл. Когда мы переходим в ISR, нам все равно приходится переключать контекст.


person Oliver    schedule 20.07.2018    source источник


Ответы (1)


Вы можете изменить значение регистра EPC только тогда, когда процессор находится в режиме ядра. Самый простой способ сделать это — реализовать ISR на ассемблере, поскольку прерывания обрабатываются в режиме ядра. Вы можете сделать простую функцию ISR и получить ассемблерный код для обработки прерывания из окна дизассемблирования в MPLABX, а прямо перед выполнением функции eret вы можете установить новое значение в регистр EPC. Когда eret возвращается к адресу, который находится внутри регистра EPC, все регистры процессора будут восстановлены в их прежних значениях перед входом в ISR, поэтому вам следует сделать резервную копию регистров $ra и $epc перед возвратом из ISR, а все остальное сделать с помощью другой функции. , адрес которого находится внутри регистра EPC.

person Emiliyan Nikolov    schedule 02.04.2019