www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

uVision3
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
JohnD
Član
Član



Pridružen-a: Sob 08 Nov 2008 20:47
Prispevkov: 103
Aktiv.: 0.51
Kraj: Zasavje

PrispevekObjavljeno: Sre Sep 23, 2009 8:19 am    Naslov sporočila:   Odgovori s citatom

Alessio imel si prav. Problem je bil v startup.s datoteki, kjer se je določila premajhna velikost sklada in kot sem opazil je on že bil v priviligiranem načinu delovanja. Hvala ti. Zdaj mi program gre v task a problem se mi pojavlja, da če v tasku recimo prižgem ledico na razvojni plošči ali izpišem sporočilo na OLED zaslonu se mi zadeva ne izvede (koda se izvede a ni rezultatov) Think ... tako da se problemi kar kupičijo ampak po eni strani je to dobro, da bom vsaj bolje spoznal sistem Very Happy

Še enkrat hvala za pomoč in, če ima še kdo kakšno idejo se priporočam Anxious
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
alessio
Član
Član



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.60
Kraj: Ljubljana

PrispevekObjavljeno: Sre Sep 23, 2009 2:13 pm    Naslov sporočila:   Odgovori s citatom

Uf, daj še malo počakaj z izpisovanjem sporočil na display.
Poštimaj najprej preprosto blinkanje dveh LED-ic iz dveh task-ov,
potem pa naredi naslednje korake.

Kot si že ugotovil, si imel prej težave s stack-om, in sicer s stackom MCU-ja.
Pri RTOS-u pa imaš še stack-e taskov. Ko se boš lotil izpisovanja na display,
zagotovi temu tasku dovolj velik stack. Drugače bo rezultat nepredvidljiv,
če boš imel srečo, se ti bo aplikacija takoj skrešala. Dogaja se tudi, da se
to ne pripeti takoj, in potem imaš take probleme kot so "once in a blue moon..."

Za preprosto blinkanje LED-ic rabiš maximalno 32-64 bajtov stack-a task-a,
preveri, da imaš priključke definirane kot izhode, preveri, da vpisuješ na prave porte.

_________________
Question is more important than the answer.(Plato)
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
JohnD
Član
Član



Pridružen-a: Sob 08 Nov 2008 20:47
Prispevkov: 103
Aktiv.: 0.51
Kraj: Zasavje

PrispevekObjavljeno: Sre Sep 23, 2009 2:54 pm    Naslov sporočila:   Odgovori s citatom

Ravno prejle mi je uspelo izvajanje 5 taskov, ki so se izvajali po določenem časovnem intervalu (vTaskDelayUntil()) z isto prioriteto tako, da mi je povečevalo v vsakem tasku en števec in sem ga opazoval pod watchem. Kakeršnokoli pisanje na GPIO linije se ni izvedlo.

Zdej se lotevam kot si mi priporočil alessio, blinkanje ledic. Oziroma sem si poenostavil in želim za začetek vklopiti status ledico v enem izmed taskov. To sem storil tako, da sem si najprej naredil samo vklop ledice v main funkciji in preveril, če mi vklopi...(pač do koraka kjer bom nekaj kode dodal in se ne bo začel sistem več pravilno odzivati) Nato sem dodajal klice in vključitve dokler ne pridem do taskov. Tam mi zadeva zamrzne oz. se sploh ne začne izvajat.

Kot si dejal sem rezerviral zadosti stacka, ki je definiran v freeRTOSconfig in znaša 70 bytov. Evo primerček, ki ga postopoma gradim, da bom odkril zakaj se mi sistem preneha odzivati. In to je že korak, ko se mi je prenehal odzivati.

Koda:

#include <stdio.h>

#include "lm3s6965.h"   
#include "FreeRTOS.h"
#include "Task.h"

#define mainBASIC_STACK_SIZE ( configMINIMAL_STACK_SIZE )

#define main_TASK1_PRIORITY    ( tskIDLE_PRIORITY + 5 )

void vApplicationTickHook(void);

static void main_Task1( void *pvParameters );

int main(void)
{
  SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;

  GPIO_PORTF_DIR_R = 0x01;
  GPIO_PORTF_DEN_R = 0x01;

  xTaskCreate( main_Task1,"TASK1",mainBASIC_STACK_SIZE,NULL,main_TASK1_PRIORITY,NULL);

  vTaskStartScheduler();

  return 0;
}

void vApplicationTickHook(void)
{
}

void main_Task1( void *pvParameters )
{

for(;;)
{
 GPIO_PORTF_DATA_R |= 0x01;
}

}


Hvala alessio za pomoč in kot kaže bo tudi že "once in a blue moon..." preden mi bo uspelo tole usposobiti Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
alessio
Član
Član



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.60
Kraj: Ljubljana

PrispevekObjavljeno: Sre Sep 23, 2009 4:00 pm    Naslov sporočila:   Odgovori s citatom

JohnD je napisal/a:
Kot si dejal sem rezerviral zadosti stacka, ki je definiran v freeRTOSconfig in znaša 70 bytov. Evo primerček, ki ga postopoma gradim, da bom odkril zakaj se mi sistem preneha odzivati. In to je že korak, ko se mi je prenehal odzivati.


Kaj misliš s tem, da se ti je sistem prenehal odzivati?

Daj najprej preveri, če ti LED-ica blinka s spodnjim programom:

Koda:

#include <stdio.h>

#include "lm3s6965.h"   
#include "FreeRTOS.h"
#include "Task.h"

#define mainBASIC_STACK_SIZE ( configMINIMAL_STACK_SIZE )

#define main_TASK1_PRIORITY    ( tskIDLE_PRIORITY + 5 )

void vApplicationTickHook(void);

