FAQ | Points | Add... | Recent posts | Search | Register | Log in


Funkcja w RAMie nie działa. Ręce opadają.


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> Funkcja w RAMie nie działa. Ręce opadają.
Author
Message
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#1 Post from the author of the topic 13 Mar 2010 15:53   

Funkcja w RAMie nie działa. Ręce opadają.


Witam.
Mam problem z funkcjami w RAMie.
Chcę zrobić update firmwaru. No więc zrobiłem funkcję updatującą, oraz funkcję piszącą text po LCD. Mam wiele funkcji piszących text, ale ta jedna ma być specjalna bo być w RAMie. Funkcja updatująca firmware oczywiście też.
No i okazało się że to nie działa.
Albo update zawiesza się zaraz po skasowaniu FLASHa (co wskazuje na to że ta funkcja wcale nie trafia do RAMu), albo jak chcę dodać wyświetlanie komunikatów za pomocą tej funkcji piszącej to wywala mi jakieś dziwne błędy przy próbie kompilacji.
Więc od rana robiew testy i doszedłem do takich wniosków:
1. Zmiana jakiejś funkcji na funkcję w RAMie najwidoczniej w ogóle nie działa.
2. Jeżeli funkcja zadeklarowana jako funkcja w RAMie będzie wywołana więcej niż 1 raz, nie ważne skąd, z przerwania, z programu głównego, z przerwania FIQ, to wywala mi błędy przy kompilacji.
Przykłady na zupełnie innych funkcjach:
1: Normalna funkcja (oczywiście działająca):
Funkcja w RAMie nie działa. Ręce opadają.


2. Przerobiona na RAM (też działa ale podejrzewam że wcale nie trafia do RAMu):
Funkcja w RAMie nie działa. Ręce opadają.


3. Inna funkcja. Ta jest wywoływana z 8 razy. I już kompilacja nie powodzi się:
Funkcja w RAMie nie działa. Ręce opadają.


Nawet nie wiem co mam umieścić. Cały kod źródłowy? 7500linijek?
Próbowałem bez align. Albo z innymi align. W pliku ld w sekcji data też zmieniałem parametr align. Z 4 na 8 albo 16 i dalej nic.
Gdzieś znalazłem informacje że kod ma być z sekcji text. Zmieniłem. Wtedy program kompiluje się bez błędów, ale w pliku lss widzę że nadal kod jest we FLASHu, a program dalej nie działa.

Ręce opadają. Pomoże ktoś?
Back to top
   
Zbych_
Poziom 17
Poziom 17


Joined: 06 Nov 2003
Posts: 429
Location: Kuala Lumpur

Post#2 13 Mar 2010 17:55helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Na początek odszukaj nazwy funkcji w pliku *.map (dodaj opcję -Map=$blabla.map,--cref do linkowania jeśli jej nie masz), żeby się upewnić, że adresy są z zakresu zajmowanego przez RAM. Na zrzutach ekranowych widać ostrzeżenie, że kompilator ignoruje atrybut z sekcją.
Miałem podobny problem, dlatego zamiast umieszczać funkcje w sekcji data, stworzyłem nową sekcję specjalnie dla funkcji. Wymaga to oczywiście grzebnięcia w skrypcie linkera i pliku crt. Skrótowo opisałem to tutaj:

http://groups.google.com/group/pl.comp.lang.c/msg/a7c53621c9865cd2

PS. masz strasznie dużo warningów. Łatwo w tym gąszczu przegapić ważne rzeczy.
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#3 Post from the author of the topic 13 Mar 2010 18:21   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Zbych_ wrote:
dodaj opcję -Map=$blabla.map,--cref do linkowania jeśli jej nie masz

Nie bardzo rozumiem. Gdzie mam to dodać?
W ogóle to zapomniałem napisać.
ARM7-TDMI, Eclipse, CodeSourcery, extremalnie zmodyfikowane przykłady Freddiego Chopina.


Zbych_ wrote:
PS. masz strasznie dużo warningów. Łatwo w tym gąszczu przegapić ważne rzeczy.

Dużo to ich było wcześniej ;) Ze 100. Teraz zostało tylko 8. Nieużywane funkcje. Nieużywane zmienne. No i ten niezgodny typ zmiennej do funkcji sprintf który jednak nie przeszkadza w działaniu. Chyba nie ma się czym przejmować?

Dodano po 10 [minuty]:

Mam takie coś:
Code:

# flags for linker
LINKER_FLAGS = -T$(LINKER_SCRIPT) -g -Wl,-Map=$(OUTPUT_DIR)$(PROJECT).map,--cref,--no-warn-mismatch


