| Author |
Message
|
atom1477 Poziom 25

Joined: 14 Jul 2005 Posts: 6360
|
#1
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):
2. Przerobiona na RAM (też działa ale podejrzewam że wcale nie trafia do RAMu):
3. Inna funkcja. Ta jest wywoływana z 8 razy. I już kompilacja nie powodzi się:
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

Joined: 06 Nov 2003 Posts: 429 Location: Kuala Lumpur
|
#2
13 Mar 2010 17:55 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

Joined: 14 Jul 2005 Posts: 6360
|
#3
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

Joined: 04 May 2004 Posts: 1875 Location: Nowy Targ
|
#4
13 Mar 2010 18:42 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

Joined: 14 Jul 2005 Posts: 6360
|
#5
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ę:
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

Joined: 20 Nov 2004 Posts: 1551 Location: Gdzieś koło wawy
|
#6
13 Mar 2010 20:48 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

Joined: 14 Jul 2005 Posts: 6360
|
|
| Back to top |
|
 |
Google

|
#
13 Mar 2010 20:55 |
|
|
|
|
|
| Back to top |
|
 |
Zbych_ Poziom 17

Joined: 06 Nov 2003 Posts: 429 Location: Kuala Lumpur
|
#8
13 Mar 2010 21:21 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

Joined: 04 May 2004 Posts: 1875 Location: Nowy Targ
|
#9
13 Mar 2010 21:24 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

Joined: 20 Nov 2004 Posts: 1551 Location: Gdzieś koło wawy
|
#10
13 Mar 2010 21:27 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);
} |
| Description: |
|
 Download |
| Filename: |
tmp.zip |
| Contents: |
|
| Filesize: |
26.21 KB |
| Punkty: |
0.00 |
|
|
| Back to top |
|
 |
Zbych_ Poziom 17

Joined: 06 Nov 2003 Posts: 429 Location: Kuala Lumpur
|
#11
13 Mar 2010 21:30 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

Joined: 14 Jul 2005 Posts: 6360
|
#12
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

Joined: 20 Nov 2004 Posts: 1551 Location: Gdzieś koło wawy
|
#13
13 Mar 2010 21:38 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

Joined: 06 Nov 2003 Posts: 429 Location: Kuala Lumpur
|
#14
13 Mar 2010 21:39 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

Joined: 14 Jul 2005 Posts: 6360
|
#15
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

Joined: 06 Nov 2003 Posts: 429 Location: Kuala Lumpur
|
#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

Joined: 14 Jul 2005 Posts: 6360
|
#17
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

Joined: 04 May 2004 Posts: 1875 Location: Nowy Targ
|
#18
13 Mar 2010 23:12 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

|
#
13 Mar 2010 23:12 |
|
|
|
|
|
| Back to top |
|
 |
atom1477 Poziom 25

Joined: 14 Jul 2005 Posts: 6360
|
#19
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ć.
| Description: |
|
 Download |
| Filename: |
lpc2478_blink_led.rar |
| Contents: |
|
| Filesize: |
12.81 KB |
| Punkty: |
0 |
|
|
| Back to top |
|
 |
albertb Poziom 22

Joined: 04 May 2004 Posts: 1875 Location: Nowy Targ
|
#20
13 Mar 2010 23:35 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

Joined: 14 Jul 2005 Posts: 6360
|
#21
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

Joined: 20 Nov 2004 Posts: 1551 Location: Gdzieś koło wawy
|
#22
13 Mar 2010 23:55 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

Joined: 14 Jul 2005 Posts: 6360
|
#23
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?
| Description: |
|
 Download |
| Filename: |
IAP_FatFs_function_in_RAM.rar |
| Contents: |
|
| Filesize: |
916 KB |
| Punkty: |
0 |
|
|
| Back to top |
|
 |
Google

|
#
14 Mar 2010 00:11 |
|
|
|
|
|
| Back to top |
|
 |
Freddie Chopin Poziom 25

Joined: 12 Dec 2005 Posts: 6723 Location: Zawiercie
|
#24
14 Mar 2010 09:53 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

Joined: 14 Jul 2005 Posts: 6360
|
#25
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

Joined: 20 Nov 2004 Posts: 1551 Location: Gdzieś koło wawy
|
#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

Joined: 12 Dec 2005 Posts: 6723 Location: Zawiercie
|
#27
14 Mar 2010 11:48 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

Joined: 20 Nov 2004 Posts: 1551 Location: Gdzieś koło wawy
|
#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

Joined: 14 Jul 2005 Posts: 6360
|
#29
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? ;)
| Description: |
|
 Download |
| Filename: |
LPC2103_09.rar |
| Contents: |
|
| Filesize: |
200.15 KB |
| Punkty: |
0 |
| Description: |
|
 Download |
| Filename: |
LPC2103_06.rar |
| Contents: |
|
| Filesize: |
188.69 KB |
| Punkty: |
0 |
|
|
| Back to top |
|
 |
Freddie Chopin Poziom 25

Joined: 12 Dec 2005 Posts: 6723 Location: Zawiercie
|
#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 |
|
 |