logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega2561 wykonanie kodu CALL nie działa poprawnie

bigrom 23 Maj 2019 01:16 519 9
  • #1 17975851
    bigrom
    Poziom 14  
    Podczas pisania programu i debugowaniu program zaczął się resetować.
    Po dojściu do tego miejsca program wywołuje nie ten podprogram co potrzeba.
    0000EFDC 01.96 ADIW R24,0x01 Add immediate to word
    0000EFDD 0e.94.f1.e5 CALL 0x0000E5F1 Call subroutine <== tu nie działa poprawnie po zrobieniu kroku idzie do poniższego adresu

    00009598 c6.0e ADD R12,R22 Add without carry
    Co ciekawe na stosie poprawnie dołożony adres powrotu.
    Sprawdzone kilka razy.
    Reset procka ustawienie PC na 0x00EFDC dwa kroki step into (F11) i efekt zawsze ten sam
    Flaga przerwań wyłączona.
    Instrukcja dobrze zakodowana. opcode 94 0e e5 f1 - 1001 0100 0000 1110 E5 F1 wg pdf-a

    Środowisko Atmel Studio 7.0.1931 i kompilator gcc version 4.9.2 (AVR_8_bit_GNU_Toolchain_3.5.4_1709)

    Wygląda jak błąd w procesorze.
    Szukam kogoś kto ma doświadczenie z tym procesorem dla rozmiaru programu > 128kB.
    Pozdrawiam
  • #2 17976023
    Konto nie istnieje
    Poziom 1  
  • #3 17976142
    bigrom
    Poziom 14  
    Dodanie "nop" przed wywołaniem w celu sprawdzenia czy to zależy od miejsca nie pomogło.
    Po dodaniu "nop" za call, wywołanie wykonuje się poprawnie działa poprawnie. Pytanie czy to problem po stronie procka czy kompilatora.

    Dodano po 4 [minuty]:

    stmx napisał:
    veneer funkcji
    Jak możesz przybliż co znaczy bo słownik pokazuje znaczenia tylko odnośnie do drzewa a nic nie wspomina o oprogramowaniu.
  • #4 17976155
    Konto nie istnieje
    Poziom 1  
  • #5 17976157
    bigrom
    Poziom 14  
    stmx napisał:
    (czyli co robi tam gdzie skacze) jest mało sensowne

    Napisałem że skacze pod adres 00009598 c6.0e ADD R12,R22 Add without carry
    w tym miejscu jest środek innej funkcji.
  • #7 17976270
    tmf
    VIP Zasłużony dla elektroda
    @bigrom Pokaż jak wygląda kod programu, który wygenerował te instrukcje. To jest produkt gcc, czy wstawki asemblerowej napisanej przez ciebie? To co pokazujesz to listing z pliku lss?
  • #8 17976296
    bigrom
    Poziom 14  
    Cytat:
    2081: szf_init_f( &szf );
    0000EFDB ce.01 MOVW R24,R28 Copy register pair
    0000EFDC 01.96 ADIW R24,0x01 Add immediate to word
    0000EFDD 0e.94.f1.e5 CALL 0x0000E5F1 Call subroutine --- tu źle działa
    0000EFDF ce.01 MOVW R24,R28 Copy register pair
    0000EFE0 01.96 ADIW R24,0x01 Add immediate to word
    0000EFE1 71.d8 RCALL PC-0x078E Relative call subroutine
    0000EFE2 80.93.6a.10 STS 0x106A,R24 Store direct to data space


    po dodaniu nop dziala poprawnie
    Cytat:
    2081: szf_init_f( &szf );
    0000EFDB ce.01 MOVW R24,R28 Copy register pair
    0000EFDC 01.96 ADIW R24,0x01 Add immediate to word
    0000EFDD 0e.94.f1.e5 CALL 0x0000E5F1 Call subroutine --- tu źle działa
    2082: __asm__ __volatile__ ("nop");
    0000EFDF 00.00 NOP No operation
    0000EFE0 ce.01 MOVW R24,R28 Copy register pair
    0000EFE1 01.96 ADIW R24,0x01 Add immediate to word
    0000EFE2 71.d8 RCALL PC-0x078E Relative call subroutine
    0000EFE3 80.93.6a.10 STS 0x106A,R24 Store direct to data space


    Zmieniłem kompilator na najnowszy i na razie problem nie występuje.
  • #9 17977741
    alagner
    Poziom 26  
    Z ciekawości - co generuje ten nowszy?
  • #10 17978119
    bigrom
    Poziom 14  
    Nie sprawdzałem.
REKLAMA