Ale w pliku map funkcji nie mam.
Już wcześniej jej tam szukałem ale nie znajdując zajrzałem do pliku lss i tam zobaczyłem że funkcja ląduje we Flashu.

Sposób z nową sekcją może i jest dobry. Ale ja nie chcę na nowo odkrywać koła. Sekcja data jest już gotowa. I służy to tego żeby w niej coś umieszczać. Więc ja po prostu chcę tam coś umieścić.

Dodawałem też atrybut long_call ale kompilator w ogóle nie wie co to jest.
Back to top
   
albertb
Poziom 22
Poziom 22


Joined: 04 May 2004
Posts: 1875
Location: Nowy Targ

Post#4 13 Mar 2010 18:42helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


atom1477 wrote:

Albo update zawiesza się zaraz po skasowaniu FLASHa (co wskazuje na to że ta funkcja wcale nie trafia do RAMu),

A może przerwań zapomniałeś wyłączyć? Albo po updacie nowe siedzą gdzie indziej niż wektory wskazują?
atom1477 wrote:

albo jak chcę dodać wyświetlanie komunikatów za pomocą tej funkcji piszącej to wywala mi jakieś dziwne błędy przy próbie kompilacji.

To trzeba doprowadzić do stanu, kiedy błędów nie będzie.
atom1477 wrote:

Więc od rana robiew testy i doszedłem do takich wniosków:
1. Zmiana jakiejś funkcji na funkcję w RAMie najwidoczniej w ogóle nie działa.

A znasz kawał, jak się baca rozwodził?

Albert
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#5 Post from the author of the topic 13 Mar 2010 20:14   

Re: Funkcja w RAMie nie działa. Ręce opadają.


albertb wrote:
A może przerwań zapomniałeś wyłączyć? Albo po updacie nowe siedzą gdzie indziej niż wektory wskazują?

1. Przerwania wyłączam.
2. Po zaprogramowaniu procesor ma wykonać skok pod adres 0. Co akurat w ARMie nie jest do końca pełnym resetem, ale zawsze to coś. Procesor jest w trybie System więc po skoku pod adres 0 da radę wszystko na nowo poustawiać.
3. Procesor nie dochodzi do tego skoku. Zawiesza się wcześniej. Nawet jak by wektory się nie zgadzały i nie wiem co jeszcze się nie zgadzało, to po twardym resecie (nowy) program powinien jednak zadziałać. A nie działa. Mam czystego Flasha. Stąd wniosek że funkcja jest we Flashu. Bo jak by była w RAMie to procesor po skasowaniu Flasha wracał by do RAMu i wykonywał dalej tą funkcję (programował by Flasha). A nie idzie dalej. Czyli wraca do Flasha. Właśnie skasowanego Flasha. To znaczy tak myślę.
Dodam że jak kasuję mniejszą ilość sektorów (inne sektory niż te w których jest funkcja updatująca firmware) to wszystko działa. Czyli same komendy IAP na pewno działają.

albertb wrote:
To trzeba doprowadzić do stanu, kiedy błędów nie będzie.

Co Ty powiesz ;) No wiem i o to mi chodzi ;) Ale na razie jedynym sposobem wyeliminowania błędów jest jednokrotne wywoływanie funkcji piszącej. Mam na myśli z jednego miejsca programu. W pętli na przykład to mogę ją wywoływać wiele razy. Byłe było tylko jedno wywołanie w tej pętli.

albertb wrote:
A znasz kawał, jak się baca rozwodził?

No właśnie poznałem ;) Ale związku nie widzę.

Dodano po 8 [minuty]:

Zacznijmy od tego czy sposób zaatrybutowania funkcji w RAMie jest właściwy. Jest?

Dodano po 46 [minuty]:

To żaden dowód. Mogłem zrobić fotomontaż w Paincie ;)
Ale jak mi wierzycie to proszę:
Funkcja w RAMie nie działa. Ręce opadają.

Funkcja w RAMie nie działa. Ręce opadają.

To że sprintf jest we Flashu pomińmy (nie wywołuję go po skasowaniu flasha tylko wszystkie napisy przygotowuję przez skasowaniem).
Zauważyłem też że na optymalizacji równej O0 błąd jest wywalany nie przez funkcję piszącą a przez sprinfa.
Code:

**** Build of configuration Default for project Komputer_pokladowy_silnik_paletizet ****

cs-make all
Assembling file: default_handler.s
arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=arm7tdmi-s -g -ggdb3 -Wa,-amhls=./out/default_handler.lst  -MD -MP -MF ./out/default_handler.d -I .  default_handler.s -o out/default_handler.o
 
Assembling file: startup.s
arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=arm7tdmi-s -g -ggdb3 -Wa,-amhls=./out/startup.lst  -MD -MP -MF ./out/startup.d -I .  startup.s -o out/startup.o
 
