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

Software Interrupt ARM7TDMI

flapo213 28 Maj 2010 19:21 1509 6
  • #1 28 Maj 2010 19:21
    flapo213
    Poziom 21  

    Witam,

    Próbuję odpalić FreeRtos na At91Sam7S128. Próbuję go debugować i dochodzę do wywołania wstawki asemblerowej:

    Code:

    __asm volatile ( "SWI 0" )

    lub

    asm volatile ( "SWI 0" )


    Ani jedna opcja ani druga nie działa.

    Po wywołaniu tej wstawki program idzie w buraka.

    Zaktualizowałem plik *.S który zamieszczam w tym poście. Ten plik to template atmela zaktualizowany.

    Czytając dokumentację do Arm7TDMI doczytałem iż aby wywołać poprawnie software interrupt należy przełączyć rdzeń w tryb supervisora i tyle.

    Jak dobrze rozumiem po wywołaniu wyżej wymienionej wstawki asemblerowej powinien zostać zgłoszony wyjątek (Exception SWI) a co za tym idzie wywołana procedura "vPortYieldProcessor" którą umieściłem w pliku *.S.

    Niestety tak się nie dzieje program się wysypuje.

    Moje doświadczenie z SWI jest raczej żadne i nie wiem jak się za to zabrać. Czy trzeba stos deklarować pod SWI ?

    Co powinienem zrobić aby zaczęło to poprawnie działać.

    Pozdrawiam i dzięki za wszelkie info.

    0 6
  • #2 28 Maj 2010 19:50
    atom1477
    Poziom 43  

    W tym pliku S nie masz procedury vPortYieldProcessor a tylko skok do niej.
    Więc coś kręcisz.

    0
  • #3 28 Maj 2010 19:53
    flapo213
    Poziom 21  

    Witam,

    Modyfikację wykonałem zgodnie z przykładem ze stronki FreeRtos. No fakt nie skojarzyłem, brak definicji, przeglądnę dokładnie, dam znać. Dzięki

    0
  • #4 28 Maj 2010 20:06
    atom1477
    Poziom 43  

    Nie chodziło mi o definicję.
    Nie masz etykiety.
    Masz skok pod coś co nie istnieje.
    Jest skok pod vPortYieldProcessor, ale etykiety vPortYieldProcessor nie ma.

    0
  • #5 28 Maj 2010 21:22
    flapo213
    Poziom 21  

    Witam,

    jest tak faktycznie deklaracji nazwy nie było w pliku *.S. Ta funkcja ma deklarację i definicję w jednym pliku portISR.c

    deklaracja
    /* ISR to handle manual context switches (from a call to taskYIELD()). */
    void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked));

    definicja
    void vPortYieldProcessor( void )
    {
    /* Within an IRQ ISR the link register has an offset from the true return
    address, but an SWI ISR does not. Add the offset manually so the same
    ISR return code can be used in both cases. */
    asm volatile ( "ADD LR, LR, #4" );

    /* Perform the context switch. First save the context of the current task. */
    portSAVE_CONTEXT();

    /* Find the highest priority task that is ready to run. */
    vTaskSwitchContext();

    /* Restore the context of the new task. */
    portRESTORE_CONTEXT();
    }

    dorzuciłem w pliku *.S na samym początku

    .extern vPortYieldProcessor

    skompilowało się, po uruchomieniu i debugowaniu po dojściu do wyżej wymienionej wstawki asemblerowej openocd wyrzuciło

    Error: address + size wrapped(0xfffffffe, 0x00000004)
    Warn : memory read caused data abort (address: 0x11111111, size: 0x1, count: 0x3)
    Warn : memory read caused data abort (address: 0xeafffffe, size: 0x1, count: 0x2)
    Warn : memory read caused data abort (address: 0xe59ff060, size: 0x4, count: 0x1)
    Warn : memory read caused data abort (address: 0xeafffffe, size: 0x1, count: 0x2)
    Warn : memory read caused data abort (address: 0xe59ff060, size: 0x4, count: 0x1)

    0
  • #6 29 Maj 2010 23:12
    flapo213
    Poziom 21  

    Zmodyfikowałem swój program, tzn. wyrzuciłem wszystkie funkcje Freertos i wstawiłem tylko

    asm volatile ("SWI 0");

    rozwinięcie asemblerowe tego wygląda dokładnie tak

    503 asm volatile ( "SWI 0" );
    00100264: svc 0x00000000
    00100268: b 0x100278 <main+284>

    Niestety wciąż wysypuję się cały program po wykonaniu tego rozkazu.

    Co dokładnie powinno się stać po wywołaniu tej instrukcji, jak dobrze rozumiem program powinien wskoczyć do procedury obsług SWI. Czemu tak się nie dzieje?

    Czy skrypt linkera powinien zostać w jakiś sposób zmodyfikowany jakieś sekcje powinny zostać dodane?

    0
  • #7 30 Maj 2010 23:58
    flapo213
    Poziom 21  

    Sam sobie chyba odpowiem,

    niestety skrypt linkera jak również asemblerowa rozbiegówka do bani niestety !.

    Siłą rzeczy muszę nasmarować je od nowa.

    Z SWI problem rozwiązany a oto jego rozwiązanie

    aby dobrze obsłużyć wyjątek SWI należy przydzielić na stosie SVC (supervisor) trochę miejsca oraz

    swiVector: // Aktualizacja dodanie adresu procedury obsługi !!!
    LDR PC, SWI_Addr

    SWI_Addr: .word vPortYieldProcessor


    zamiast
    swiVector: // Aktualizacja dodanie adresu procedury obsługi !!!
    B vPortYieldProcessor

    i to wszystko jeśli chodzi o SWI.

    Niestety freertos na AT91SAM7S128 nie odpaliłem ciągle. Domyślam się że biblioteki freertos są dobre ale skonfigurowanie AT91SAM7S128 - skrypt i *.S to inna bajka.

    Temat zamykam.

    0