static void main_Task1( void *pvParameters );

int main(void)
{

   volatile unsigned long ulLoop;

  SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;

  GPIO_PORTF_DIR_R = 0x01;
  GPIO_PORTF_DEN_R = 0x01;

    //
    // Loop forever.
    //
    while(1)
    {
        //
        // Turn on the LED.
        //
        GPIO_PORTF_DATA_R |= 0x01;

        //
        // Delay for a bit.
        //
        for(ulLoop = 0; ulLoop < 200000; ulLoop++)
        {
        }

        //
        // Turn off the LED.
        //
        GPIO_PORTF_DATA_R &= ~(0x01);

        //
        // Delay for a bit.
        //
        for(ulLoop = 0; ulLoop < 200000; ulLoop++)
        {
        }
    }


  xTaskCreate( main_Task1,"TASK1",mainBASIC_STACK_SIZE,NULL,main_TASK1_PRIORITY,NULL);

  vTaskStartScheduler();

  return 0;
}

void vApplicationTickHook(void)
{
}

void main_Task1( void *pvParameters )
{

for(;;)
{
 GPIO_PORTF_DATA_R |= 0x01;
}

}


Do funkcije xTaskCreate() program ne pride, ker je pred tem v while zanki,
LED-ica pa mora utripati. Ali je temu tako?


PS: Ne vem zakaj, ampak sem predpostavljal prej, da delaš z ARM7, ne pa CM3.
Komentarje v zvezi z stack-i MCU-ja in mode-i bi morali biti v tem primeru mogoče
malo prirejeni, ideja pa je enaka.

_________________
Question is more important than the answer.(Plato)
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
JohnD
Član
Član



Pridružen-a: Sob 08 Nov 2008 20:47
Prispevkov: 103
Aktiv.: 0.51
Kraj: Zasavje

PrispevekObjavljeno: Sre Sep 23, 2009 5:06 pm    Naslov sporočila:   Odgovori s citatom

Pardon, včasih se malo nerodno izražam...

S tem sem mislil, da ko postavim v prve vrstice main-a breakpointe sploh ne pride do tja med debagiranjem ampak se mi zacikla nekje v programu oz. te točke sploh ne vidim v c kodi ampak le vrstico v assemblerju, ki mi ga generira prevajalnik. Na žalost ne morem zdajle pripeti tiste vrstice, ker nimam programa in razvojne plošče pri sebi. To se mi je začelo dogajati, ko sem začel v program vključevati task. Kodo, ki si mi jo prilepil bom takoj preizkusil samo, da pridem do plošče. Ampak skoraj dvomim, da mi bo delovala saj sem na podoben princip želel pred taskom vklopiti ledico in mi ni izvedlo operacije ali pa sploh ni prišlo do tja. Kot kaže tiči še problem v kakšnem stack-u ali kej podobnega (mogoče ga tudi kej zmoti pri includu portmacro.h kjer sem izrecno uporabil tistega, ki je uporabljen na primeru), da ga zmede.

Alessi hvala ti še enkrat za pomoč!

LP Jani
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
alessio
Član
Član



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.60
Kraj: Ljubljana

PrispevekObjavljeno: Sre Sep 23, 2009 5:23 pm    Naslov sporočila:   Odgovori s citatom

Glede na to, da delaš z uVision-om, uporabi simulator,
pri katerem lahko stepaš po kodi prav od začetka izvajanja programa
in tako hitro uvidiš, kje si ga pobiksal.

~Aleš

_________________
Question is more important than the answer.(Plato)
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
JohnD
Član
Član



Pridružen-a: Sob 08 Nov 2008 20:47
Prispevkov: 103
Aktiv.: 0.51
Kraj: Zasavje

PrispevekObjavljeno: Čet Sep 24, 2009 6:57 am    Naslov sporočila:   Odgovori s citatom

Sem uporabil kodo, ki si mi jo priporočal in rezultat je isti. Vrže me samo v vrstico, ki je v assemblerju, ki ga ne poznam. Malo sklepam, da gre kot kaže za nek breakpoint.

Koda:
0x0000170E BEAB      BKPT     0xAB


Če pa zadevo poženem v simulatorju mi pa deluje normalno Shocked

Bom še enkrat od začeka ustvaril projekt in postopoma dodajal funkcije (prižgal ledico, dodal task...) in upam, da našel izvor napake.

LP Jani
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
JohnD
Član
Član



Pridružen-a: Sob 08 Nov 2008 20:47
Prispevkov: 103
Aktiv.: 0.51
Kraj: Zasavje

PrispevekObjavljeno: Čet Sep 24, 2009 1:22 pm    Naslov sporočila:   Odgovori s citatom

Našel sem enega izmed mnogih vzrokov mojih problemov. A zdej ga pa ne znam rešit Brick wall

Problem se nahaja v datoteki port.c, ko se omogočijo zopet prekinitve

Koda:
/* Make PendSV, CallSV and SysTick the lowest priority interrupts. */
   *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI;
   *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI;
   *(portNVIC_SYSPRI1) |= portNVIC_SVCALL_PRI;

   /* Start the first task. */
   prvSetPSP( 0 );
   prvSetMSP( *((unsigned portLONG *) 0 ) );
   *(portNVIC_INT_CTRL) |= portNVIC_PENDSVSET;

   /* Enable interrupts */
   portENABLE_INTERRUPTS();

   /* Should not get here! */
   return 0;


Ko bi se mogle vključiti se v simulatorju sproži prekinitev in se začne izvajat nekje drugje a na plošči on pride v točko kamor ne bi smel. Brick wall

Hvala!

LP Jani
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 7 dni


Powered by phpBB © 2001, 2005 phpBB Group