Assembling file: vectors.s
arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=arm7tdmi-s -g -ggdb3 -Wa,-amhls=./out/vectors.lst  -MD -MP -MF ./out/vectors.d -I .  vectors.s -o out/vectors.o
 
Compiling file: fattime.c
arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -O0 -Wall -Wstrict-prototypes -Wextra -g -ggdb3 -fverbose-asm -Wa,-ahlms=./out/fattime.lst  -MD -MP -MF ./out/fattime.d -I .  fattime.c -o out/fattime.o
 
Compiling file: ff.c
arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -O0 -Wall -Wstrict-prototypes -Wextra -g -ggdb3 -fverbose-asm -Wa,-ahlms=./out/ff.lst  -MD -MP -MF ./out/ff.d -I .  ff.c -o out/ff.o
 
Compiling file: main.c
arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -O0 -Wall -Wstrict-prototypes -Wextra -g -ggdb3 -fverbose-asm -Wa,-ahlms=./out/main.lst  -MD -MP -MF ./out/main.d -I .  main.c -o out/main.o
main.c: In function 'lcd_LNBU':
main.c:5987: warning: format '%d' expects type 'int', but argument 3 has type 'uint32_t'
main.c:5987: warning: format '%d' expects type 'int', but argument 3 has type 'uint32_t'
main.c: In function 'Firmware_update':
main.c:7233: warning: unused variable 'i'
main.c: At top level:
sd_spi_lpc2000.cc:374: warning: 'rcvr_spi_m' defined but not used
main.c:1296: warning: 'uart1_send' defined but not used
main.c:1302: warning: 'uart2_send' defined but not used
main.c:7073: warning: 'Sprawdz_alarm' defined but not used
C:\DOCUME~1\ja\USTAWI~1\Temp\ccgGO6XI.s: Assembler messages:
C:\DOCUME~1\ja\USTAWI~1\Temp\ccgGO6XI.s:231741: Warning: ignoring changed section attributes for .data
 
Compiling file: syscalls.c
arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -O0 -Wall -Wstrict-prototypes -Wextra -g -ggdb3 -fverbose-asm -Wa,-ahlms=./out/syscalls.lst  -MD -MP -MF ./out/syscalls.d -I .  syscalls.c -o out/syscalls.o
syscalls.c:96: warning: unused parameter 'r'
syscalls.c:96: warning: unused parameter 'file'
syscalls.c:148: warning: conflicting types for built-in function '_exit'
 
Linking target: lpc2478_blink_led.elf
arm-none-eabi-g++ -mcpu=arm7tdmi-s -Tlpc2478_rom.ld -g -Wl,-Map=./out/lpc2478_blink_led.map,--cref,--no-warn-mismatch -nostartfiles  ./out/default_handler.o ./out/startup.o ./out/vectors.o ./out/fattime.o ./out/ff.o ./out/main.o ./out/syscalls.o   -lm -o out/lpc2478_blink_led.elf
./out/main.o: In function `Firmware_update':
F:\Software\ARM_Eclipse\Komputer_pokladowy_silnik_paletizet/main.c:7241: relocation truncated to fit: R_ARM_CALL against symbol `memcpy' defined in .text section in d:/program files/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib\libc.a(lib_a-memcpy.o)
collect2: ld returned 1 exit status
cs-make: *** [out/lpc2478_blink_led.elf] Error 1


No i trudno powiedzieć że ręce nie opadają.
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#6 13 Mar 2010 20:48helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Zastanawiam się co masz w skrypcie linkera. Definiujesz funkcje w ramie, a RAM jakie atrybuty ma?
Nie wiem na ile to jest aktualne, ale sprawdź jak to się robi Link

Ważny jest chyba atrybut long_call ponieważ standardowy skok B, BL ma zakres ±32MB a RAM jest "trochę" dalej (1GB)
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#7 Post from the author of the topic 13 Mar 2010 20:55   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Ważniejsze rzeczy poza kodem źródłowym.
A to co podesłałeś już przeglądam.

michalko12 wrote:
Ważny jest chyba atrybut long_call ponieważ standardowy skok B, BL ma zakres ±32MB a RAM jest "trochę" dalej (1GB)

Tylko że tak jak mówiłem long_call coś nie podoba się kompilatorowi.
Jedno wywołanie funkcji Pisz_32x32_transparent_ram. Dodaję atrybut long_call i mam:

Funkcja w RAMie nie działa. Ręce opadają.

Code:
**** Build of configuration Default for project Komputer_pokladowy_silnik_paletizet ****

