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: Pet Sep 18, 2009 5:42 pm Naslov sporočila: uVision3 |
|
|
Zdravo!
Na področju programiranja mikrokontrolerjev sem popolen začetnik ampak imam željo, da se bi naučil. Zato se učim na Luminary EKI-LM3S6965 razvojni plošči. Za IDE uporabljam uVision3 in, ko si želim kodo prevesti in naložiti na razvojno ploščo mi pri prevajanju javi napako, da je velikost programa presegla omejitev 32kB. Program sam je velik okoli 7kB ampak problem je v tem, da se mi generira preko 30kB ZI-data (zero initialized data). Od kje izvor teh podatkov? Ali so potrebni za nalaganje programa in kako se naj jih rešim?
Hvala! |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Sep 18, 2009 6:46 pm Naslov sporočila: |
|
|
Imaš morda v programu kje kako ogromno statično polje: static neki[xyz]; ? |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Pet Sep 18, 2009 6:53 pm Naslov sporočila: |
|
|
const char make_proggy_look_bigger[30000]; _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Pet Sep 18, 2009 7:38 pm Naslov sporočila: |
|
|
proggy is big and will grow
Bom moral preveriti, ker je program dosti razvejan, ko sem moral vključiti en kup includov (freeRTOS) zato da želim pognati 5 preprostih taskov. Za začetnika pač kar velik zalogaj ampak taka je naloga... A mogoče obstaja kaka bližnjica kako bi našel takšen array? |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Pet Sep 18, 2009 7:45 pm Naslov sporočila: |
|
|
Poglej malo datoteke, ki jih generira prevajalnik...nekje ziher piše, kaj je tistih 30kb _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Pet Sep 18, 2009 8:34 pm Naslov sporočila: |
|
|
Hja, če si FreeRTOS includal, potem je marsikaj lahko nasmetilo noter. Malo poglej katere stvari pri FreeRTOS dejansko potrebuješ in pusti mu da kliče samo tiste. Lahko poskusiš tudi z optimizacijo kode pri compilanju, da ti dejansko pomeče ven funkcije in spremenljivke, ki jih nikoli ne kličeš. |
|
Nazaj na vrh |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Pet Sep 18, 2009 9:38 pm Naslov sporočila: |
|
|
Zanimivo je tudi to, da se ista napaka (pač da se ustvari tolikšna količina ZI podatkov) tudi pri prevajanju testnega programa, ki je namenjen demonstraciji FreeRTOS-a na tej razvojni plošči  |
|
Nazaj na vrh |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Pon Sep 21, 2009 2:59 pm Naslov sporočila: |
|
|
Zdravo!
Ugotovil sem, da se teh ZI podatkov ne bom mogel znebiti (ker jih ustvari freeRTOS) in zato bom uporabljal namesto Keil-ovega compajlerja in linkerja gcc in direktno nalagal binearno datoteko na ploščo. Zato sem preuredil projekt in, ko poženem gcc mi javi napako:
port.c:123: error: parse error before "void"
Gre za naslednje vrstice:
__asm void prvSetMSP( unsigned long ulValue )
{
PRESERVE8
msr msp, r0
bx lr;
}
Kaj mu tukaj ne "paše" ker v primerih na netu je podobna koda le z navadnimi oklepaji in tudi tista varianta mu ne ustreza?
Hvala za pomoč!
LP, Jani |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Sep 21, 2009 3:45 pm Naslov sporočila: |
|
|
uVisionov compiler in gcc ne razumeta enako inline assemblerja.
Najdi example za gcc, ali pa na roke popravi vrstice z assemblerjem. Glede na tvoje prvo sporočilo, naredi prvo. Kolikor vem ima freeRTOS narejene example ki se compilajo z gcc, kot tudi tiste za uVision.
Za pomoč pri ugotavljanju kaj zaseda največ pomnilnika, ti je lahko v pomoč tudi *.map file (Dvoklik na root mapo v Project Workspace->Files) |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.08 Kraj: Kobarid
|
Objavljeno: Pon Sep 21, 2009 9:47 pm Naslov sporočila: |
|
|
Zaklenil sem flash na LPC2138 proti branju. Sedaj pa ne morem dostopati do LPCja preko ULINK2 programatorja. Niti erase ne prime. Kakšna ideja? Preko ISP vmesnika vem, da ni težav zbrisati flash in na novo naložiti program.... _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Sep 21, 2009 10:48 pm Naslov sporočila: |
|
|
SimonS je napisal/a: |
Zaklenil sem flash na LPC2138 proti branju. Sedaj pa ne morem dostopati do LPCja preko ULINK2 programatorja. Niti erase ne prime. Kakšna ideja? Preko ISP vmesnika vem, da ni težav zbrisati flash in na novo naložiti program.... |
Hkrati si zaklenil tudi JTAG debug port. Brez ISPja (dostopa do bootloaderja) ne bo šlo. |
|
Nazaj na vrh |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Tor Sep 22, 2009 7:15 am Naslov sporočila: |
|
|
Hvala umnik se vidi da obvladaš stroko
V datoteki sem našel izvor svojih težav in ta je bil v načinu kako rtos upravlja pomnilnik. S tem ko vključiš datoteko heap_2.c si rezervira ogromno prostora. Zdej sem izbral alternativo in zadeva ne generira več tolikšno količino ZI podatkov. Kar se tiče pa inline assemblerja mi bo pa še gotovo prav prišlo, ko mi bo program presegel 32kB.
Ampak verjetno tukaj še gotovo ni konec mojih problemov tako, da se bom verjetno še kej javil  |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.08 Kraj: Kobarid
|
Objavljeno: Tor Sep 22, 2009 10:54 am Naslov sporočila: |
|
|
Umnik je napisal/a: |
SimonS je napisal/a: |
Zaklenil sem flash na LPC2138 proti branju. Sedaj pa ne morem dostopati do LPCja preko ULINK2 programatorja. Niti erase ne prime. Kakšna ideja? Preko ISP vmesnika vem, da ni težav zbrisati flash in na novo naložiti program.... |
Hkrati si zaklenil tudi JTAG debug port. Brez ISPja (dostopa do bootloaderja) ne bo šlo. |
O ti šment!
Hvala za informacijo! _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
JohnD Član

