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

[AT91SAM7X] FreeRTOS: Zawieszanie programu przy obsłudze SPI z przerwaniami

mart_raf 07 Lip 2009 16:31 2068 1
REKLAMA
  • #1 6749212
    mart_raf
    Poziom 10  
    Posty: 23
    Witam,
    do działającego projektu chce dodać obsługę pamięci data flash przez SPI. Znalazłem gotową bibliotekę Atmela. Używam jej tak jak w przykładzie:

     
    PIO_Configure(pins, PIO_LISTSIZE(pins));
    
    //  AIC_ConfigureIT(BOARD_AT45_A_SPI_ID, 0, vSPI_ISR_Wrapper);
      AIC_ConfigureIT(BOARD_AT45_A_SPI_ID, 0, ISR_Spi);
    
      SPID_Configure(&spid, BOARD_AT45_A_SPI_BASE, BOARD_AT45_A_SPI_ID);
      SPID_ConfigureCS(&spid, BOARD_AT45_A_NPCS, AT45_CSR(BOARD_MCK, SPCK));
      AT45_Configure(&at45, &spid, BOARD_AT45_A_NPCS);
      AIC_EnableIT(BOARD_AT45_A_SPI_ID);
      
      addDebug("Detecting flash...");
      pDesc = 0;
      while (!pDesc) {
         pDesc = AT45_FindDevice(&at45, AT45_GetStatus(&at45));
      }
      addDebug("Flash found!");
    


    Jak widać SPI używa przerwań. Wykonanie programu niestety zawiesza się na undef_handler. Co może być tego przyczyną? Zauważyłem, że we FreeRTOS obudowują przerwanie tak:

    void vSPI_ISR_Wrapper(void)
    {
       portSAVE_CONTEXT();
       SPID_Handler(&spid);
       portRESTORE_CONTEXT();
    }
    

    ale gdy tak zrobie to przerwanie nie jest nigdy wykonywane.

    Zaczynam dopiero przygodę z ARM i byłbym bardzo wdzięczny za pomoc.
  • REKLAMA
  • #2 6753664
    nenpa8lo
    Poziom 17  
    Posty: 260
    Pomógł: 15
    Mam podobny problem. Zrób sobie LED on przed każdą linią w SPI_ISR_Wrapper(). U mnie program dociera do portRESTORE_CONTEXT() i tam umiera. Z dokumentacji FreeRTOS wyczytałem, że jeżeli przerwanie nie powoduje przełączania kontekstu to można sobie darować portSAVE_CONTEXT i portRESTORE_CONTEXT - normalnie je obsługiwać (wieczorem spróbuje).

    A co do undef_handler to z manuala ARM ARM:

    If the ARM processor executes a coprocessor instruction, it waits for any external coprocessor
    to acknowledge that it can execute the instruction. If no coprocessor responds, an Undefined Instruction
    exception occurs.


    Dodano po 5 [minuty]:

    A i teraz zobaczyłem:
    AIC_ConfigureIT(BOARD_AT45_A_SPI_ID, 0, ISR_Spi); 
    konfigurujesz SPI, aby używało przerwania 0 (to jest FIQ). Nie jestem pewien czy to przerwanie nie jest używane przez FreeRTOS (nigdzie nie mogłem znaleźć listy przerwań używanych przez FreeRTOS). Spróbuj zmienić np na 10 (lub jakieś inne, którego jesteś pewien, że nie jest używane).
REKLAMA