cs-make all
Compiling file: main.c
arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -Os -Wall -Wstrict-prototypes -Wextra -g -ggdb3 -fverbose-asm -Wa,-ahlms=./out/main.lst  -MD -MP -MF ./out/main.d -I .  main.c -o out/main.o
main.c:1834: error: conflicting types for 'Pisz_32x32_transparent_ram'
main.c:89: error: previous declaration of 'Pisz_32x32_transparent_ram' was here
main.c: In function 'lcd_LNBU':
main.c:5987: warning: format '%d' expects type 'int', but argument 3 has type 'uint32_t'
main.c:5987: warning: format '%d' expects type 'int', but argument 3 has type 'uint32_t'
main.c: In function 'Firmware_update':
main.c:7233: warning: unused variable 'i'
cs-make: *** [out/main.o] Error 1




~Code.rar
 Description:
 n/a

Download
 Filename:  ~Code.rar
 Contents:  
 Filesize:  7.8 KB
 Punkty:  0

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 13 Mar 2010 20:55   





Back to top
   
Zbych_
Poziom 17
Poziom 17


Joined: 06 Nov 2003
Posts: 429
Location: Kuala Lumpur

Post#8 13 Mar 2010 21:21helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Przykład od michalko12, robi to co ci na początku napisałem. Tworzona jest dodatkowa sekcja fastrun (w skrypcie linkera) i w tej sekcji są umieszczane funkcje. Sprytne jest umieszczenie tej sekcji wewnątrz sekcji data, co pozwala na pominięcie modyfikacji pliku crt.
Back to top
   
albertb
Poziom 22
Poziom 22


Joined: 04 May 2004
Posts: 1875
Location: Nowy Targ

Post#9 13 Mar 2010 21:24helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


atom1477 wrote:

3. Procesor nie dochodzi do tego skoku. Zawiesza się wcześniej.
...
Dodam że jak kasuję mniejszą ilość sektorów (inne sektory niż te w których jest funkcja updatująca firmware) to wszystko działa. Czyli same komendy IAP na pewno działają.

IAP używa RAM. Nie nadpisuje Ci czegoś?
atom1477 wrote:

Zacznijmy od tego czy sposób zaatrybutowania funkcji w RAMie jest właściwy. Jest?

Dla mnie nie. Bo ja w .data nie chcę kodu. Ty chcesz. Czy tam trafia sprawdź. Zbych podał Ci jak. Atrybut lub opcja kompilacji z long calls jest niezbędna.

Albert
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#10 13 Mar 2010 21:27helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Zrobiłem test na przykładzie z innego wątku i to działa
Code:
void __attribute__ ((long_call, section (".data"))) Delay1(unsigned int del_time);

void __attribute__ ((long_call, section (".data"))) Delay1(unsigned int del_time)
{
   for(unsigned int abc=0;abc<del_time;abc++);
   IO1PIN   ^=(1<<17);
}




tmp.zip
 Description:
 n/a

Download
 Filename:  tmp.zip
 Contents:  
 Filesize:  26.21 KB
 Punkty:  0.00

Back to top
   
Zbych_
Poziom 17
Poziom 17


Joined: 06 Nov 2003
Posts: 429
Location: Kuala Lumpur

Post#11 13 Mar 2010 21:30helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


michalko12 wrote:
Zrobiłem test na przykładzie z innego wątku i to działa


A spróbuj dodać pod spodem drugą funkcję umieszczoną w RAMie.
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#12 Post from the author of the topic 13 Mar 2010 21:38   

Re: Funkcja w RAMie nie działa. Ręce opadają.


albertb wrote:

atom1477 wrote:

Zacznijmy od tego czy sposób zaatrybutowania funkcji w RAMie jest właściwy. Jest?

Dla mnie nie. Bo ja w .data nie chcę kodu. Ty chcesz.

Miałem na myśli zgodność ze sposobem deklarowania tego, a nie o poprawność polityczną.

No mi kod w sekcji data by nie przeszkadzał.
Ale jeżeli sposób z umieszczeniem nowej sekcji wewnątrz sekcji data będzie dobrym według Was rozwiązaniem to ok.
Będzie i po Waszemu i po mojemu (bo koniec końców będzie to sekcja data) ;)
Mam może z 1kB zmiennych. Kilka kB stosu. Ciężko było by coś nadpisać w RAMie skoro mam aż 64kB RAMu.
Oczywiście tak na siłę to łatwo coś nadpisać. Ale kompilator chyba dba o rozmieszczenie wszystkiego żeby się samo z siebie nie nadpisywało?
Górne 32B RAMu jest wolne. Wcześniej mi IAP żadnych błędów nie powodowało. Więc i teraz nie powinno.
Ale to nie może być problem. Problemem jest to że to się w ogóle nie kompiluje.
Ale zapominamy o tym. Dodam sobie nową sekcję wewnątrz sekcji data.


