Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32][C] Debugowanie kodu przerwania w pamięci RAM

VanThor 30 Apr 2009 22:01 3260 5
  • #1
    VanThor
    Level 19  
    Witam,

    Napisałem program, w którym do odliczania czasu używam SysTick'a i przerwania od niego. Gdy skompiluję i zapiszę program do pamięci Flash, program ten działa jak należy i możliwe jest jego debugowanie. Jeśli skompiluję i wpiszę program do pamięci RAM, to program nie działa poprawnie, a debugować go można jedynie do momentu wystąpienia przerwania od SysTick'a - w tym momencie dostaję komunikat 'No source available for "" ' lub 'No source available for function "g_pfnVectors()" '. W tym pierwszym przypadku PC ma wartość spoza zakresu pamięci RAM i Flash, w drugim PC = 0x20000004.
    Sprawdzałem jak wygląda wygenerowany po kompilacji program i wszystko wydaje się być w porządku - w odpowiednim miejscu tablicy wektorów jest wpisany poprawny adres procedury obsługi przerwania SysTick'a, a kod programu jest w całości umieszczony w pamięci RAM. Nie jest to raczej problem z kompilacją, bo programy bez przerwań umieszczone w pamięci RAM działają poprawnie i mogę je debugować. Skorzystałem także z prostego programu dostępnego na stronie ST - ten program również nie działa w pamięci RAM i daje się debugować tylko do momentu wystąpienia przerwania.
    Może o czymś zapomniałem lub czegoś nie wiem?

    Używam środowiska w konfiguracji: Eclipse + CodeSourcery Lite + OpenOCD + Turtelizer2. Procesor to STM32F103RBT6.
  • #4
    Smashing
    Level 20  
    Witam
    VanThor czy poradziłeś sobie z tym problem.
    U mnie niby to samo ale...
    We flashu wszystko ładnie działa.
    W ramie:
    1. Modyfikacja skryptu linkera z flash na ram
    2. BOOT0 =1 i BOOT1= 1;
    3. W main daje NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x00);
    Hmm niby wszystko ok ale jak wkładam USB do PC (pojawia się przerwanie ) czasem mam wyjątek BusFault, we flashu nie ma problemu. Jak nie dam NVIC_SetVectorTable program staje na adresie 0x20000004
  • #5
    Smashing
    Level 20  
    Hmmm.
    Wgrałem oryginalny program z Stm32 MassStorage. vectors.c startup.S i .ld o kolegi Freddie Chopin.
    Mam obecnie dwa przerwania z Usb:
    USB_HP_CAN1_TX_IRQHandler i USB_LP_CAN1_RX0_IRQHandler ( w vectors.c było bez jedynek kolo CAN ). Zrobiłem takie coś, orginalny program
    void USB_HP_CAN1_TX_IRQHandler(void)
    {
    	CTR_HP();
    }

    na takie coś:
    void USB_HP_CAN1_TX_IRQHandler(void)
    {
    while (1)
    	   {
    	   }	
    
    //CTR_HP();
    }

    Program nie ma błędu BusFault_Handler.
    Co ciekawe jak dam tak:
    void USB_HP_CAN1_TX_IRQHandler(void)
    {
    	int zmienna;
    	int zmienna2=5;
    	zmienna = zmienna2+3;
    while (1)
    	   {
    	   }	
    
    //CTR_HP();
    }


    Znowu jest BusFault_Handler.
    Natomiast przerwanie USB_LP_CAN1_RX0_IRQHandler działa dobrze nie ma problemów. W pliku stm32f103rb_rom.ld od kolegi Freddie Chopin jest __main_stack_size = 0 - zmieniłem na 1024 i __process_stack_size =1024 i opis:
    /* Handler mode (core exceptions / interrupts) can use only main stack */.
    1. Możliwe jest ze przerwania USB_HP i USB_LP, maja rożne stack. USB high priority i USB low priority nie bardzo wiem po co są oba, treraz tylko na jednym USB_LP znajduje mi MassStorage w PC. Pisze cały czas od debug w RAM'ie
    Jak ustawie Breakpoints w USB_HP_CAN1_TX_IRQHandler to nigdy nie staje debug, tak jak by tam nigdy nie wchodził, natomiast na USB_LP jest OK

    USB_LP - w usb dla pakietów, control, interrupt i bulk
    USB_HP - dla szybszych transferow, Isochronous, bulk (ale podwoje buforowanie czyli jak endpoint ma Bank0 i Bank1

    Zmieniono:
    Ok sorki za zaśmiecanie forum, używając oryginalnego programu nie zagłębiałem się w niego, okazało się w STM3210E-EVAL używają NAND Flash dodatkowo dla dysku + karta SD. Czyli w Windzie są dwa dyski. Usuwając NAND FLASH z projektu nie ma BusFault_Handler. Czyli USB działa, a tylko to chciałem sprawdzić. Nie dochodzę dlaczego jak nie ma fizycznie NAND Flash pojawia się Error.