Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[stm32][CodeSourcery]Wyjątek MemManage i BusFault

tmgofer 21 Lut 2011 16:27 611 0
  • #1
    tmgofer
    Poziom 12  
    Witam!

    Mam problem, z którym nie mogę sobie poradzić od jakiegoś czasu... Problem tkwi w identyfikacji instrukcji powodującej wylot wyjątku.
    Ale od początku:

    Program łapie się w MemManageFault z flagą IACCVIOL (zdarza się również BusFault z flagą IBUSERR, ale pewnie usunięcie powodu wystepowania MemManageFault spowoduje zniknięcie sporadycznie pojawiającego się BusFault...)

    Ramka odłożona na stosie ma następujące wartości (adresy rosnące):
    Code:
     0x00000001
    
     0x20006060
     0x00000000
     0x00000001
     0x200072cc
     0x080185b1
     0x515864cc
     0x61000000



    W "ARM®v7-M Architecture Reference Manual" czytamy, że ramka stosu odkładana przy wejściu do wyjątku wygląda następująco:
    Code:
    MemA[frameptr,4] = R[0];
    
    MemA[frameptr+0x4,4] = R[1];
    MemA[frameptr+0x8,4] = R[2];
    MemA[frameptr+0xC,4] = R[3];
    MemA[frameptr+0x10,4] = R[12];
    MemA[frameptr+0x14,4] = LR;
    MemA[frameptr+0x18,4] = ReturnAddress();
    MemA[frameptr+0x1C,4] = (xPSR<31:10>:frameptralign:xPSR<8:0>);


    Czyli jak rozumiem LR ma wartość 0x080185b1 a adres powrotny to 0x515864cc.
    Zgodnie z dokumentacją rdzenia, oba wyjątki wylatują dopiero przy próbie wykonania instrukcji.

    Jaki może być powód rzucania wyjątków? Czy np. program wykonuje branch'a do instrukcji pod adresem 0x515864cc? Jak można wywnioskować jaka instrukcja wykonała branch'a?