albertb wrote:
Dla mnie nie. Bo ja w .data nie chcę kodu. Ty chcesz. Czy tam trafia sprawdź. Zbych podał Ci jak.

No będzie ciężko. Bo podane przez Zbycha parametry mam podane, ale mimo to do pliku map nie trafia informacja o miejscu umieszczenia funkcji.
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#13 13 Mar 2010 21:38helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Zbych_ wrote:
michalko12 wrote:
Zrobiłem test na przykładzie z innego wątku i to działa


A spróbuj dodać pod spodem drugą funkcję umieszczoną w RAMie.


Działa, ale z warningiem assemblera. Warning występuje w pierwszym i drugim przypadku.


Code:
#include "LPC214x.h"

void Timer0Handler (void) __attribute__((interrupt("IRQ")));
void InitTimer0(void);
void __attribute__ ((long_call, section (".data"))) Delay1(unsigned int del_time);
void __attribute__ ((long_call, section (".data"))) Delay2(unsigned int del_time);

void __attribute__ ((long_call, section (".data"))) Delay1(unsigned int del_time)
{
   for(unsigned int abc=0;abc<del_time;abc++);
   IO1PIN   ^=(1<<17);
}


int main(void)
{
    IO1DIR = (1<<16) |(1<<17) | (1<<18);
    InitTimer0();
    while (1);
}

void Timer0Handler(void)
{

   IO1PIN   ^=(1<<16);
   Delay1 (200);
   Delay2 (1000);
   T0IR = 1;
    VICVectAddr = 0;
}

void InitTimer0(void)
{
   T0PR = 0;   //Prescale Register
   T0MCR = 3;   //Match Control Register
   T0MR0 = 60000000;
   T0TCR = 2;   //Counter Reset
   T0TCR = 1;   //Counter Enable
   VICVectAddr0 = (unsigned int)Timer0Handler;
   VICVectCntl0 = (1<<5)|4 ;
   VICIntEnable |= (1<<4);
}
void __attribute__ ((long_call, section (".data"))) Delay2(unsigned int del_time)
{
   for(unsigned int abc=0;abc<del_time;abc++);
   IO1PIN   ^=(1<<18);
}


Quote:

> "make" all
arm-none-eabi-gcc -M -Wall -std=gnu99 -Os -mcpu=arm7tdmi-s -gstabs main.c > main.dep.$$; \
sed 's,\(main\)\.o[ :]*,\1.o main.dep : ,g' < main.dep.$$ > main.dep; \
rm -f main.dep.$$
Compiling C...
arm-none-eabi-gcc -c -Wall -std=gnu99 -Os -mcpu=arm7tdmi-s -gstabs -Wa,-adhlns=main.lst main.c -o main.o
C:\DOCUME~1\MK0917~1\USTAWI~1\Temp\ccnhP2vE.s: Assembler messages:
C:\DOCUME~1\MK0917~1\USTAWI~1\Temp\ccnhP2vE.s:31: Warning: ignoring changed section attributes for .data

Linking...
arm-none-eabi-c++ -Wall -Os -mcpu=arm7tdmi-s -gstabs main.o startup.o -o test.elf -nostartfiles -Tlpc2142-rom.ld -Wl,-Map=test.map,--cref
Converting to hex...
arm-none-eabi-objcopy -O ihex -S test.elf test.hex
Create extended listing...
arm-none-eabi-objdump -h -S test.elf > test.lss

> Process Exit Code: 0
> Time Taken: 00:00

Back to top
   
Zbych_
Poziom 17
Poziom 17


Joined: 06 Nov 2003
Posts: 429
Location: Kuala Lumpur

Post#14 13 Mar 2010 21:39helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


atom1477 wrote:
No będzie ciężko. Bo podane przez Zbycha parametry mam podane, ale mimo to do pliki map nie trafia informacja o umieszczeniu funkcji.


Ech, czytaj ze zrozumieniem. Nie chodzi o plik map, tylko o stworzenie sekcji specjalnie dla funkcji.
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#15 Post from the author of the topic 13 Mar 2010 21:43   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Zbych_ wrote:
atom1477 wrote:
No będzie ciężko. Bo podane przez Zbycha parametry mam podane, ale mimo to do pliki map nie trafia informacja o umieszczeniu funkcji.


Ech, czytaj ze zrozumieniem. Nie chodzi o plik map, tylko o stworzenie sekcji specjalnie dla funkcji.


Czytam ze zrozumieniem. Chodzi mi o to:
albertb wrote:
Czy tam trafia sprawdź. Zbych podał Ci jak.

Back to top
   
