Сохранение контекста стека в dsPIC33 вызывает: перехват из-за нереализованного доступа к флэш-памяти - PullRequest
0 голосов
/ 16 января 2012

Я пытаюсь сохранить контекст регистров и сохранить указатель стека на переменную C из Assembly, она работает, но выдает много ошибок и вылетает, когда попадает в оператор return.

Вот код:

_saveContext:

    PUSH    SR                      
    PUSH    W0                      
    MOV     #32, W0
    MOV     W0, SR
    PUSH    W1                      
    PUSH.D  W2
    PUSH.D  W4
    PUSH.D  W6
    PUSH.D  W8
    PUSH.D  W10
    PUSH.D  W12
    PUSH    W14
    PUSH    RCOUNT
    PUSH    TBLPAG
    PUSH    ACCAL
    PUSH    ACCAH
    PUSH    ACCAU
    PUSH    ACCBL
    PUSH    ACCBH
    PUSH    ACCBU
    PUSH    DCOUNT
    PUSH    DOSTARTL
    PUSH    DOSTARTH
    PUSH    DOENDL
    PUSH    DOENDH                                                                                      
    PUSH    CORCON
    PUSH    PSVPAG
    MOV     W15, W0
    MOV     W0, _stackPointer  //Save to C Var
    RETURN

При моделировании кода в MPLAB он работает, переменной C присваивается значение указателя стека, но когда он возвращается в RETURN, он вызывает несколько ошибок:

"CORE-E0004: перехват из-за нереализованного доступа к памяти FLASH, произошедшего из инструкции в 0xXXXXXX" ошибки

Я думаю, что это может иметь какое-то отношение к тому, как я обращаюсь к указателю стека (W15).

У кого-нибудь есть совет?Спасибо

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Ну, я нашел обходной путь, я опубликую его здесь, может быть, это поможет кому-то еще.

Решением было добавление кода непосредственно в мой C-файл и полное избавление от файла сборки.Вместо вызова процедуры сборки я просто добавил блок сборки в C:

asm volatile("PUSH      SR          \n"
            "PUSH.D     W0          \n"                                 
            "PUSH.D     W2          \n"
            "PUSH.D     W4          \n"
            "PUSH.D     W6          \n"
            "PUSH.D     W8          \n"
            "PUSH.D     W10         \n"
            "PUSH.D     W12         \n"
            "PUSH       W14         \n"
            "PUSH       RCOUNT      \n"
            "PUSH       TBLPAG      \n"
            "PUSH       ACCAL       \n"
            "PUSH       ACCAH       \n"
            "PUSH       ACCAU       \n"
            "PUSH       ACCBL       \n"
            "PUSH       ACCBH       \n"
            "PUSH       ACCBU       \n"
            "PUSH       DCOUNT      \n"
            "PUSH       DOSTARTL    \n"
            "PUSH       DOSTARTH    \n"
            "PUSH       DOENDL      \n"
            "PUSH       DOENDH      \n"                                                                                 
            "PUSH       CORCON      \n"
            "PUSH       PSVPAG      \n"
            "MOV        W15, _stackPointer  \n");   

Это решило все проблемы, которые у меня были

0 голосов
/ 16 января 2012

Это сбой, потому что вы пытаетесь ВЕРНУТЬСЯ к тому, чему равен PSVPAG, потому что RETURN использует все, что находится на вершине стека, в качестве адреса возврата.Вы не можете вернуться из подпрограммы без предварительной балансировки стека.Тем не менее, идея сохранения контекста в стеке кажется неприличной. Почему бы вам не использовать обычную оперативную память?

...