Pridružen-a: Sob 08 Nov 2008 20:47 Prispevkov: 103 Aktiv.: 0.51 Kraj: Zasavje
|
Objavljeno: Tor Sep 22, 2009 2:22 pm Naslov sporočila: |
|
|
Za začetek sem si spisal en preprost programček z enim samim opravilom.
Koda: |
static void blink_Task( void *pvParameters );
void prvSetupHardware(void);
void vApplicationTickHook( void );
int main (void)
{
prvSetupHardware();
SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;
GPIO_PORTF_DIR_R = 0x01;
GPIO_PORTF_DEN_R = 0x01;
xTaskCreate( blink_Task,( signed portCHAR * ) "TASK",5000,NULL,blink_TASK_PRIORITY,NULL);
vTaskStartScheduler();
return 0;
}
void blink_Task( void *pvParameters )
{
int [slovenščina je zame španska vas];
for(;;)
{
for([slovenščina je zame španska vas]=0;[slovenščina je zame španska vas]<20000;[slovenščina je zame španska vas]++)
GPIO_PORTF_DATA_R |= 0x01;
}
} |
Zadeva je preprosta in naj bi mogla najverjetneje delat Ampak bilo bi preprosto, da bi zadeva delala. Zato sem preletel z debugerjem izvajanje programa in se mi zadeva ustavi po tem, ko RTOS koda omogoči prekinitve. Program še ne začne izvajanje opravila.
Koda: |
/* 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; |
Program se nato zacikla v naslednji vrstici, ki se generira ob ustvarjenju projekta
Koda: |
;******************************************************************************
;
; This is the code that gets called when the processor receives an unexpected
; interrupt. This simply enters an infinite loop, preserving the system state
; for examination by a debugger.
;
;******************************************************************************
IntDefaultHandler
B IntDefaultHandler |
Bi mogoče mi znal vsaj namigniti kaj bi lahko bilo narobe in kaj bi lahko še preveril, ker mi že počasi zmanjkuje idej?
PS: Aja pa ISR bit CPSR ima vrednost 0 tako da verjetno ni prišlo do prekinitve. |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.60 Kraj: Ljubljana
|
Objavljeno: Tor Sep 22, 2009 3:51 pm Naslov sporočila: |
|
|
V katerem mode-u si, ko poženeš scheduler? To lahko preveriš v registru CPSR_c.
Moraš biti v supervisor mode-u. Standardni primeri startajo main v user mode-u.
Predno kličeš main(), moraš v startup.s ali crt0.s imeti nekaj v tem smislu:
Koda: |
; Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
; Enter the C code
IMPORT __main
LDR R0, =__main
BX R0 |
_________________ Question is more important than the answer.(Plato) |
|
Nazaj na vrh |
|
 |
|