Zbych_
Poziom 17
Poziom 17


Joined: 06 Nov 2003
Posts: 429
Location: Kuala Lumpur

Post#16 13 Mar 2010 21:47   

Re: Funkcja w RAMie nie działa. Ręce opadają.


atom1477 wrote:
Czytam ze zrozumieniem. Chodzi mi o to:
albertb wrote:
Czy tam trafia sprawdź. Zbych podał Ci jak.


Sorry, masz rację.
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#17 Post from the author of the topic 13 Mar 2010 21:50   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Mam:
Code:

   .data :
   {
      __data_init_start = LOADADDR (.data);
      PROVIDE(__data_init_start = __data_init_start);
      __data_start = .;
      PROVIDE(__data_start = __data_start);

      *(.data .data.* .gnu.linkonce.d.*)
      . = ALIGN(4);

      __data_end = .;
      PROVIDE(__data_end = __data_end);
   } > ram AT > rom


Dodaję fastrun:
Code:

   .data :
   {
      __data_init_start = LOADADDR (.data);
      PROVIDE(__data_init_start = __data_init_start);
      __data_start = .;
      PROVIDE(__data_start = __data_start);

      *(.data .data.* .gnu.linkonce.d.*)
      . = ALIGN(4);
      
      *(.fastrun)

      __data_end = .;
      PROVIDE(__data_end = __data_end);
   } > ram AT > rom

i tyle?
Przejrzałem te pliki podrzucone przez michalko12 i widzę że nic poza dodaniem sekcji fastrun tam nie ma. Inicjalizowana jest jedynie sekcja data w całości.
Więc i ja nie muszę nic dodatkowo robić?

Niestety są dalej te same błędy.

PS. A myślniika po *(.fastrun) to nie powinno być?
Back to top
   
albertb
Poziom 22
Poziom 22


Joined: 04 May 2004
Posts: 1875
Location: Nowy Targ

Post#18 13 Mar 2010 23:12helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


atom1477 wrote:

No będzie ciężko. Bo podane przez Zbycha parametry mam podane, ale mimo to do pliku map nie trafia informacja o miejscu umieszczenia funkcji.

???
A mógłbyś go podrzucić? (Z zaznaczeniem o jaką funkcję chodzi)

Albert
Back to top
   
Google

Google Adsense


Post# 13 Mar 2010 23:12helpful post - solution   





Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#19 Post from the author of the topic 13 Mar 2010 23:16   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Powiedzmy że wiem co jest nie tak. To biblioteka FatFs mota. Bez niej wszystko się ładnie kompiluje. Ale czy działa to nie mam jak sprawdzić bo bez systemu plików nie odczytam pliku z programem z karty SD.

Niedługo zacznę odchudzać program (zostawiając jednak bibliotekę FatFs) i go w całości wrzucę na elektrodę. No chyba że po odchudzeniu zacznie działać ;)

A tutaj plik map.
Skompilowane dla jednokrotnego wywołania funkcji (tytko wtedy daje się skompilować). Funkcje to Pisz_32x32_transparent_ram i Firmware_update. Bez atrybutu long_call. Z tym atrybutem to nawet bez biblioteki FatFs nie chce się skompilować.



lpc2478_blink_led.rar
 Description:
 n/a

Download
 Filename:  lpc2478_blink_led.rar
 Contents:  
 Filesize:  12.81 KB
 Punkty:  0

Back to top
   
albertb
Poziom 22
Poziom 22


Joined: 04 May 2004
Posts: 1875
Location: Nowy Targ

Post#20 13 Mar 2010 23:35helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


A to sprawa prosta. Deklarujesz funkcję jako static. Wywołujesz w 1 miejscu, wiec kompilator w swej mądrości włącza ja do wywołujacej.

Wywal static, a zamiast atrybutu jeśli nie chce działać spróbuj opcje kompilacji -mlong-calls.

Albert
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#21 Post from the author of the topic 13 Mar 2010 23:50   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Jeszcze przed założeniem tematu próbowałem bez static. Bez skutku.
Bez static wywala błąd nawet przy jednokrotnym wywołaniu funkcji.
Ja już skończyłem odchudzać program. Może zaraz go wrzucę.
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#22 13 Mar 2010 23:55helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


atom1477 wrote:
Jeszcze przed założeniem tematu próbowałem bez static. Bez skutku.
Bez static wywala błąd nawet przy jednokrotnym wywołaniu funkcji.
Ja już skończyłem odchudzać program. Może zaraz go wrzucę.

