 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Sre Sep 23, 2009 8:19 am Naslov sporočila: |
|
|
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) ... tako da se problemi kar kupičijo ampak po eni strani je to dobro, da bom vsaj bolje spoznal sistem
Še enkrat hvala za pomoč in, če ima še kdo kakšno idejo se priporočam  |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.60 Kraj: Ljubljana
|
Objavljeno: Sre Sep 23, 2009 2:13 pm Naslov sporočila: |
|
|
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 |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Sre Sep 23, 2009 2:54 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.60 Kraj: Ljubljana
|
Objavljeno: Sre Sep 23, 2009 4:00 pm Naslov sporočila: |
|
|
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 |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Sre Sep 23, 2009 5:06 pm Naslov sporočila: |
|
|
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 |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.60 Kraj: Ljubljana
|
Objavljeno: Sre Sep 23, 2009 5:23 pm Naslov sporočila: |
|
|
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 |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Čet Sep 24, 2009 6:57 am Naslov sporočila: |
|
|
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
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 |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Čet Sep 24, 2009 1:22 pm Naslov sporočila: |
|
|
Našel sem enega izmed mnogih vzrokov mojih problemov. A zdej ga pa ne znam rešit
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.
Hvala!
LP Jani |
|
Nazaj na vrh |
|
 |
|
|
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
|