Marek snipped-for-privacy@fakeemail.com napisał(a):
Jest linkowany razem.
Marek snipped-for-privacy@fakeemail.com napisał(a):
Jest linkowany razem.
Znam. Całkiem fajnym modułem tego rodzaju jest też Onion Omega (z tym, że posiada złącze w mniejszym rastrze, niekompatybilne z płytkami stykowymi). Przy czym jednak tego typu płytki nie zawsze są sensowną alternatywą dla mikrokontrolera z modułem WiFi (tudzież modułu WiFi ze zintegrowanym mikrokontrolerem). Czasem ważne jest to, żeby układ po resecie podniósł się jak najszybciej, bez potrzeby uruchamiania systemu operacyjnego.
Atlantis snipped-for-privacy@wp.pl napisał(a):
To alternatywne bazuje w dużym stopniu na oficjalnym więc ewentualne przeportowanie nie powinno być trudne.
Dotyczy kodu użytkownika, bo brane są oryginalne skrypty linkera. Nie bałbym się jednak tych skryptów edytować ani tym bardziej z ich względu zmieniać w ogóle platformę :) Jako przykład wziąłem ten projekt:
Gdzie dokładnie trzeba umieścić tę linijkę? Modyfikuję skrypt eagle.app.v6.ld, używany w moim projekcie.
Zmodyfikowany fragment wygląda następująco:
.irom0.text : ALIGN(4) { _irom0_text_start = ABSOLUTE(.);
*libmbedtls.a:(.literal .text .literal.* .text.*) *libpp.a:(.literal.* .text .literal .text.*) *libm.a:(.literal.* .text .literal .text.*) *(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text) _irom0_text_end = ABSOLUTE(.); } >irom0_0_seg :irom0_0_phdrNiestety nie pomogło - projekt ciągle nie chce się kompilować, wyrzucając te same błędy...
Atlantis snipped-for-privacy@wp.pl napisał(a):
W definicji sekcji .irom0.text, tak jak zrobiłeś, bo chcemy aby objęła większy fragment linkowanego kodu.
Na pewno ten? Poza tym tutaj ta sekcja jest dużo dłuższa:
Jeśli na pewno linker używa tego pliku, to powinno pomóc. Ewentualnie tak mocno wychodzisz poza zakres, że przesunięcie jednej biblioteki nie pomaga. Wtedy mozna dopisać węcej, np. libmain (w poprzednim poście się pomyliłem - chodziło właśnie o libmain, nie libm). Ewentualnie możesz zrobić tak, że zwiększysz obszar iram1 tak bardzo, aż projekt się zlinkuje. Definicję masz na początku skryptu: iram1_0_seg : org = 0x40100000, len = 0x8000 Przykładowo można zmienić 0x8000 na 0x10000. Oczywiście kod wynikowy nie zmieści się w pamięci modułu, ale chodzi o to żeby przeanalizować wynikowy plik wykonywalny. Sprawdzić ile ostatecznie zajęły poszczególne sekcj i które funkcjeoraz z których bibliotek są w tych sekcjach. Można do tego użyć readelf albo przejrzeć plik .map jeśli jego generowanie jest uwzględnione w Makefile.
Plik o tej samej nazwie. SDK pobrałem kiedyś (bodajże z GitHuba) kompilując sobie toolchain do ESP8266. Posługiwałem się wtedy jakimś opisem znalezionym w Sieci. Możliwe, że to po prostu jakaś starsza wersja.
Swoją drogą spróbowałem także drugiego rozwiązania, przez modyfikację plików bibliotek za pomocą zaproponowanej przez Ciebie komendy (xtensa-lx106-elf-objcopy --rename-section .text=.irom0.text
--rename-section .literal=.irom0.literal libpp.a). W ten sam sposób zmodyfikowałem także libc i libgcc, ale nie pomogło - błąd ciągle występuje. Co dziwniejsze wygląda na to, że (w przypadku zakomentowania kawałka kodu celem umożliwienia kodu) mapa pokazuje, że biblioteki faktycznie trafiają do irom0.text. To naprawdę nie ma jakiegokolwiek sensu...
Cały wynik jest tutaj. W tym przypadku użyłem standardowego, niezmodyfikowanego skryptu linkera, ale biblioteki są już zmodyfikowane.
Wprowadziłem taką modyfikację, ale projekt cały czas się nie kompiluje...
Atlantis snipped-for-privacy@wp.pl napisał(a):
Z tego co widzę, to linker krzyczy o brak definicji wywołań systemowych oraz o zduplikowane funkcje odnoszące się do czasu a nie o przekroczenie zakresu pamięci. I zwracam honor odnośnie generowania skryptu linkera, faktycznie tak jest. Nie zaobserwowałem czegoś takiego w open sdk.
Ogólnie tam powinny być rzeczy, które powinny się wykonać szybko, np. obsługujące przerwania. Ale co konkretnie to nie wiem.
Ale z tego co widzę to chodzi o brakujące i zduplikowane definicje funkcji a nie obszary pamięci. Trzeba by się temu przyjrzeć. W dalszej kolejności można spróbować zmienić SDK na najnowszą wersję tego otwartego.
Mogę jakoś odkręcić te modyfikacje? Zapomniałem zrobić kopie zapasowe. Niby SDK bez problemu ściągnę z sieci, ale jeśli da się prościej (paroma komendami) przywrócić domyślne ładowanie do .text, to chętnie bym z tego rozwiązania skorzystał...
Na trop braku miejsca w .text naprowadził mnie fakt, że w momencie gdy projekt jeszcze się kompiluje ta sekcja jest zajęta prawie w całości.
Jakiś pomysł co o tego, gdzie mogę szukać źródła problemu z dublującymi się/brakującymi funkcjami?
Atlantis snipped-for-privacy@wp.pl napisał(a):
Tak jak podpowiada intuicja, zamiast .text=.irom0.text napisać .irom0.text=.text
OK, ale jedno z drugim nie ma żadnego związku.
Czyli coś takiego?
xtensa-lx106-elf-objcopy --rename-section .irom0.text=extent
--rename-section .literal=.irom0.literal libpp.a
Treści po "literal" nie zmieniać?
Rozumiem, że mowa o bezpośredniej ingerencji w kod lwip? Bo z tego co widzę, to ta biblioteka standardowo jest dostępna w SDK w formie prekompilowanej, jako plik liblwip.a.
Niestety sntp jest jedną z najbardziej podstawowych bibliotek w tym projekcie. Trochę dziwne, że problem pojawia się teraz. W końcu lwip to chyba standardowy składnik projektów tworzonych na ESP8266, a z sntp korzystałem do tej pory bardzo często i nigdy nic takiego się nie działo...
Ok, dzięki za informację. Przyjrzę się tej sprawie bliżej. :)
Atlantis snipped-for-privacy@wp.pl napisał(a):
literal też można przywrócić. To po prostu zmiana nazwy.
Trzeba by poszukać SDK z lwip w postaci źródłowej, np. Open SDK. Oficjalne chyba też w końcu wydano ze źródłami. A może po prostu pomoże nowsza wesja SDK.
Też mnie to zdziwiło, nie spodziewałem się takiego konfliktu.
Moze cos na RTL8710
Podobno ma być wspierany przez Mbed. Jeśli tak to będzie killer...
c.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.