Spróbowałem ze static i jest tak jak mówi albertb. Po funkcjach ani śladu.
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#23 Post from the author of the topic 14 Mar 2010 00:11   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Trochę się boję wrzucać ten program. Bo zaraz się zaczną komentarze że jest burdel. Że za dużo robię w przerwaniach. Itp.
Tylko że nie to jest problemem.
Problemem jest to że on się nie chce skompilować.
To czy będzie działał czy nie to już inna sprawa.
W dość dziwaczny sposób dołączam jeden element biblioteki FatFs. Mianowicie plik c. Zmieniłem rozszerzenie na cc i podłączam go a pomocą dyrektywy include.
Jest to na maxa niepoprawne politycznie, ale mi się zdaje że to nie może powodować błędu. Przecież taki plik jest po prostu najnormalniej w świecie wklejany do pliku main.c i dopiero kompilowany.
A to po to żeby nie robić 100 funkcji external.
Nie ma żadnych warningów. A wszystkie funkcje działają. (Mowa o samym FatFs-ie dołączanym tym moim cudem.)
A może to właśnie to jest problem?



IAP_FatFs_function_in_RAM.rar
 Description:
 n/a

Download
 Filename:  IAP_FatFs_function_in_RAM.rar
 Contents:  
 Filesize:  916 KB
 Punkty:  0

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 14 Mar 2010 00:11   





Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 6723
Location: Zawiercie

Post#24 14 Mar 2010 09:53helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Może trochę zmienię temat, ale błędy tego typu:

Code:
main.c:1834: error: conflicting types for 'Pisz_32x32_transparent_ram'
main.c:89: error: previous declaration of 'Pisz_32x32_transparent_ram' was here


świadczą nie o tym, że funkcja jest we flashu zamiast w RAM, tylko o tym, że w dwóch różnych miejscach są zdefiniowane w różny sposób...

Dalej idąc - to że IAP używa RAMu jest tutaj kluczową sprawą. IAP jest w swojej głupocie tak głupie, że wcale nie używają jednego kawałka:

Quote:
5.2.9 RAM used by IAP command handler
Flash programming commands use the top 32 bytes of on-chip RAM. The maximum stack
usage in the user allocated stack space is 128 bytes and it grows downwards.


O nie-używanie (albo dowolne inne zabezpieczenie, np skopiowanie i przywrócenie) tych obszarów trzeba zadbać...

Kolejną ważną sprawą jest słynny w ARM7 nieużywany wektor przerwań, który służy do zabezpieczania przez wykonywaniem syfu. Jeśli nie znajdzie się tam poprawna wartość (szczegóły w manualu), to po resecie taki program nie będzie działać - po prostu bootloader (ten oryginalny) go nie uruchomi. Żaden kompilator nie generuje automatycznie tej wartości...

4\/3!!
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#25 Post from the author of the topic 14 Mar 2010 10:58   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Kurcza. Jak zobaczyłem że Freddie Chopin odpowiedział to już się szykowałem na niezłe lanie ;)
Ale widzę że są ładne odpowiedzi.

No to tak:
Pisz_32x32_transparent_ram - nie wiem o co chodzi. Gdy nie ma atrybutu to wszystko jest ok. Gdy go dodam to już lipa. Owszem, atrybut dodaję tylko w prototypie funkcji. Ale to chyba nie podów żeby wywala takiego warnigna. Zresztą próbowałem dodawać atrybut także w samej funkcji i nic to nie zmienia.

Co do IAPu. No więc on działa! Więc o nadpisywanie RAMu się nie martwię.
Stos mam duży (4kB). A ostatnie 32B RAMu to może wystarczy zabezpieczyć deklarując w pliku ld mniejszą ilość RAMu?

Nieużywany wektor przerwań: No to poszukam trochę o tym.

Ale póki co, to ani IAP, ani ten wektor przerwań problemem nie jest.
Na razie problemem jest ta funkcja która przy próbie przerzucenia do RAMu nie pozwala na normalne skompilowanie programu.
I tak jak mówiłem usunięcie biblioteki FatFs rozwiązuje problem.
Czyli gdzieś tam trzeba szukać. Problem tylko w tym że ja nie mam pomysłów co tam może nie grać.
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#26 14 Mar 2010 11:17   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Freddie Chopin wrote:
Kolejną ważną sprawą jest słynny w ARM7 nieużywany wektor przerwań, który służy do zabezpieczania przez wykonywaniem syfu. Jeśli nie znajdzie się tam poprawna wartość (szczegóły w manualu), to po resecie taki program nie będzie działać - po prostu bootloader (ten oryginalny) go nie uruchomi. Żaden kompilator nie generuje automatycznie tej wartości...

4\/3!!



No właśnie, a jak zmusić OCD żeby ten wektor uzupełniał właściwą wartością przy zapisie za pomocą write_image. W komendzie "flash bank" jest calc_checksum, ale efekt jest tylko taki że OCD wywala warninga o niezgodnych tych wartościach.
Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 6723
Location: Zawiercie

Post#27 14 Mar 2010 11:48helpful post - solution   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Przeczytaj tego warninga całego. Mówi on, że jakbyś zrobił weryfikację, to będzie ona błędna, bo OpenOCD zmieniło wartość dla tego właśnie wektora na "odpowiednią".

4\/3!!
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#28 14 Mar 2010 12:17   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Freddie Chopin wrote:
Przeczytaj tego warninga całego. Mówi on, że jakbyś zrobił weryfikację, to będzie ona błędna, bo OpenOCD zmieniło wartość dla tego właśnie wektora na "odpowiednią".

4\/3!!

Dzięki. Rzeczywiści, nie dokładnie zrozumiałem tego warninga, ale i tak nie zmienia to faktu, że program załadowany za pomocą OCD nie działa w odróżnieniu od programu załadowanego za pomocą FlashMagica, ale to w razie czego temat na inny wątek.
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#29 Post from the author of the topic 14 Mar 2010 13:30   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Jeszcze bardziej uprościłem program. Dalej to samo.
Żeby nie robić burdelu wziąłem oryginalne projekty Freddiego Chopina. Z 06/2009 i 09/2009. Na obydwu to samo.
No i jest tak:
Mogę użyć atrybutu:
Code:

__attribute__ ((section(".data"), aligned (32)));

Ale:
Code:

__attribute__ ((long_call, section(".data"), aligned (32)));

już nie:
Code:

**** Build of configuration Default for project LPC2103_09 ****

cs-make all
Compiling file: main.c
arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -O0 -ffunction-sections -fdata-sections -Wall -Wstrict-prototypes -Wextra -g -ggdb3 -fverbose-asm -Wa,-ahlms=./out/main.lst  -MD -MP -MF ./out/main.d -I .  main.c -o out/main.o
main.c:130: error: conflicting types for 'pll_feed'
main.c:61: error: previous declaration of 'pll_feed' was here
cs-make: *** [out/main.o] Error 1

Dlaczego?

albertb wrote:

Wywal static, a zamiast atrybutu jeśli nie chce działać spróbuj opcje kompilacji -mlong-calls.

Zawsze słyszę że uciekam od problemów. Teraz z końcu sam to komuś powiem ;)
Problem jest z long_call. Zastosowanie mlong-calls jest ucieczką od problemu. Nie trzeba uciekać tylko rozwiązać problem. No więc co jest nie tak z tym long_call? ;)



LPC2103_09.rar
 Description:
 n/a

Download
 Filename:  LPC2103_09.rar
 Contents:  
 Filesize:  200.15 KB
 Punkty:  0


LPC2103_06.rar
 Description:
 n/a

Download
 Filename:  LPC2103_06.rar
 Contents:  
 Filesize:  188.69 KB
 Punkty:  0

Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 6723
Location: Zawiercie

Post#30 14 Mar 2010 13:36   

Re: Funkcja w RAMie nie działa. Ręce opadają.


Nie wiedzieć czemu, opcja long_call musi być dodana zarówno w deklaracji jak i w definicji, więc "na górze" zostaw jak masz, a na dole dostaw kompletny zestaw "__attribute__ ((...))" między "void" a nazwę funkcji.

Dodam też, że w pliku *.map nie ma wylistowanych w takim przypadku funkcji umieszczonych w RAM, za to będą widoczne w pliku *.dmp. Widać też po dezassemblacji, że funkcja jest wywoływana w specjalny sposób (przez ldr, mov, bx) z adresów w RAM. (ciekawostka - opcja bez "long_call" zajmuje w tym pzypadku mniej)

Niemniej jednak, BEZ "long_call" funkcja też zostanie wywołana prawidłowo, przez tzw. veneer, więc problem nie leży tutaj.

4\/3!!
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> Funkcja w RAMie nie działa. Ręce opadają.
Page 1 of 2 Go to page 1, 2  Next
Similar topics
[AVR GCC] funkcja memcmp nie działa poprawnie (14)
Softowe SPI atmega8. Dlaczego funkcja nie działa? (3)
[PHP] Wysyłanie maili. Nie działa mi funkcja mail. (1)
[C] Nie działa funkcja cin.getline (10)
c++ funkcja nie działa (3)
93c56 - ręce opadają (1)
Funkcja nie działa przy szybszym taktowaniu kontrolera (7)
Funkcja konwertująca z jednego zakresu na inny nie działa (3)
Funkcja VBA w Excelu nie działa przy przełączaniu arkuszy (4)
[Lazarus] Funkcja EnableWindow() nie działa w przypadku głównego okna programu? (9)

Page generation time: 0.186 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed