Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32F4Discovery - STM32F4 + darmowe IDE = zaraz mnie trafi !

jaskol 22 May 2014 09:05 14559 111
Optex
  • #91
    Freddie Chopin
    MCUs specialist
    jaskol wrote:
    Rozumiem, ze jak mam 3 zadania/watki/taski, to bajer polega na tym, ze wszystkie zmienne uzyte w danym watku, sa zrzucane/zapamietane - kontekst.

    Dotyczy to tylko zmiennych automatycznych. Zmienne statyczne są "wspólne" (istnieje tylko jedna kopia, niezależnie od ilości wątków).

    jaskol wrote:
    A co jak sie zadeklaruje jakas tablice TAB[] z niewiadoma iloscia danych (a chyba sie da) i ona sie przepelni, to co wtedy z reszta danych, ktore sie moga nadpisac ?

    Generalnie nie da się zadeklarować tablicy o niewiadomym rozmiarze - poza oczywiście alokacją dynamiczną. Tablica o znanym rozmiarze może być zwykłą zmienna automatyczną. Wskaźnik na dynamicznie zadeklarowaną tablicę - również. A sama dynamicznie zaalokowana tablica nie będzie współdzielona (chyba że sam zrobisz tak żeby była).

    jaskol wrote:
    Jak zadanie o nizszym priorytecie zajmie mi UART i oglosi to w postaci mutex-a (po to one chyba sa), to nawet jesli bedzie wywlaszczenie przez zadanie o wyzszym priorytecie, to i tak sie nie wykona zadna operacja na UART dla tego zadania, bo mutex nie pozwoli ?
    Czy moze system wysle w kosmos, to pierwsze zadanie (a raczej te blokade) i to o wyzszym priorytecie zrobi swoje ?

    Zadanie o wyższym priorytecie zastanie zablokowane przez mutexa.

    jaskol wrote:
    Jak mam transmisje ...jakas.. i w polowie 21 bajtu scheduler przelaczy task, a ja nie mam po drugiej stronie UART-u zaimplementowanego zadnego opoznienia, to czy transmisja pada, czy tak sie dopiera "systemowy TICK" dla RTOS-a, zeby 10 razy czesciej przelaczal taski niz trwa najszybsza transmisja z jakims medium ?
    A moze musze po drugiej stronie zadbac o to, zeby byl jakis "wiekszy" timeout i wtedy jest lepsza elastycznosc ?
    Widze, ze ST pomyslalo nawet o specjalnym timerze (te odmiany z kaleczeniem jezyka mnie dobijaja, ale mam nadzieje, ze nie ja jeden ma ten problem), ktory jest wlasnie z przeznaczeniem dla schedulera.

    Obsługi samej transmisji NIGDY nie robi się w kodzie wątku, tylko albo w DMA albo w przerwaniu, które pakuje dane do bufora - np. kolejki RTOSa.

    jaskol wrote:
    Jesli jeden task sie wykona w 10ms, a drugi ma zatrzasniety mutex (zajete peryferia) i po 1ms wyjdzie z zadania, bo nie ma co robic...to co sie dzieje w wolnym czasie ? Niech systemTICK=1ms.
    Czy wprowadza sie jakies sztuczne opoznienie, zeby kazdy task mial tyle samo czasu i wtedy jest sprawiedliwie, czy maszyna pedzi dalej i nie ma zadnej synchronizacji ?
    Jestem w stanie wyobrazic sobie obydwie wersje i kazda ma swoje wady oraz zalety. Tylko, czy jest jakis standard, ze w 90% robi sie tak, a rzadko inaczej ?
    Bez sensu, zeby jakis Fourier sie liczyl 10 x dluzej tylko dlatego, ze inne zadanie jedno milisekundowe ma delay(9ms).
    Za to jesli zalezy mi na tym, zeby dokladnie co 10ms cos sie dzialo, to wtedy wersja z delay bylaby uzasadniona.

    Zadania (wątki) realizowane są wg priorytetów i wg możliwości (mutexy, kolejki, semafory, delay systemowy). Jeśli dany wątek zostaje wywłaszczony, to scheduler sprawdza które z pozostałych zadań może zostać uruchomione (patrząc od najwyższego do najniższego priorytetu). Nie odpowiem na Twoje pytanie wprost, ponieważ niezbyt je rozumiem.

    Poczytaj sobie tutaj http://www.freertos.org/implementation/a00004.html oraz kolejne strony z tej serii (czyli RTOS Fundamentals). Na stronie FreeRTOSa jest kilka interesujących artykułów, tylko ciężko je znaleźć pomiędzy nieinteresującymi (; Ta "seria" RTOS Fundamentals jest akurat chyba najciekawsza.

    4\/3!!
  • Optex
  • #92
    jaskol
    Level 12  
    Alan Cox wrote:
    A Computer is a state machine. Threads are for people who can't program state machines

    Troche w tym racji. Ale nikomu sie nie chce pisac wlasnie maszyn stanu z 1000 case'ów ;]
    Swiete slowa ;)

    Pamietam na studiach jak na egzaminie bylo jakies zadanie z pralka i byl warunek na to, ze w kazdej chwili otwarcie drzwiczek mialo wylaczac pralke.
    Wszyscy rysowali po 150 stanow i produkowali 30 kartek A4, bo powtarzali co chwile ten warunek w grafach.
    Wtedy jakos niewiele mowiono o przerwaniach, a raczej niewiele sie ludzie interesowali. Jakos tak nie moglem na to patrzec i wrzucilem INT-a do grafu i programu, bo pomyslalem, ze nie chodzilo im o katowanie ludzi, ale o to, zeby spojrzec szerzej.

    Zdziwilem sie, bo takich, co to sie pogubili z grafami bylo 3.
    Tylko nas 3 uzylo przerwan i oceny dali nam najlepsze, a ja uwazam,
    ze bohaterami byli Ci drudzy.
    Nie Ci, ktorym sie nie udalo, ale bylo kilku, ktorzy zrobili te maszyne stanow i dzialala !
    To byli prawdziwi geniusze.
    Wspolczuje tylko oceniajacym, bo musieli to wszystko przesledzic.
    I tak rozumiem ten RTOS.
    Nie jest wyczynem napisac kilka taskow i niech sie dzieje wola schedulera, ale wyczynem byloby rozrysowac to na stanach ( tylko po co ? :) )
    Tylko, ze to zadanie na studia, a nie w zyciu codziennym.
    I tak powstal RTOS - dla wygody, zeby czasu nie marnowac i podniesc niezawodnosc.

    I teraz pewnie wszystkie pralki maja RTOS-y ;)

    Pozdrawiam,
    Mariusz

    Dodano po 8 [minuty]:

    tplewa wrote:

    hmm wiesz w okolicach 40tki czlowiek szuka frajdy w tym co robil tyle czasu komercyjnie... a w wolnych chwilach jakies glupoty z ktorych ma sie satysfakcje :) Ja przestalem wierzyc ze mozna pracowac z czyms co sie lubi bo i tak po pewnym czasie to sie robi monotonne i szuka sie czasem szalonej odskoczni ;)


    Podpisuje sie wszystkimi pinami !
    Tyle, ze mnie sie to "rozlewa" troche na caly obszar.
    Kiedys frajda bylo pisanie czego, a od dluzszego czasu mam tak, ze jak uda mi sie zwalczyc jakis problem, to reszte zostawiam.
    W ten sposob mam 50 zaczetych rzeczy w domu i niczego nie koncze :(
    Kilka lat temu mi sie chcialo, a teraz....Tak jak z tymi gotowymi zestawami.
    Mam jakis zestaw bez czytnika SD. Kupuje czytnik (no bo ma stabilizator na 3.3V na pokladzie, wiec bedzie tak idealnie). Na koncu kupuje nowy zestaw z czytnikiem SD na pokladzie, bo nie mam sily tych 5 drutow polutowac/skleic/polaczyc.
    To straszne :(
    Moze to domena starcow ? ;) ( a moze tylko leniwcow )
    Co innego jak ktos przyjdzie po cos konkretnego, placi za to i co 2 dni dzwoni z pytaniem, czy juz jest. Wtedy sie policzkuje przed lustrem i dzialam dalej, ale nie jest to stan default. Raczej super hiper high priority ;)

    Pozdrawiam,
    Mariusz

    Dodano po 2 [minuty]:

    Quote:

    wdrazam szalone pomysly w tym graficzny lcd i rozne bajery jak BT, USB itd. w sumie nie wiem po co mi to... ale jest milo :)


    O to to, o to to ! Jak mawial moj pradziadek. Strzal w 10.
    Chodzi o to, zeby w zyciu bylo milo.
    Przeciez jestesmy tutaj tylko przez chwile ;)

    Mariusz
  • #93
    gaskoin
    Level 38  
    tplewa wrote:
    Juz mialem kilka przypadkow ze z czegos prostego projekt rozrusl sie do takich rozmiarow ze poczatkowe zalozenia okazaly sie bledne i trzeba bylo wszystko pisac od podstaw :) Ot to za sprawa jak cos udostepniasz i masz co chwile a moze by dodac to lub tamto ;)


    Tym się charakteryzuje źle napisany kod - trzeba go pisać od nowa kiedy następują zmiany w wymaganiach. Trzeba się na to odpowiednio wcześniej przygotować. Zgadnij co się najczęściej zmienia w projektach ? Wymagania.

    nsvinc wrote:
    Przez takie przypadki 6 (!!) razy pisalem od nowa soft na pewne urządzenie; i z doswiadczenia powiem tylko - dosyć!. Teraz jak cos mam napisac chce specke, bez specki moge napisac co najwyzej inity. I stanowczo odmawiam klepanie czegos pod klienta ktory nie wie co chce ;p


    Wtedy trzeba podpisywać inną umowę i ciągnąć projekt w nieskonczoność :P Taka jest niestety rzeczywistość. Też miałem kilka takich przypadków i projekt trwał i trwał a klient płacił i płacił, aż sam zrezygnował (z naszej winy oczywiście, bo nie wiedzieliśmy o co mu chodzi, on sam nie wiedział). Niektórzy myślą, że się im siedzi w głowach, chociaż z drugiej strony też naszym zadaniem jest współpraca z klientem. Bardzo fajnie jest klienta wciągnąć do projektu jako "członka zespołu" i przygotować go na to, że 100 razy dziennie będzie otrzymywał od nas pytania, na które ma odpowiedzieć. Niestety w polsce traktuje się klientów jak święte krowy, z którym najlepiej niech nikt nie rozmawia, bo jeszcze go urazi. Ale to bardziej przeszkadza niż w czymkolwiek pomaga. Wystarczy poczytać o metodykach zwinnych, które wydają się bardzo nienaturalne, a jednak są bliżej natury niż tzw "waterfall" wymyślony przez "doświadczone" korporacje.

    jaskol wrote:
    Przeciez jestesmy tutaj tylko przez chwile ;)


    To zależy :)
  • #94
    jaskol
    Level 12  
    Freddie Chopin wrote:

    Dotyczy to tylko zmiennych automatycznych. Zmienne statyczne są "wspólne" (istnieje tylko jedna kopia, niezależnie od ilości wątków).

    Ok, czyli nie zuzyje tyle ramu, jesli bede uzywal zmiennych static.
    Tylko, ze musze wtedy byc czujny, bo jeden watek moze mi zepsuc inny (zmiennaą) ? A mialo byc tak, ze jeden watek nic nie wie o drugim.
    Nic nie wie, ale swinie mu podlozyc moze ?

    Zatem jeden kontekst zrzuca/chowa wszystkie zmienne z danego zadania, a inne zadanie ma swoj kontekst i tak naprawde jesli maja jakies zmienne wspolne, to sobie je wzajemnie niszcza ?
    Jesli zalezy mi na tym, zeby dany task byl naprawde niezalezyny, to uzywam zmiennych automatycznych i o nic sie nie martwie.
    Dochodzi jeszcze przerwanie/stos i sprawa sie komplikuje, bo jesli jest np. 8 poziomowy, to szybko sie konczy.
    Innymi slowy, o co musze zadbac (w wymiarze zmiennych uywanych w danym zadaniu) i co jest wazne/ograniczajace ? Da sie tak w 3 punktach ?

    Freddie Chopin wrote:

    Zadanie o wyższym priorytecie zastanie zablokowane przez mutexa.

    Hm, i nie mam opcji, zeby bylo inaczej ?
    Jak ktos wyjmie wtyczne od RS, a ten o nizszym priorytecie bedzie czekam na odpowiedz przez 100ms, to przez ten czas mutex bedzie blokowal to wyzsze zadanie ? Jakie jest wyjscie z tej malo komfortowej sytuacji ?

    Freddie Chopin wrote:

    Obsługi samej transmisji NIGDY nie robi się w kodzie wątku, tylko albo w DMA albo w przerwaniu, które pakuje dane do bufora - np. kolejki RTOSa.

    Nie wszystko ma DMA, za to przerwania raczej tak...czyli na obecnym etapie tego sie uchwyce ;)
    Czyli mam przerwanie od RS, jest mutex i wiem, ze nic mi tej transmisji nie zakloci.
    Dalej nie wiem co z czasami. Nadejdzie drugie zadanie, a ja jestem jeszcze w przerwaniu. Kontekst zadania 1 jest zachowany, nastepuje skok do drugiego zadania. Obsluga 2 nie moze trwac "za dlugo", bo w 1 bedzie crash jak wystapi timeot po stronie urzadzenia podpietego z drugiej strony.
    Jesli jest to RS z buforem sprzetowym i o nic sie nie martwie, to chociaz tyle, ze jeden czy 2 bajty mam zachowane. Ale co dalej ?
    Jesli zadan jest 100, to 1 zadanie bedzie wznowione naprawde po dlugim czasie szansa na timeout jest duza. Sa jakies zasady w tej sferze ? (po to sie daje szybki mcu, zeby nawet przy 100 zadaniach zdazyc ze wszystkim i za bardzo to rozkladam na czynniki pierwsze ?).
    Jesli juz jest kolejka, to co sie dzieje przy 10 taskach, ktore chca z niej skorzystac.
    Z tego co wyczytalem, to jest to bufor FIFO. Tylko byly przyklady dla zadania, ktore sobie z niego pobiera. Nie widzialem opisu dla 10 zadan, ktore chca z niego czerpac. Kazde robi kopie, zeby inne tez mialo dane ? To ktore by wtedy czyscilo te kolejke ? Bez sensu bylony marnowac RAM na 10 kolejek w takim wypadku.
    Gdyby sie dalo jeszcze sprawdzic, ktore zadanie utworzyle te kolejke, to moznaby zrobic tak, ze ono by ja w koncu czyscilo....ale pewnie robi sie to jeszcze inaczej :(


    jaskol wrote:
    Jesli jeden task sie wykona w 10ms, a drugi ma zatrzasniety mutex (zajete peryferia) i po 1ms wyjdzie z zadania, bo nie ma co robic...to co sie dzieje w wolnym czasie ? Niech systemTICK=1ms.
    Czy wprowadza sie jakies sztuczne opoznienie, zeby kazdy task mial tyle samo czasu i wtedy jest sprawiedliwie, czy maszyna pedzi dalej i nie ma zadnej synchronizacji ?
    Jestem w stanie wyobrazic sobie obydwie wersje i kazda ma swoje wady oraz zalety. Tylko, czy jest jakis standard, ze w 90% robi sie tak, a rzadko inaczej ?
    Bez sensu, zeby jakis Fourier sie liczyl 10 x dluzej tylko dlatego, ze inne zadanie jedno milisekundowe ma delay(9ms).
    Za to jesli zalezy mi na tym, zeby dokladnie co 10ms cos sie dzialo, to wtedy wersja z delay bylaby uzasadniona.


    Freddie Chopin wrote:

    Zadania (wątki) realizowane są wg priorytetów i wg możliwości (mutexy, kolejki, semafory, delay systemowy). Jeśli dany wątek zostaje wywłaszczony, to scheduler sprawdza które z pozostałych zadań może zostać uruchomione (patrząc od najwyższego do najniższego priorytetu). Nie odpowiem na Twoje pytanie wprost, ponieważ niezbyt je rozumiem.

    Ok, ale czy zadanie ma sztywny czas na swoje wykonanie i scheduler zawsze przelaczy na nastepne w takt systemTICK ?
    Czy jesli ktores zadanie jest krotkie (trwa krotko), to wprowadzone jest dodatkowe opoznienie, zeby sumarycznie kazde zadanie trwalo tyle samo czasu (co moze byc potrzebne), czy w wersji default jest tak, ze im szybciej dane zadanie sie wykona, tym szybciej moze byc obsluzone nastepne ?

    Freddie Chopin wrote:

    Poczytaj sobie tutaj http://www.freertos.org/implementation/a00004.html oraz kolejne strony z tej serii (czyli RTOS Fundamentals). Na stronie FreeRTOSa jest kilka interesujących artykułów, tylko ciężko je znaleźć pomiędzy nieinteresującymi (; Ta "seria" RTOS Fundamentals jest akurat chyba najciekawsza.

    4\/3!!


    Dziekuje za odpowiedzi.
    Teraz to juz musze znikac, ale wieczorem bede czytal.

    P.S.
    Chociaz tam juz bylem i widac chociazby z rysunkow, ze kazdy task trwa tyle samo.
    Nie ma jakiejs wersji albo nie zmienia sie tego w plikach konfiguracyjnych, zeby wszystko dzialalo tak szybko, jak tylko to mozliwe ?
    Innymi slowy, czy scheduler ma zawsze staly czas przelaczania, czy mozna go momentami "przyspieszyc", zeby inne zadania byly obsluzone szybciej ?
    (co do zasady, to kazde zadanie wykonuje sie fizycznie w innym czasie, bo w "swoim ciele" robi cos innego, ale kazde dostaje tyle samo czasu na wykonanie swojej czesci i to mi nie daje spokoju - czy tak jest, bo taka jest umowa, czy moze to sie zmienia, itd.)


    Wybacz beletrystyke, ale tak mi jest momentami wygodniej.

    Pozdrawiam,
    Mariusz

    Dodano po 3 [minuty]:

    jaskol wrote:
    Freddie Chopin wrote:

    Dotyczy to tylko zmiennych automatycznych. Zmienne statyczne są "wspólne" (istnieje tylko jedna kopia, niezależnie od ilości wątków).

    Ok, czyli nie zuzyje tyle ramu, jesli bede uzywal zmiennych static.
    Tylko, ze musze wtedy byc czujny, bo jeden watek moze mi zepsuc inny (zmiennaą) ? A mialo byc tak, ze jeden watek nic nie wie o drugim.
    Nic nie wie, ale swinie mu podlozyc moze ?

    Zatem jeden kontekst zrzuca/chowa wszystkie zmienne z danego zadania, a inne zadanie ma swoj kontekst i tak naprawde jesli maja jakies zmienne wspolne, to sobie je wzajemnie niszcza ?
    Jesli zalezy mi na tym, zeby dany task byl naprawde niezalezyny, to uzywam zmiennych automatycznych i o nic sie nie martwie.
    Dochodzi jeszcze przerwanie/stos i sprawa sie komplikuje, bo jesli jest np. 8 poziomowy, to szybko sie konczy.
    Innymi slowy, o co musze zadbac (w wymiarze zmiennych uywanych w danym zadaniu) i co jest wazne/ograniczajace ? Da sie tak w 3 punktach ?

    Freddie Chopin wrote:

    Zadanie o wyższym priorytecie zastanie zablokowane przez mutexa.

    Hm, i nie mam opcji, zeby bylo inaczej ?
    Jak ktos wyjmie wtyczne od RS, a ten o nizszym priorytecie bedzie czekam na odpowiedz przez 100ms, to przez ten czas mutex bedzie blokowal to wyzsze zadanie ? Jakie jest wyjscie z tej malo komfortowej sytuacji ?

    Freddie Chopin wrote:

    Obsługi samej transmisji NIGDY nie robi się w kodzie wątku, tylko albo w DMA albo w przerwaniu, które pakuje dane do bufora - np. kolejki RTOSa.

    Nie wszystko ma DMA, za to przerwania raczej tak...czyli na obecnym etapie tego sie uchwyce ;)
    Czyli mam przerwanie od RS, jest mutex i wiem, ze nic mi tej transmisji nie zakloci.
    Dalej nie wiem co z czasami. Nadejdzie drugie zadanie, a ja jestem jeszcze w przerwaniu. Kontekst zadania 1 jest zachowany, nastepuje skok do drugiego zadania (pomijajac fakt, ze przy prostych mcu wystapienie jednego przerwania blokuje automatycznie mozliwosc obslugi jakiegokolwiek innego....). Obsluga 2 nie moze trwac "za dlugo", bo w 1 bedzie crash jak wystapi timeot po stronie urzadzenia podpietego z drugiej strony.
    Jesli jest to RS z buforem sprzetowym i o nic sie nie martwie, to chociaz tyle, ze jeden czy 2 bajty mam zachowane. Ale co dalej ?
    Jesli zadan jest 100, to 1 zadanie bedzie wznowione naprawde po dlugim czasie szansa na timeout jest duza. Sa jakies zasady w tej sferze ? (po to sie daje szybki mcu, zeby nawet przy 100 zadaniach zdazyc ze wszystkim i za bardzo to rozkladam na czynniki pierwsze ?).
    Jesli juz jest kolejka, to co sie dzieje przy 10 taskach, ktore chca z niej skorzystac.
    Z tego co wyczytalem, to jest to bufor FIFO. Tylko byly przyklady dla zadania, ktore sobie z niego pobiera. Nie widzialem opisu dla 10 zadan, ktore chca z niego czerpac. Kazde robi kopie, zeby inne tez mialo dane ? To ktore by wtedy czyscilo te kolejke ? Bez sensu bylony marnowac RAM na 10 kolejek w takim wypadku.
    Gdyby sie dalo jeszcze sprawdzic, ktore zadanie utworzyle te kolejke, to moznaby zrobic tak, ze ono by ja w koncu czyscilo....ale pewnie robi sie to jeszcze inaczej :(


    jaskol wrote:
    Jesli jeden task sie wykona w 10ms, a drugi ma zatrzasniety mutex (zajete peryferia) i po 1ms wyjdzie z zadania, bo nie ma co robic...to co sie dzieje w wolnym czasie ? Niech systemTICK=1ms.
    Czy wprowadza sie jakies sztuczne opoznienie, zeby kazdy task mial tyle samo czasu i wtedy jest sprawiedliwie, czy maszyna pedzi dalej i nie ma zadnej synchronizacji ?
    Jestem w stanie wyobrazic sobie obydwie wersje i kazda ma swoje wady oraz zalety. Tylko, czy jest jakis standard, ze w 90% robi sie tak, a rzadko inaczej ?
    Bez sensu, zeby jakis Fourier sie liczyl 10 x dluzej tylko dlatego, ze inne zadanie jedno milisekundowe ma delay(9ms).
    Za to jesli zalezy mi na tym, zeby dokladnie co 10ms cos sie dzialo, to wtedy wersja z delay bylaby uzasadniona.


    Freddie Chopin wrote:

    Zadania (wątki) realizowane są wg priorytetów i wg możliwości (mutexy, kolejki, semafory, delay systemowy). Jeśli dany wątek zostaje wywłaszczony, to scheduler sprawdza które z pozostałych zadań może zostać uruchomione (patrząc od najwyższego do najniższego priorytetu). Nie odpowiem na Twoje pytanie wprost, ponieważ niezbyt je rozumiem.

    Ok, ale czy zadanie ma sztywny czas na swoje wykonanie i scheduler zawsze przelaczy na nastepne w takt systemTICK ?
    Czy jesli ktores zadanie jest krotkie (trwa krotko), to wprowadzone jest dodatkowe opoznienie, zeby sumarycznie kazde zadanie trwalo tyle samo czasu (co moze byc potrzebne), czy w wersji default jest tak, ze im szybciej dane zadanie sie wykona, tym szybciej moze byc obsluzone nastepne ?

    Freddie Chopin wrote:

    Poczytaj sobie tutaj http://www.freertos.org/implementation/a00004.html oraz kolejne strony z tej serii (czyli RTOS Fundamentals). Na stronie FreeRTOSa jest kilka interesujących artykułów, tylko ciężko je znaleźć pomiędzy nieinteresującymi (; Ta "seria" RTOS Fundamentals jest akurat chyba najciekawsza.

    4\/3!!


    Dziekuje za odpowiedzi.
    Teraz to juz musze znikac, ale wieczorem bede czytal.

    P.S.
    Chociaz tam juz bylem i widac chociazby z rysunkow, ze kazdy task trwa tyle samo.
    Nie ma jakiejs wersji albo nie zmienia sie tego w plikach konfiguracyjnych, zeby wszystko dzialalo tak szybko, jak tylko to mozliwe ?
    Innymi slowy, czy scheduler ma zawsze staly czas przelaczania, czy mozna go momentami "przyspieszyc", zeby inne zadania byly obsluzone szybciej ?
    (co do zasady, to kazde zadanie wykonuje sie fizycznie w innym czasie, bo w "swoim ciele" robi cos innego, ale kazde dostaje tyle samo czasu na wykonanie swojej czesci i to mi nie daje spokoju - czy tak jest, bo taka jest umowa, czy moze to sie zmienia, itd.)


    Wybacz beletrystyke, ale tak mi jest momentami wygodniej.

    Pozdrawiam,
    Mariusz
  • #95
    Freddie Chopin
    MCUs specialist
    jaskol wrote:
    Dochodzi jeszcze przerwanie/stos i sprawa sie komplikuje, bo jesli jest np. 8 poziomowy, to szybko sie konczy.

    Ale o czym Ty debatujesz? W ARMie stos jest programowy i nie ma w nim żadnego ograniczenia, tak samo jak nie ma żadnych banków pamięci i innych głupot wymyślonych przez Microchipa.

    jaskol wrote:
    Innymi slowy, o co musze zadbac (w wymiarze zmiennych uywanych w danym zadaniu) i co jest wazne/ograniczajace ? Da sie tak w 3 punktach ?

    Raczej w 3 wykładach po godzinę każdy. Przede wszystkim zrób coś, przestań od razu na wstępie kombinować jak oszczędzić pamięć używając zmiennych statycznych itd. RTOSy nie służą do oszczędzania pamięci. Na razie poruszamy się na granicy teorii i absurdu, a jeśli chcesz się czegoś nauczyć, to musisz niestety przejść do praktyki.

    jaskol wrote:
    Hm, i nie mam opcji, zeby bylo inaczej ?
    Jak ktos wyjmie wtyczne od RS, a ten o nizszym priorytecie bedzie czekam na odpowiedz przez 100ms, to przez ten czas mutex bedzie blokowal to wyzsze zadanie ? Jakie jest wyjscie z tej malo komfortowej sytuacji ?

    Priority inheritance, zaimplementowane w wielu RTOSach. Wciąż jednak debatujemy o niczym, ponieważ szukasz w tym momencie rozwiązania problemu który sam stworzyłeś (tak jak socjalizm, w którym bohatersko rozwiązuje się problemy nieznane w innych ustrojach) - skoro zaprojektowałeś system w którym jeden zasób blokujący jest dzielony przez zadanie o wyższym i niższym priorytecie, to czego się spodziewasz jeśli nie przyblokowania jednego z tych zadań gdy obydwa chcą korzystać z zasobu jednocześnie?

    jaskol wrote:
    Dalej nie wiem co z czasami. Nadejdzie drugie zadanie, a ja jestem jeszcze w przerwaniu. Kontekst zadania 1 jest zachowany, nastepuje skok do drugiego zadania. Obsluga 2 nie moze trwac "za dlugo", bo w 1 bedzie crash jak wystapi timeot po stronie urzadzenia podpietego z drugiej strony.

    Jak wyżej - jak zaprojektowałeś system żeby nie działał dobrze to ... nie będzie działał dobrze. RTOS nie służy do rozwiązywania tego typu problemów - od tego jest projektant systemu, żeby wszystko dobrze zaprojektować.

    jaskol wrote:
    Jesli zadan jest 100, to 1 zadanie bedzie wznowione naprawde po dlugim czasie szansa na timeout jest duza. Sa jakies zasady w tej sferze ? (po to sie daje szybki mcu, zeby nawet przy 100 zadaniach zdazyc ze wszystkim i za bardzo to rozkladam na czynniki pierwsze ?).

    Tym razem znów osuwamy się w obszar absurdu. Nie wiem co byś musiał projektować i jaki mieć układ żeby mieć na nim 100 wątków... Ja nie miałem nigdy więcej niż 10, a wszystkie przez większość czasu i tak nic nie robiły tylko czekały na "coś".

    jaskol wrote:
    Nie widzialem opisu dla 10 zadan, ktore chca z niego czerpac.

    Nie było takiego przykładu, bo coś takiego jest totalnie bezsensowne (choć oczywiście możliwe). Spróbuj w przerwaniu z dwóch timerów czytać jednocześnie z jednego UARTa to przekonasz się dlaczego coś takiego jest bezsensowne.

    jaskol wrote:
    Gdyby sie dalo jeszcze sprawdzic, ktore zadanie utworzyle te kolejke, to moznaby zrobic tak, ze ono by ja w koncu czyscilo....ale pewnie robi sie to jeszcze inaczej

    Naprawdę nie wiem o jaki problem Ci teraz chodzi, ale obawiam się, że po prostu jeszcze nie "czujesz" do czego się używa RTOSowych kolejek.

    jaskol wrote:
    Ok, ale czy zadanie ma sztywny czas na swoje wykonanie i scheduler zawsze przelaczy na nastepne w takt systemTICK ?

    Zajrzałeś do linków które Ci podałem? Wywłaszczenie następuje tylko w następujących przypadkach:
    - wątek zażyczył sobie tego sam - wywołując funkcję typu yield() (równie dobrze jednak może być natychmiast przywrócony do działania jeśli akurat jest zadaniem o najwyższym priorytecie które może zostać uruchomione),
    - wątek zostaje zablokowany, bo czeka na coś co chwilowo jest niedostępne (np. na zapełnienie kolejki czy zwolnienie mutexa),
    - inny wątek o wyższym priorytecie został odblokowany,
    - minął czas przeznaczony dla danego wątku, a gotowy do działania jest inny wątek o tym samym priorytecie.

    To ostatnie to jest właśnie round-robin time-slicing. Wszystkie te rzeczy (poza ostatnią oczywiście) dzieją się "asynchronicznie" względem "system tick" - one po prostu następują "natychmiast" po zmianie stanu danego obiektu synchronizacyjnego.

    jaskol wrote:
    Czy jesli ktores zadanie jest krotkie (trwa krotko), to wprowadzone jest dodatkowe opoznienie, zeby sumarycznie kazde zadanie trwalo tyle samo czasu (co moze byc potrzebne), czy w wersji default jest tak, ze im szybciej dane zadanie sie wykona, tym szybciej moze byc obsluzone nastepne ?

    Nie ma żadnego opóźnienia - wątki wykonywane są wg priorytetu.

    jaskol wrote:
    Chociaz tam juz bylem i widac chociazby z rysunkow, ze kazdy task trwa tyle samo.

    Jakbyś jeszcze doczytał to co pisze obok rysunków... Obrazek ten dotyczy tylko i wyłącznie wątków o identycznym priorytecie które się na niczym nie będą blokować, czyli wykorzystuje jedynie 4-ty punkt z podanych powyżej. To po prostu obrazek pokazujący na czym polega "równoległość" pracy wątków, a Ty na siłę szukasz tam czwartego dna...

    jaskol wrote:
    Innymi slowy, czy scheduler ma zawsze staly czas przelaczania, czy mozna go momentami "przyspieszyc", zeby inne zadania byly obsluzone szybciej ?

    Częstotliwość występowania "system tick" jest stała. Mylisz jednak sprawy, ponieważ ta częstotliwość ma mało wspólnego z tym o czym teraz rozmyślasz.

    4\/3!!
  • #96
    nsvinc
    Level 35  
    Freddie Chopin wrote:
    Aby w przerwaniach mieć obiekty trzeba faktycznie zrobić sobie menadżera przerwań, który miałby dodatkowy poziom "przeskoku"

    I w tym tkwi cala zabawa. Bez tego menadzera, przekazywanie danych miedzy ISRem a obiektami da sie chyba tylko przez globale, i to takie ktore obiektami nie sa; a przynajmniej mi tak dzialalo. Ale co to za c++ jesli i tak musze klepać udziwniony interfejs miedzy c a c++ dla każdego peryferiala z przerwaniami... To skutecznie odstrasza.

    Freddie Chopin wrote:
    W assemblerze też można i co z tego? (; Jest naprawdę bardzo mało rzeczy których nie da się zrobić w C, a da w C++, ale takich które się da zrobić wygodnie w C++, a w C to mozolne "rzeźbienie", jest bardzo dużo

    Zdaję sobie doskonale z tego sprawę; mam projekt do którego 3 razy podchodziłem pożądając wręcz C++ (taka specyfika kodu), ale odstraszyły mnie udziwnienia wokół przerwań no i wielkie komplikacje z kompilacją RTOSa. A czasu było mało, więc napisałem w C...

    Freddie Chopin wrote:
    A co do RTOSa to od dawna chodzi mi po głowie napisanie własnego - będę pamiętał, żeby po uwagi zgłosić się do Ciebie, bo widzę że w sumie mamy podobne potrzeby... No może częściowo, bo mnie na "lekkości" aż tak bardzo nie zależy, a "lopatologiczny" to on na pewno nie będzie, gdyż chciałbym go oprzeć na POSIX i std::thread z C++11.

    Nie mam pojęcia czym jest std::thread oprocz tego, ze wiem o jego istnieniu. Jednak ja nie preferuję pchania się w zgodnosc z standardami rodem z PCtów jeśli to ma chodzic na mikroklocku. Z drugiej strony najprzyjemniejszy OS byłby taki, ktorego uzywa się równie łatwo co QThread'ów, a jednoczesnie wszelkie obiekty wymagajace arbitralna ilosc pamieci, tworzylo sie z template'ów. Stercie stanowcze nie.
    Czego mi bardzo brakuje w RTOSach ogólnie, to umiejętność czekania na różne obiekty synchronizacyjne jednocześnie, obrazowo pokazując:
    Code:

    wait_for(flag_killImmediately || flag_abort || rx_queue_not_empty || cmd_queue_not_empty)

    a skuteczna metoda implementacji takiego czegos byłoby oparcie dowolnego czekania o flagi, z mozliwoscia podłączenia wewnątrz RTOSa roznych statusów innych obiektow synchronizacyjnych pod te flagi. Teraz w oparciu o prymitywy piszę sam takie mechanizmy; tylko to marnotrawstwo czasu. Rowniez fajnym ficzerem byloby czekanie na zdarzenie zmiany flagi (toggle) a nie tylko na ustawienie lub zgaszenie...

    gaskoin wrote:
    Tym się charakteryzuje źle napisany kod - trzeba go pisać od nowa kiedy następują zmiany w wymaganiach. Trzeba się na to odpowiednio wcześniej przygotować. Zgadnij co się najczęściej zmienia w projektach ? Wymagania.

    To jeden przypadek. Drugi to taki, w którym ktoś chce coś czego w ogóle miało nie być. Nie dajmy się zwariować. Największą uniwersalność pod klienta tak, zeby on sam mógł sobie swoje potrzeby implementować, jest hm... bajtkod. Jeden interpreter, miliard mozliwosci - niemal java. Tylko to zaczyna być trochę zwyrodniałe bo klient bajtkodu się nie nauczy a nie spieszy mi się do pisania kompilatorów.
    Wciąż musi byc jasno zdefiniowane zachowanie danego urządzenia, else trzeba sie pchać w interpretery bajtkodu i robi sie z tego smierdzaca bryndza. Zmiana zachowania urządzenia to najwieksze paskudztwo jakie klient moze zrobic programiście, w szczegolnosci w koncowych fazach projektu...
  • #97
    Freddie Chopin
    MCUs specialist
    nsvinc wrote:
    Z drugiej strony najprzyjemniejszy OS byłby taki, ktorego uzywa się równie łatwo co QThread'ów

    QThread to przecież lekka abstrakcja nad POSIX, zapewne bardzo podobna do std::thread. Do zalet trzymania się standardu łatwo się przekonać - wystarczy np zauważyć, że mając na mikrokontrolerze pthread i runtime POSIXowy można na nim z powodzeniem uruchomić programy z PC (oczywiście odpowiednio małe, a nie Windowsa <: ). Tak wiec zamiast wymyślać po raz setny koło (tak jakby mało było rozmaitych API dla RTOSów), lepiej wziąć coś co istnieje już od lat.

    nsvinc wrote:
    Czego mi bardzo brakuje w RTOSach ogólnie, to umiejętność czekania na różne obiekty synchronizacyjne jednocześnie

    No widzisz, przed chwilą narzekałeś na POSIXa i std::thread, a tam już takie rzeczy wymyślono dawno temu... Wystarczy użyć np. "condition variable" lub fajnego interfejsu do oczekiwania na wiele plików/strumieni jednocześnie, czyli funkcji poll()/select()... Przy okazji w std::thread są gotowe funkcje czekające na wiele mutexów (a w zasadzie "locków") jednocześnie http://en.cppreference.com/w/cpp/thread/lock .

    nsvinc wrote:
    odstraszyły mnie udziwnienia wokół przerwań

    To o czym pisałem poprzedno - menadżer przerwań dla danego interfejsu (np. dla wszystkich UARTów), zajmuje u mnie chyba aż ze 4 linijki, więc gdzie problem? W klasie UART masz statyczną tablicę ze wskaźnikami na obiekty (pierwszy dla UART1, drugi dla UART2, trzeci dla UART3, ...), w konstruktorze się "zapisujesz", w destruktorze "wypisujesz", a przerwanie po prostu wywołuje funkcję "interrupt" dla obiektu z tablicy... No - niech będzie, że lekką komplikacją jest to, że przerwania muszą być "friend" klasy, ale to detal.

    4\/3!!
  • Optex
  • #98
    gaskoin
    Level 38  
    nsvinc wrote:
    Zmiana zachowania urządzenia to najwieksze paskudztwo jakie klient moze zrobic programiście, w szczegolnosci w koncowych fazach projektu...


    Nie mówię tu o skrajnych przypadkach, bo takie też miewałem. Nie dało się stworzyć architektury oprogramowania, bo co chwilę się okazywało, że jest inna domena niż klient sam myślał. Informacji było null, ale "macie robić"... Kontakt z klientem zerowy. Tacy u wróżki powinni zamawiać oprogramowanie.

    nsvinc wrote:
    Wszelkie obiekty wymagajace arbitralna ilosc pamieci, tworzylo sie z template'ów. Stercie stanowcze nie.


    Da się to zrobić robiąc heapa programowego, no ale tu pozostaje kwestia tego jak tym heapem zarządzać. Można mieć heap per object (każda klasa ma z góry założoną pulę pamięci jaką można przeznaczyć na obiekty), ale w bardziej złożonych przypadkach wymaga to napisania jakiegoś chociażby prostego MemoryAllocatora, który zajmie się sprawdzaniem wolnej pamięci.

    nsvinc wrote:
    Wciąż musi byc jasno zdefiniowane zachowanie danego urządzenia, else trzeba sie pchać w interpretery bajtkodu i robi sie z tego smierdzaca bryndza. Zmiana zachowania urządzenia to najwieksze paskudztwo jakie klient moze zrobic programiście, w szczegolnosci w koncowych fazach projektu...


    Generalnie polecam http://www.amazon.co.uk/gp/product/1856177076/ albo jakąkolwiek inną książkę o projektowaniu oprogramowania. Wtedy większość problemów typu "głupi klient zmienił działanie" zniknie. No chyba, że chodzi Ci o zmiany typu "klient chciał na początku wiertarkę, a pod koniec powiedział, że miała być przecież winda".

    Mam jeszcze coś takiego http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
  • #99
    nsvinc
    Level 35  
    Skoro jest tak jak mowisz to ten menadzer w sumie potrzebny nie jest, jesli zrobię ISRa extern "C" ktory będzie 'friend' klasy ktora tego przerwania potrzebuje. Jednak z jakiegos powodu pół roku temu to mi nie działało a kombinowałem również w taki sposob jak opisujesz. W wolnej chwili sprawdze to na spokojnie jeszcze raz ;]

    Freddie Chopin wrote:
    No widzisz, przed chwilą narzekałeś na POSIXa i std::thread, a tam już takie rzeczy wymyślono dawno temu... Wystarczy użyć np. "condition variable" lub fajnego interfejsu do oczekiwania na wiele plików/strumieni jednocześnie, czyli funkcji poll()/select()...

    Czy aby te strumienie mogą mieć statycznie zdefiniowany bufor i nie grzebały na stercie? ;] Jakos nie mogę się przekonać do pisania na mikroklocki z podejsciem "nie wnikać zbyt bardzo jak to działa", w przeciwienstwie do pisania na PC...
  • #100
    tplewa
    Level 39  
    gaskoin wrote:

    No chyba, że chodzi Ci o zmiany typu "klient chciał na początku wiertarkę, a pod koniec powiedział, że miała być przecież winda".


    Z praktyki wiem ze tak jest dosc czesto ;)
  • #101
    Freddie Chopin
    MCUs specialist
    Strumieniom można podać ręcznie bufor używając funkcji setvbuf(), albo można oczywiście buforowanie całkowicie wyłączyć.

    Nie wiem co się tak boisz tej dynamicznej alokacji - ona nie gryzie, C++ też nie <:

    4\/3!!
  • #102
    gaskoin
    Level 38  
    Wydaje mi się, że ten temat po prostu wybuchł :)
  • #103
    nsvinc
    Level 35  
    gaskoin wrote:
    Da się to zrobić robiąc heapa programowego, no ale tu pozostaje kwestia tego jak tym heapem zarządzać. Można mieć heap per object (każda klasa ma z góry założoną pulę pamięci jaką można przeznaczyć na obiekty), ale w bardziej złożonych przypadkach wymaga to napisania jakiegoś chociażby prostego MemoryAllocatora, który zajmie się sprawdzaniem wolnej pamięci.

    Zaden memory allocator. Jedyne na co się zgadzam i co praktykuję to "dynamiczny" przydział bloków o stałej wielkości; a znam dokladnie jak działa ten mechanizm w TNKernelu, to mam pojęcie o tym ile przydział/zwolnienie może trwać, i mogę oszacować czy taki gwałt mogę wykonywać np. w przerwaniu.
    Chociaz i tak preferuję mechanizm zwykłego interpretowanego FIFO nawet do przerzucania np kompletnych payloadów pakietów - tylko wykorzystuję patent zeby wskaznik zapisu ostatecznie zmienial sie dopiero po wepchnieciu calej tresci do kolejki. Jesli jest jeden producent i jeden konsument, zaden mutex nie jest potrzebny, nie ma wyscigu na modyfikacje tej samej zmiennej, a zeby uniknac pollingu kazde wepchniecie do kolejki konczy sie rzuceniem semafora. Nie ma malloc'a, nie ma kolejek 'zwrotnych' na puste bufory, nie ma szopek.

    Freddie Chopin wrote:
    Nie wiem co się tak boisz tej dynamicznej alokacji - ona nie gryzie, C++ też nie <:

    Są konkretne powody; pierwszy z nich to czas alokacji, drugi to problemy z fragmentacją pamięci, trzeci to garbage collection. Standardowy malloc w przerwaniu to pomyłka jesli chodzi o czas wykonywania...

    Z doswiadczenia wiem, ze przez głupotę/nieuwagę (w szczegolnosci w C++) jedna linijka kodu typu a=b; moze trwać 'do jutra'. To samo dotyczy też C, gdzie proces kopiowania 'wielkiej' spakowanej struktury z ogromem bitfieldów konczy sie kilobajtem kodu i zmarnowaniem dziesiatek us. A reczny 'clone' ktory na siłę po prostu kopiuje bajty spod wskaznikow (rzut na u8*) ta sama strukture kopiuje w kilka us, i funkcja ma kilka instrukcji.

    I na koniec ;)
    Bjarne Stroustrup wrote:
    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg.
  • #104
    Freddie Chopin
    MCUs specialist
    nsvinc wrote:
    Są konkretne powody; pierwszy z nich to czas alokacji, drugi to problemy z fragmentacją pamięci, trzeci to garbage collection. Standardowy malloc w przerwaniu to pomyłka jesli chodzi o czas wykonywania...

    Przesada - malloc trwa (sprawdzałem) koło 150 cykli - nie wiem gdzie tutaj tragedia... Dłużej może trwać free, zwłaszcza jeśli będzie łączył bloki. Fragmentacja to problem tylko w pewnych przypadkach, natomiast garbage collection przecież nie występuje w C++? Może chodziło Ci o wycieki zasobów? Na to w C++11 tez jest metoda - unique_ptr<>.

    nsvinc wrote:
    Z doswiadczenia wiem, ze przez głupotę/nieuwagę (w szczegolnosci w C++) jedna linijka kodu typu a=b; moze trwać 'do jutra'. To samo dotyczy też C, gdzie proces kopiowania 'wielkiej' spakowanej struktury z ogromem bitfieldów konczy sie kilobajtem kodu i zmarnowaniem dziesiatek us. A reczny 'clone' ktory na siłę po prostu kopiuje bajty spod wskaznikow (rzut na u8*) ta sama strukture kopiuje w kilka us, i funkcja ma kilka instrukcji

    Widzę że lubisz wymyślać koło na nowo - zamiast "ręcznego clone" lepiej użyć memcpy(), które zresztą i tak zostanie wywołane przez kompilator w przypadku a = b; - przynajmniej przez beznadziejne GCC (; Jedynym wyjątkiem może być tutaj C++ gdy obiekt ma operator przypisania albo gdy obiekty wewnątrz mają nietrywialne konstruktory, no ale wtedy kompilator robi dokładnie to o co go prosisz.

    Tak wiec proszę - nie powielajmy już mitów, które może były prawdziwe 100 lat temu...

    Code: C
    Log in, to see the code


    Code:
       Test b = a;
    
     800876e:   4669         mov   r1, sp
     8008770:   2288         movs   r2, #136   ; 0x88
     8008772:   a822         add   r0, sp, #136   ; 0x88
     8008774:   f7fc fdd7    bl   8005326 <memcpy>


    (funkcja no_inline() jest tylko po to, żeby kompilator nie wywalił tego kodu)

    4\/3!!
  • #105
    nsvinc
    Level 35  
    Zrobilem faktycznie identyczny test pod zwyklym C (armcc 5.04) i jak na zlosc nie udaje mi sie powtorzyc zjawiska ktore spotkalem w prawie gotowym juz projekcie. A tu faktycznie kompilator uzywa memcpy. Czemu nie robił tego w tamtym projekcie - nie mam pojęcia.
    No i mniej więcej coś się okazuje:
    Code:

    ;;;525    //conf_copy(&confCopy,(Conf_global*)&confg);
    ;;;526    confg=confCopy;
    001290  49b0              LDR      r1,|L1.5460|
    001292  48b1              LDR      r0,|L1.5464|
    001294  880a              LDRH     r2,[r1,#0]  ; confCopy
    001296  7002              STRB     r2,[r0,#0]
    001298  0a12              LSRS     r2,r2,#8
    00129a  7042              STRB     r2,[r0,#1]
    00129c  884a              LDRH     r2,[r1,#2]  ; confCopy
    00129e  7082              STRB     r2,[r0,#2]
    0012a0  0a12              LSRS     r2,r2,#8
    0012a2  70c2              STRB     r2,[r0,#3]
    0012a4  888a              LDRH     r2,[r1,#4]  ; confCopy
    0012a6  7102              STRB     r2,[r0,#4]
    0012a8  0a12              LSRS     r2,r2,#8
    0012aa  7142              STRB     r2,[r0,#5]
    0012ac  88ca              LDRH     r2,[r1,#6]  ; confCopy
    0012ae  7182              STRB     r2,[r0,#6]
    0012b0  0a12              LSRS     r2,r2,#8
    0012b2  71c2              STRB     r2,[r0,#7]
    0012b4  7a0a              LDRB     r2,[r1,#8]  ; confCopy
    0012b6  7202              STRB     r2,[r0,#8]
    0012b8  9a0e              LDR      r2,[sp,#0x38]
    0012ba  7a53              LDRB     r3,[r2,#9]  ; confCopy
    0012bc  7a12              LDRB     r2,[r2,#8]  ; confCopy
    0012be  021b              LSLS     r3,r3,#8
    0012c0  4313              ORRS     r3,r3,r2
    0012c2  9a0f              LDR      r2,[sp,#0x3c]
    0012c4  7213              STRB     r3,[r2,#8]
    0012c6  0a1b              LSRS     r3,r3,#8
    0012c8  7253              STRB     r3,[r2,#9]
    0012ca  9a20              LDR      r2,[sp,#0x80]
    0012cc  7a53              LDRB     r3,[r2,#9]  ; confCopy
    0012ce  7a14              LDRB     r4,[r2,#8]  ; confCopy
    0012d0  021a              LSLS     r2,r3,#8
    0012d2  9b21              LDR      r3,[sp,#0x84]
    0012d4  4322              ORRS     r2,r2,r4
    0012d6  721a              STRB     r2,[r3,#8]
    0012d8  0a12              LSRS     r2,r2,#8
    0012da  725a              STRB     r2,[r3,#9]
    0012dc  9a0e              LDR      r2,[sp,#0x38]
    0012de  7b53              LDRB     r3,[r2,#0xd]  ; confCopy
    0012e0  7b12              LDRB     r2,[r2,#0xc]  ; confCopy
    0012e2  021b              LSLS     r3,r3,#8
    0012e4  4313              ORRS     r3,r3,r2
    0012e6  9a0f              LDR      r2,[sp,#0x3c]
    0012e8  7313              STRB     r3,[r2,#0xc]
    0012ea  0a1b              LSRS     r3,r3,#8
    0012ec  7353              STRB     r3,[r2,#0xd]
    0012ee  7bca              LDRB     r2,[r1,#0xf]  ; confCopy
    0012f0  73c2              STRB     r2,[r0,#0xf]
    0012f2  7c0a              LDRB     r2,[r1,#0x10]  ; confCopy
    0012f4  7402              STRB     r2,[r0,#0x10]
    0012f6  9a0e              LDR      r2,[sp,#0x38]
    0012f8  7c53              LDRB     r3,[r2,#0x11]  ; confCopy
    0012fa  7c14              LDRB     r4,[r2,#0x10]  ; confCopy
    0012fc  021a              LSLS     r2,r3,#8
    0012fe  9b0f              LDR      r3,[sp,#0x3c]
    001300  4322              ORRS     r2,r2,r4
    001302  741a              STRB     r2,[r3,#0x10]
    001304  0a12              LSRS     r2,r2,#8
    001306  745a              STRB     r2,[r3,#0x11]
    001308  7cca              LDRB     r2,[r1,#0x13]  ; confCopy
    00130a  74c2              STRB     r2,[r0,#0x13]
    00130c  8a8a              LDRH     r2,[r1,#0x14]  ; confCopy
    00130e  7502              STRB     r2,[r0,#0x14]
    001310  0a12              LSRS     r2,r2,#8
    001312  7542              STRB     r2,[r0,#0x15]
    001314  8aca              LDRH     r2,[r1,#0x16]  ; confCopy
    001316  7582              STRB     r2,[r0,#0x16]
    001318  0a12              LSRS     r2,r2,#8
    00131a  75c2              STRB     r2,[r0,#0x17]
    00131c  8b0a              LDRH     r2,[r1,#0x18]  ; confCopy
    00131e  7602              STRB     r2,[r0,#0x18]
    001320  0a12              LSRS     r2,r2,#8
    001322  7642              STRB     r2,[r0,#0x19]
    001324  8b4a              LDRH     r2,[r1,#0x1a]  ; confCopy
    001326  7682              STRB     r2,[r0,#0x1a]
    001328  0a12              LSRS     r2,r2,#8
    00132a  76c2              STRB     r2,[r0,#0x1b]
    00132c  9a07              LDR      r2,[sp,#0x1c]
    00132e  7813              LDRB     r3,[r2,#0]  ; confCopy
    001330  7703              STRB     r3,[r0,#0x1c]
    001332  7852              LDRB     r2,[r2,#1]  ; confCopy
    001334  7742              STRB     r2,[r0,#0x1d]
    001336  9a06              LDR      r2,[sp,#0x18]
    001338  4603              MOV      r3,r0
    00133a  7814              LDRB     r4,[r2,#0]  ; confCopy
    00133c  779c              STRB     r4,[r3,#0x1e]
    00133e  7852              LDRB     r2,[r2,#1]  ; confCopy
    001340  77da              STRB     r2,[r3,#0x1f]
    001342  9a07              LDR      r2,[sp,#0x1c]
    001344  9b00              LDR      r3,[sp,#0]
    001346  7914              LDRB     r4,[r2,#4]  ; confCopy
    001348  701c              STRB     r4,[r3,#0]
    00134a  7952              LDRB     r2,[r2,#5]  ; confCopy
    00134c  705a              STRB     r2,[r3,#1]
    00134e  9a06              LDR      r2,[sp,#0x18]
    001350  9b02              LDR      r3,[sp,#8]
    001352  7914              LDRB     r4,[r2,#4]  ; confCopy
    001354  701c              STRB     r4,[r3,#0]
    001356  7952              LDRB     r2,[r2,#5]  ; confCopy
    001358  705a              STRB     r2,[r3,#1]
    00135a  9a00              LDR      r2,[sp,#0]
    00135c  7912              LDRB     r2,[r2,#4]  ; confg
    00135e  0853              LSRS     r3,r2,#1
    001360  9a01              LDR      r2,[sp,#4]
    001362  005b              LSLS     r3,r3,#1
    001364  7912              LDRB     r2,[r2,#4]  ; confCopy
    001366  07d4              LSLS     r4,r2,#31
    001368  0fe4              LSRS     r4,r4,#31
    00136a  4323              ORRS     r3,r3,r4
    00136c  9c00              LDR      r4,[sp,#0]
    00136e  7123              STRB     r3,[r4,#4]
    001370  7923              LDRB     r3,[r4,#4]  ; confg
    001372  24fd              MOVS     r4,#0xfd
    001374  4023              ANDS     r3,r3,r4
    001376  0794              LSLS     r4,r2,#30
    001378  0fe4              LSRS     r4,r4,#31
    00137a  0064              LSLS     r4,r4,#1
    00137c  4323              ORRS     r3,r3,r4
    00137e  9c00              LDR      r4,[sp,#0]
    001380  7123              STRB     r3,[r4,#4]
    001382  7923              LDRB     r3,[r4,#4]  ; confg
    001384  24fb              MOVS     r4,#0xfb
    001386  4023              ANDS     r3,r3,r4
    001388  0754              LSLS     r4,r2,#29
    00138a  0fe4              LSRS     r4,r4,#31
    00138c  00a4              LSLS     r4,r4,#2
    00138e  4323              ORRS     r3,r3,r4
    001390  9c00              LDR      r4,[sp,#0]
    001392  7123              STRB     r3,[r4,#4]
    001394  7924              LDRB     r4,[r4,#4]  ; confg
    001396  0715              LSLS     r5,r2,#28
    001398  23f7              MOVS     r3,#0xf7
    00139a  0fed              LSRS     r5,r5,#31
    00139c  401c              ANDS     r4,r4,r3
    00139e  00ed              LSLS     r5,r5,#3
    0013a0  432c              ORRS     r4,r4,r5
    0013a2  9d00              LDR      r5,[sp,#0]
    0013a4  712c              STRB     r4,[r5,#4]
    0013a6  792d              LDRB     r5,[r5,#4]  ; confg
    0013a8  06d6              LSLS     r6,r2,#27
    0013aa  24ef              MOVS     r4,#0xef
    0013ac  0ff6              LSRS     r6,r6,#31
    0013ae  4025              ANDS     r5,r5,r4
    0013b0  0136              LSLS     r6,r6,#4
    0013b2  4335              ORRS     r5,r5,r6
    0013b4  9e00              LDR      r6,[sp,#0]
    0013b6  7135              STRB     r5,[r6,#4]
    0013b8  7936              LDRB     r6,[r6,#4]  ; confg
    0013ba  0697              LSLS     r7,r2,#26
    0013bc  25df              MOVS     r5,#0xdf
    0013be  0fff              LSRS     r7,r7,#31
    0013c0  402e              ANDS     r6,r6,r5
    0013c2  017f              LSLS     r7,r7,#5
    0013c4  433e              ORRS     r6,r6,r7
    0013c6  9f00              LDR      r7,[sp,#0]
    0013c8  713e              STRB     r6,[r7,#4]
    0013ca  793e              LDRB     r6,[r7,#4]  ; confg
    0013cc  27bf              MOVS     r7,#0xbf
    0013ce  403e              ANDS     r6,r6,r7
    0013d0  0657              LSLS     r7,r2,#25
    0013d2  0fff              LSRS     r7,r7,#31
    0013d4  01bf              LSLS     r7,r7,#6
    0013d6  433e              ORRS     r6,r6,r7
    0013d8  9f00              LDR      r7,[sp,#0]
    0013da  713e              STRB     r6,[r7,#4]
    0013dc  793e              LDRB     r6,[r7,#4]  ; confg
    0013de  09d2              LSRS     r2,r2,#7
    0013e0  0676              LSLS     r6,r6,#25
    0013e2  0e76              LSRS     r6,r6,#25
    0013e4  01d2              LSLS     r2,r2,#7
    0013e6  4316              ORRS     r6,r6,r2
    0013e8  713e              STRB     r6,[r7,#4]
    0013ea  797a              LDRB     r2,[r7,#5]  ; confg
    0013ec  0856              LSRS     r6,r2,#1
    0013ee  9a01              LDR      r2,[sp,#4]
    0013f0  0076              LSLS     r6,r6,#1
    0013f2  7952              LDRB     r2,[r2,#5]  ; confCopy
    0013f4  07d7              LSLS     r7,r2,#31
    0013f6  0fff              LSRS     r7,r7,#31
    0013f8  433e              ORRS     r6,r6,r7
    0013fa  9f00              LDR      r7,[sp,#0]
    0013fc  717e              STRB     r6,[r7,#5]
    0013fe  797e              LDRB     r6,[r7,#5]  ; confg
    001400  27fd              MOVS     r7,#0xfd
    001402  403e              ANDS     r6,r6,r7
    001404  0797              LSLS     r7,r2,#30
    001406  0fff              LSRS     r7,r7,#31
    001408  007f              LSLS     r7,r7,#1
    00140a  433e              ORRS     r6,r6,r7
    00140c  9f00              LDR      r7,[sp,#0]
    00140e  717e              STRB     r6,[r7,#5]
    001410  797e              LDRB     r6,[r7,#5]  ; confg
    001412  0752              LSLS     r2,r2,#29
    001414  27fb              MOVS     r7,#0xfb
    001416  0fd2              LSRS     r2,r2,#31
    001418  403e              ANDS     r6,r6,r7
    00141a  0092              LSLS     r2,r2,#2
    00141c  4316              ORRS     r6,r6,r2
    00141e  9a00              LDR      r2,[sp,#0]
    001420  7156              STRB     r6,[r2,#5]
    001422  9a0d              LDR      r2,[sp,#0x34]
    001424  7956              LDRB     r6,[r2,#5]  ; confCopy
    001426  7912              LDRB     r2,[r2,#4]  ; confCopy
    001428  0236              LSLS     r6,r6,#8
    00142a  4316              ORRS     r6,r6,r2
    00142c  9a02              LDR      r2,[sp,#8]
    00142e  7116              STRB     r6,[r2,#4]
    001430  0a36              LSRS     r6,r6,#8
    001432  7156              STRB     r6,[r2,#5]
    001434  9a01              LDR      r2,[sp,#4]
    001436  8916              LDRH     r6,[r2,#8]  ; confCopy
    001438  9a00              LDR      r2,[sp,#0]
    00143a  7216              STRB     r6,[r2,#8]
    00143c  0a36              LSRS     r6,r6,#8
    00143e  7256              STRB     r6,[r2,#9]
    001440  9a0d              LDR      r2,[sp,#0x34]
    001442  7a56              LDRB     r6,[r2,#9]  ; confCopy
    001444  7a12              LDRB     r2,[r2,#8]  ; confCopy
    001446  0236              LSLS     r6,r6,#8
    001448  4316              ORRS     r6,r6,r2
    00144a  9a02              LDR      r2,[sp,#8]
    00144c  7216              STRB     r6,[r2,#8]
    00144e  0a36              LSRS     r6,r6,#8
    001450  7256              STRB     r6,[r2,#9]
    001452  9a01              LDR      r2,[sp,#4]
    001454  8996              LDRH     r6,[r2,#0xc]  ; confCopy
    001456  9a00              LDR      r2,[sp,#0]
    001458  7316              STRB     r6,[r2,#0xc]
    00145a  0a36              LSRS     r6,r6,#8
    00145c  7356              STRB     r6,[r2,#0xd]
    00145e  9a0d              LDR      r2,[sp,#0x34]
    001460  7b56              LDRB     r6,[r2,#0xd]  ; confCopy
    001462  7b17              LDRB     r7,[r2,#0xc]  ; confCopy
    001464  0232              LSLS     r2,r6,#8
    001466  9e02              LDR      r6,[sp,#8]
    001468  433a              ORRS     r2,r2,r7
    00146a  7332              STRB     r2,[r6,#0xc]
    00146c  0a12              LSRS     r2,r2,#8
    00146e  7372              STRB     r2,[r6,#0xd]
    001470  9a01              LDR      r2,[sp,#4]
    001472  8a16              LDRH     r6,[r2,#0x10]  ; confCopy
    001474  9a00              LDR      r2,[sp,#0]
    001476  7416              STRB     r6,[r2,#0x10]
    001478  0a36              LSRS     r6,r6,#8
    00147a  7456              STRB     r6,[r2,#0x11]
    00147c  9a0d              LDR      r2,[sp,#0x34]
    00147e  7c56              LDRB     r6,[r2,#0x11]  ; confCopy
    001480  7c17              LDRB     r7,[r2,#0x10]  ; confCopy
    001482  0232              LSLS     r2,r6,#8
    001484  9e02              LDR      r6,[sp,#8]
    001486  433a              ORRS     r2,r2,r7
    001488  7432              STRB     r2,[r6,#0x10]
    00148a  0a12              LSRS     r2,r2,#8
    00148c  7472              STRB     r2,[r6,#0x11]
    00148e  9a00              LDR      r2,[sp,#0]
    001490  7d12              LDRB     r2,[r2,#0x14]  ; confg
    001492  0916              LSRS     r6,r2,#4
    001494  9a01              LDR      r2,[sp,#4]
    001496  0136              LSLS     r6,r6,#4
    001498  7d12              LDRB     r2,[r2,#0x14]  ; confCopy
    00149a  0717              LSLS     r7,r2,#28
    00149c  0f3f              LSRS     r7,r7,#28
    00149e  433e              ORRS     r6,r6,r7
    0014a0  9f00              LDR      r7,[sp,#0]
    0014a2  753e              STRB     r6,[r7,#0x14]
    0014a4  7d3e              LDRB     r6,[r7,#0x14]  ; confg
    0014a6  0912              LSRS     r2,r2,#4
    0014a8  0736              LSLS     r6,r6,#28
    0014aa  0f36              LSRS     r6,r6,#28
    0014ac  0112              LSLS     r2,r2,#4
    0014ae  4316              ORRS     r6,r6,r2
    0014b0  753e              STRB     r6,[r7,#0x14]
    0014b2  7d7a              LDRB     r2,[r7,#0x15]  ; confg
    0014b4  0916              LSRS     r6,r2,#4
    0014b6  9a01              LDR      r2,[sp,#4]
    0014b8  0136              LSLS     r6,r6,#4
    0014ba  7d52              LDRB     r2,[r2,#0x15]  ; confCopy
    0014bc  0717              LSLS     r7,r2,#28
    0014be  0f3f              LSRS     r7,r7,#28
    0014c0  433e              ORRS     r6,r6,r7
    0014c2  9f00              LDR      r7,[sp,#0]
    0014c4  757e              STRB     r6,[r7,#0x15]
    0014c6  7d7e              LDRB     r6,[r7,#0x15]  ; confg
    0014c8  0912              LSRS     r2,r2,#4
    0014ca  0736              LSLS     r6,r6,#28
    0014cc  0f36              LSRS     r6,r6,#28
    0014ce  0112              LSLS     r2,r2,#4
    0014d0  4316              ORRS     r6,r6,r2
    0014d2  757e              STRB     r6,[r7,#0x15]
    0014d4  7dba              LDRB     r2,[r7,#0x16]  ; confg
    0014d6  0916              LSRS     r6,r2,#4
    0014d8  9a01              LDR      r2,[sp,#4]
    0014da  0136              LSLS     r6,r6,#4
    0014dc  7d92              LDRB     r2,[r2,#0x16]  ; confCopy
    0014de  0717              LSLS     r7,r2,#28
    0014e0  0f3f              LSRS     r7,r7,#28
    0014e2  433e              ORRS     r6,r6,r7
    0014e4  9f00              LDR      r7,[sp,#0]
    0014e6  75be              STRB     r6,[r7,#0x16]
    0014e8  7dbe              LDRB     r6,[r7,#0x16]  ; confg
    0014ea  0912              LSRS     r2,r2,#4
    0014ec  0736              LSLS     r6,r6,#28
    0014ee  0f36              LSRS     r6,r6,#28
    0014f0  0112              LSLS     r2,r2,#4
    0014f2  4316              ORRS     r6,r6,r2
    0014f4  75be              STRB     r6,[r7,#0x16]
    0014f6  7dfa              LDRB     r2,[r7,#0x17]  ; confg
    0014f8  0856              LSRS     r6,r2,#1
    0014fa  9a01              LDR      r2,[sp,#4]
    0014fc  0076              LSLS     r6,r6,#1
    0014fe  7dd2              LDRB     r2,[r2,#0x17]  ; confCopy
    001500  07d7              LSLS     r7,r2,#31
    001502  0fff              LSRS     r7,r7,#31
    001504  433e              ORRS     r6,r6,r7
    001506  9f00              LDR      r7,[sp,#0]
    001508  75fe              STRB     r6,[r7,#0x17]
    00150a  7dfe              LDRB     r6,[r7,#0x17]  ; confg
    00150c  27fd              MOVS     r7,#0xfd
    00150e  403e              ANDS     r6,r6,r7
    001510  0797              LSLS     r7,r2,#30
    001512  0fff              LSRS     r7,r7,#31
    001514  007f              LSLS     r7,r7,#1
    001516  433e              ORRS     r6,r6,r7
    001518  9f00              LDR      r7,[sp,#0]
    00151a  75fe              STRB     r6,[r7,#0x17]
    00151c  7dfe              LDRB     r6,[r7,#0x17]  ; confg
    00151e  27fb              MOVS     r7,#0xfb
    001520  403e              ANDS     r6,r6,r7
    001522  0757              LSLS     r7,r2,#29
    001524  0fff              LSRS     r7,r7,#31
    001526  00bf              LSLS     r7,r7,#2
    001528  433e              ORRS     r6,r6,r7
    00152a  9f00              LDR      r7,[sp,#0]
    00152c  75fe              STRB     r6,[r7,#0x17]
    00152e  7dfe              LDRB     r6,[r7,#0x17]  ; confg
    001530  401e              ANDS     r6,r6,r3
    001532  0713              LSLS     r3,r2,#28
    001534  0fdb              LSRS     r3,r3,#31
    001536  00db              LSLS     r3,r3,#3
    001538  431e              ORRS     r6,r6,r3
    00153a  75fe              STRB     r6,[r7,#0x17]
    00153c  7dfb              LDRB     r3,[r7,#0x17]  ; confg
    00153e  4023              ANDS     r3,r3,r4
    001540  06d4              LSLS     r4,r2,#27
    001542  0fe4              LSRS     r4,r4,#31
    001544  0124              LSLS     r4,r4,#4
    001546  e009              B        |L1.5468|
                      |L1.5448|
                              DCD      ||.bss||+0x8a
                      |L1.5452|
                              DCD      rfdec_modeSwitch
                      |L1.5456|
                              DCD      ledkey
                      |L1.5460|
                              DCD      ||.bss||+0x84
                      |L1.5464|
                              DCD      confg
                      |L1.5468|
    00155c  4323              ORRS     r3,r3,r4
    00155e  75fb              STRB     r3,[r7,#0x17]
    001560  7dfb              LDRB     r3,[r7,#0x17]  ; confg
    001562  0692              LSLS     r2,r2,#26
    001564  0fd2              LSRS     r2,r2,#31
    001566  402b              ANDS     r3,r3,r5
    001568  0152              LSLS     r2,r2,#5
    00156a  4313              ORRS     r3,r3,r2
    00156c  75fb              STRB     r3,[r7,#0x17]
    00156e  2238              MOVS     r2,#0x38
    001570  188b              ADDS     r3,r1,r2
    001572  2200              MOVS     r2,#0
    001574  781c              LDRB     r4,[r3,#0]  ; confCopy
    001576  4611              MOV      r1,r2
    001578  4322              ORRS     r2,r2,r4
    00157a  785c              LDRB     r4,[r3,#1]  ; confCopy
    00157c  0224              LSLS     r4,r4,#8
    00157e  4322              ORRS     r2,r2,r4
    001580  789c              LDRB     r4,[r3,#2]  ; confCopy
    001582  0424              LSLS     r4,r4,#16
    001584  4322              ORRS     r2,r2,r4
    001586  78dc              LDRB     r4,[r3,#3]  ; confCopy
    001588  0624              LSLS     r4,r4,#24
    00158a  4322              ORRS     r2,r2,r4
    00158c  791c              LDRB     r4,[r3,#4]  ; confCopy
    00158e  4321              ORRS     r1,r1,r4
    001590  795c              LDRB     r4,[r3,#5]  ; confCopy
    001592  0224              LSLS     r4,r4,#8
    001594  4321              ORRS     r1,r1,r4
    001596  799c              LDRB     r4,[r3,#6]  ; confCopy
    001598  79db              LDRB     r3,[r3,#7]  ; confCopy
    00159a  0424              LSLS     r4,r4,#16
    00159c  4321              ORRS     r1,r1,r4
    00159e  061b              LSLS     r3,r3,#24
    0015a0  4319              ORRS     r1,r1,r3
    0015a2  2338              MOVS     r3,#0x38
    0015a4  541a              STRB     r2,[r3,r0]
    0015a6  0a13              LSRS     r3,r2,#8
    0015a8  4604              MOV      r4,r0
    0015aa  3420              ADDS     r4,r4,#0x20
    0015ac  7663              STRB     r3,[r4,#0x19]
    0015ae  0c13              LSRS     r3,r2,#16
    0015b0  76a3              STRB     r3,[r4,#0x1a]
    0015b2  0e12              LSRS     r2,r2,#24
    0015b4  76e2              STRB     r2,[r4,#0x1b]
    0015b6  7721              STRB     r1,[r4,#0x1c]
    0015b8  0a0a              LSRS     r2,r1,#8
    0015ba  7762              STRB     r2,[r4,#0x1d]
    0015bc  0c0a              LSRS     r2,r1,#16
    0015be  77a2              STRB     r2,[r4,#0x1e]
    0015c0  0e09              LSRS     r1,r1,#24
    0015c2  3020              ADDS     r0,r0,#0x20
    0015c4  77c1              STRB     r1,[r0,#0x1f]
    0015c6  9804              LDR      r0,[sp,#0x10]
    0015c8  7800              LDRB     r0,[r0,#0]  ; confg
    0015ca  0842              LSRS     r2,r0,#1
    0015cc  9803              LDR      r0,[sp,#0xc]
    0015ce  0052              LSLS     r2,r2,#1
    0015d0  7800              LDRB     r0,[r0,#0]  ; confCopy
    0015d2  07c1              LSLS     r1,r0,#31
    0015d4  0fc9              LSRS     r1,r1,#31
    0015d6  430a              ORRS     r2,r2,r1
    0015d8  9904              LDR      r1,[sp,#0x10]
    0015da  700a              STRB     r2,[r1,#0]
    0015dc  7809              LDRB     r1,[r1,#0]  ; confg
    0015de  22fd              MOVS     r2,#0xfd
    0015e0  4011              ANDS     r1,r1,r2
    0015e2  0782              LSLS     r2,r0,#30
    0015e4  0fd2              LSRS     r2,r2,#31
    0015e6  0052              LSLS     r2,r2,#1
    0015e8  4311              ORRS     r1,r1,r2
    0015ea  9a04              LDR      r2,[sp,#0x10]
    0015ec  7011              STRB     r1,[r2,#0]
    0015ee  7811              LDRB     r1,[r2,#0]  ; confg
    0015f0  22fb              MOVS     r2,#0xfb
    0015f2  4011              ANDS     r1,r1,r2
    0015f4  0742              LSLS     r2,r0,#29
    0015f6  0fd2              LSRS     r2,r2,#31
    0015f8  0092              LSLS     r2,r2,#2
    0015fa  4311              ORRS     r1,r1,r2
    0015fc  9a04              LDR      r2,[sp,#0x10]
    0015fe  7011              STRB     r1,[r2,#0]
    001600  7811              LDRB     r1,[r2,#0]  ; confg
    001602  08c0              LSRS     r0,r0,#3
    001604  0749              LSLS     r1,r1,#29
    001606  0f49              LSRS     r1,r1,#29
    001608  00c0              LSLS     r0,r0,#3
    00160a  4301              ORRS     r1,r1,r0
    00160c  7011              STRB     r1,[r2,#0]
    00160e  9808              LDR      r0,[sp,#0x20]
    001610  7841              LDRB     r1,[r0,#1]  ; confg
    001612  7802              LDRB     r2,[r0,#0]  ; confg
    001614  0208              LSLS     r0,r1,#8
    001616  4310              ORRS     r0,r0,r2
    001618  9905              LDR      r1,[sp,#0x14]
    00161a  0a80              LSRS     r0,r0,#10
    00161c  784a              LDRB     r2,[r1,#1]  ; confCopy
    00161e  780b              LDRB     r3,[r1,#0]  ; confCopy
    001620  0211              LSLS     r1,r2,#8
    001622  4319              ORRS     r1,r1,r3
    001624  0280              LSLS     r0,r0,#10
    001626  0589              LSLS     r1,r1,#22
    001628  0d89              LSRS     r1,r1,#22
    00162a  4308              ORRS     r0,r0,r1
    00162c  9908              LDR      r1,[sp,#0x20]
    00162e  7008              STRB     r0,[r1,#0]
    001630  0a00              LSRS     r0,r0,#8
    001632  7048              STRB     r0,[r1,#1]
    001634  9804              LDR      r0,[sp,#0x10]
    001636  7881              LDRB     r1,[r0,#2]  ; confg
    001638  20f3              MOVS     r0,#0xf3
    00163a  4001              ANDS     r1,r1,r0
    00163c  9803              LDR      r0,[sp,#0xc]
    00163e  7880              LDRB     r0,[r0,#2]  ; confCopy
    001640  0702              LSLS     r2,r0,#28
    001642  0f92              LSRS     r2,r2,#30
    001644  0092              LSLS     r2,r2,#2
    001646  4311              ORRS     r1,r1,r2
    001648  9a04              LDR      r2,[sp,#0x10]
    00164a  7091              STRB     r1,[r2,#2]
    00164c  7891              LDRB     r1,[r2,#2]  ; confg
    00164e  0900              LSRS     r0,r0,#4
    001650  0709              LSLS     r1,r1,#28
    001652  0f09              LSRS     r1,r1,#28
    001654  0100              LSLS     r0,r0,#4
    001656  4301              ORRS     r1,r1,r0
    001658  7091              STRB     r1,[r2,#2]
    00165a  9809              LDR      r0,[sp,#0x24]
    00165c  7841              LDRB     r1,[r0,#1]  ; confCopy
    00165e  7800              LDRB     r0,[r0,#0]  ; confCopy
    001660  0209              LSLS     r1,r1,#8
    001662  4301              ORRS     r1,r1,r0
    001664  980c              LDR      r0,[sp,#0x30]
    001666  7001              STRB     r1,[r0,#0]
    001668  0a09              LSRS     r1,r1,#8
    00166a  7041              STRB     r1,[r0,#1]
    00166c  9805              LDR      r0,[sp,#0x14]
    00166e  7941              LDRB     r1,[r0,#5]  ; confCopy
    001670  7900              LDRB     r0,[r0,#4]  ; confCopy
    001672  0209              LSLS     r1,r1,#8
    001674  4301              ORRS     r1,r1,r0
    001676  9808              LDR      r0,[sp,#0x20]
    001678  7101              STRB     r1,[r0,#4]
    00167a  0a09              LSRS     r1,r1,#8
    00167c  7141              STRB     r1,[r0,#5]
    00167e  9809              LDR      r0,[sp,#0x24]
    001680  7941              LDRB     r1,[r0,#5]  ; confCopy
    001682  7900              LDRB     r0,[r0,#4]  ; confCopy
    001684  0209              LSLS     r1,r1,#8
    001686  4301              ORRS     r1,r1,r0
    001688  980c              LDR      r0,[sp,#0x30]
    00168a  7101              STRB     r1,[r0,#4]
    00168c  0a09              LSRS     r1,r1,#8
    00168e  7141              STRB     r1,[r0,#5]
    001690  9805              LDR      r0,[sp,#0x14]
    001692  7a41              LDRB     r1,[r0,#9]  ; confCopy
    001694  7a00              LDRB     r0,[r0,#8]  ; confCopy
    001696  0209              LSLS     r1,r1,#8
    001698  4301              ORRS     r1,r1,r0
    00169a  9808              LDR      r0,[sp,#0x20]
    00169c  7201              STRB     r1,[r0,#8]
    00169e  0a09              LSRS     r1,r1,#8
    0016a0  7241              STRB     r1,[r0,#9]
    0016a2  9809              LDR      r0,[sp,#0x24]
    0016a4  7a41              LDRB     r1,[r0,#9]  ; confCopy
    0016a6  7a00              LDRB     r0,[r0,#8]  ; confCopy
    0016a8  0209              LSLS     r1,r1,#8
    0016aa  4301              ORRS     r1,r1,r0
    0016ac  980c              LDR      r0,[sp,#0x30]
    0016ae  7201              STRB     r1,[r0,#8]
    0016b0  0a09              LSRS     r1,r1,#8
    0016b2  7241              STRB     r1,[r0,#9]
    0016b4  9805              LDR      r0,[sp,#0x14]
    0016b6  7b41              LDRB     r1,[r0,#0xd]  ; confCopy
    0016b8  7b00              LDRB     r0,[r0,#0xc]  ; confCopy
    0016ba  0209              LSLS     r1,r1,#8
    0016bc  4301              ORRS     r1,r1,r0
    0016be  9808              LDR      r0,[sp,#0x20]
    0016c0  7301              STRB     r1,[r0,#0xc]
    0016c2  0a09              LSRS     r1,r1,#8
    0016c4  7341              STRB     r1,[r0,#0xd]
    0016c6  9809              LDR      r0,[sp,#0x24]
    0016c8  7b41              LDRB     r1,[r0,#0xd]  ; confCopy
    0016ca  7b02              LDRB     r2,[r0,#0xc]  ; confCopy
    0016cc  0208              LSLS     r0,r1,#8
    0016ce  990c              LDR      r1,[sp,#0x30]
    0016d0  4310              ORRS     r0,r0,r2
    0016d2  7308              STRB     r0,[r1,#0xc]
    0016d4  0a00              LSRS     r0,r0,#8
    0016d6  7348              STRB     r0,[r1,#0xd]
    0016d8  9805              LDR      r0,[sp,#0x14]
    0016da  7c41              LDRB     r1,[r0,#0x11]  ; confCopy
    0016dc  7c02              LDRB     r2,[r0,#0x10]  ; confCopy
    0016de  0208              LSLS     r0,r1,#8
    0016e0  9908              LDR      r1,[sp,#0x20]
    0016e2  4310              ORRS     r0,r0,r2
    0016e4  7408              STRB     r0,[r1,#0x10]
    0016e6  0a00              LSRS     r0,r0,#8
    0016e8  7448              STRB     r0,[r1,#0x11]
    0016ea  9809              LDR      r0,[sp,#0x24]
    0016ec  7c41              LDRB     r1,[r0,#0x11]  ; confCopy
    0016ee  7c00              LDRB     r0,[r0,#0x10]  ; confCopy
    0016f0  0209              LSLS     r1,r1,#8
    0016f2  4301              ORRS     r1,r1,r0
    0016f4  980c              LDR      r0,[sp,#0x30]
    0016f6  7401              STRB     r1,[r0,#0x10]
    0016f8  0a09              LSRS     r1,r1,#8
    0016fa  7441              STRB     r1,[r0,#0x11]
    0016fc  9805              LDR      r0,[sp,#0x14]
    0016fe  7d41              LDRB     r1,[r0,#0x15]  ; confCopy
    001700  7d00              LDRB     r0,[r0,#0x14]  ; confCopy
    001702  0209              LSLS     r1,r1,#8
    001704  4301              ORRS     r1,r1,r0
    001706  9808              LDR      r0,[sp,#0x20]
    001708  7501              STRB     r1,[r0,#0x14]
    00170a  0a09              LSRS     r1,r1,#8
    00170c  7541              STRB     r1,[r0,#0x15]
    00170e  9809              LDR      r0,[sp,#0x24]
    001710  7d41              LDRB     r1,[r0,#0x15]  ; confCopy
    001712  7d02              LDRB     r2,[r0,#0x14]  ; confCopy
    001714  0208              LSLS     r0,r1,#8
    001716  990c              LDR      r1,[sp,#0x30]
    001718  4310              ORRS     r0,r0,r2
    00171a  7508              STRB     r0,[r1,#0x14]
    00171c  0a00              LSRS     r0,r0,#8
    00171e  7548              STRB     r0,[r1,#0x15]
    001720  9805              LDR      r0,[sp,#0x14]
    001722  7e41              LDRB     r1,[r0,#0x19]  ; confCopy
    001724  7e02              LDRB     r2,[r0,#0x18]  ; confCopy
    001726  0208              LSLS     r0,r1,#8
    001728  9908              LDR      r1,[sp,#0x20]
    00172a  4310              ORRS     r0,r0,r2
    00172c  7608              STRB     r0,[r1,#0x18]
    00172e  0a00              LSRS     r0,r0,#8
    001730  7648              STRB     r0,[r1,#0x19]
    001732  2207              MOVS     r2,#7
    001734  9914              LDR      r1,[sp,#0x50]
    001736  9815              LDR      r0,[sp,#0x54]
    001738  f7fffffe          BL       __aeabi_memcpy
    00173c  9818              LDR      r0,[sp,#0x60]
    00173e  7841              LDRB     r1,[r0,#1]  ; confCopy
    001740  7800              LDRB     r0,[r0,#0]  ; confCopy
    001742  0209              LSLS     r1,r1,#8
    001744  4301              ORRS     r1,r1,r0
    001746  981f              LDR      r0,[sp,#0x7c]
    001748  7001              STRB     r1,[r0,#0]
    00174a  0a09              LSRS     r1,r1,#8
    00174c  7041              STRB     r1,[r0,#1]
    00174e  9816              LDR      r0,[sp,#0x58]
    001750  8881              LDRH     r1,[r0,#4]  ; confCopy
    001752  9817              LDR      r0,[sp,#0x5c]
    001754  7101              STRB     r1,[r0,#4]
    001756  0a09              LSRS     r1,r1,#8
    001758  7141              STRB     r1,[r0,#5]


    optymalizacja -O3 -Otime.

    I teraz uwaga - to tylko w jednym projekcie tak mam. Testowy projekt ktory ma kopiowac struktury (tak jak u Ciebie) faktycznie uzywa memcpy i nic wiecej.
    Oczywiście, tak samo 'confg' jak i 'confCopy' są volatile, i sa strukturami spakowanymi w ktorych jest kilka kolejnych spakowanych struktur.

    Cudo, nie?
  • #106
    tadzik85
    Level 38  
    A i ja jako nieznawca dorzucę grosz do dyskusji o C++ i rzucę jedynie hasłem: MBED
  • #108
    tadzik85
    Level 38  
    Tak. Przerobiłem kilka przykładów na Frescale i bylem zdziwiony ze tak niewiele miejsca zajmują. Ale to ja, ten co się nie zna.
    Więc istnieje coś do podejrzenia.
    A export bywa przydatny, choć GCC ma problem optymalnością newliba.
  • #109
    podjudzacz_rebelii
    Level 2  
    Witam,

    podłączę sie pod ten wątek bo tytuł najlepiej oddaje moje uczucia, a nie chcę zakładać osobnego wątku "jak zacząć".

    Poszedłem za poradami na

    wikimarek.referata.com/wiki/Programowanie_STM32F4_Linux

    i po wielu perturbacjach udało mi się zainstalować kompilator debugger i openocd (niestety nie ograniczyło się to do wpisania trzeche linijek z "apt-get"). Skonfigurowałem sobie Eclipse załadowałem projekt z mrugającą lampką i uruchomiłem "bulid project". Oczywiście "error":
    Code:
    01:18:09 **** Incremental Build of configuration Debug for project podejscie3 ****
    
    make all
    Building file: ../system/src/newlib/_cxx.cpp
    Invoking: Cross ARM C++ Compiler
    arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_ITM -DSTM32F407xx -DUSE_HAL_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f4-hal" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -MMD -MP -MF"system/src/newlib/_cxx.d" -MT"system/src/newlib/_cxx.o" -c -o "system/src/newlib/_cxx.o" "../system/src/newlib/_cxx.cpp"
    ../system/src/newlib/_cxx.cpp:13:19: fatal error: cstdlib: No such file or directory
     #include "cstdlib"
                       ^
    compilation terminated.
    make: *** [system/src/newlib/_cxx.o] Błąd 1

    01:18:10 Build Finished (took 1s.167ms)

    Rzecz jasna pliki znajdują się w katalogu projektów. Dla zwykłego testu poszedłem za radą na stronie Freddiego Chopina i skompilowałem plik main.c z programem który wygląda tak:
    Code: c
    Log in, to see the code

    I otrzymałem to:
    Code:

    johny@johny-AO722:~/Eclipse_workspace$ arm-none-eabi-gcc main.c
    /usr/lib/gcc/arm-none-eabi/4.8.2/../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
    /build/buildd/newlib-2.1.0/build/arm-none-eabi/newlib/libc/stdlib/../../../../../newlib/libc/stdlib/exit.c:70: undefined reference to `_exit'
    collect2: error: ld returned 1 exit status

    Generalnie dalej bym się z tym męczył sam, ale niedługo wyjeżdżam i będę miał bardzo ograniczony dostęp do sieci, a w tym czasie chcialbym coś poćwiczyć na tym STM32f4 Discovery jednak nie wróżę sobie sukcesów do czasu wyjazdu bo nie mam dość czasu.

    Eclipse domyślam się, że ma problem ze ściażkami - ale czemu tylko do dwóch plików?
    I czemu kompilacja niemal pustego programu okazuje się nie wykonalna - przecież wszystko jest poinstalowane?

    Może ktoś poratować?

    Pozdrawiam
    Janusz
  • #110
    el2010tmp
    Level 25  
    podjudzacz_rebelii wrote:
    #include "cstdlib"

    Co to jest cstdlib?
    podjudzacz_rebelii wrote:
    return 0;

    Dokąd wraca funkcja main() ?
  • #111
    gaskoin
    Level 38  
    Wystarczy zajrzeć do startupu co się dzieje po powrocie z funkcji main. To nie jest jakiś wielki błąd.

    Polecam natomiast poczytać jak działa kompilator i linker.
  • #112
    podjudzacz_rebelii
    Level 2  
    el2010tmp - wpisałem "return(0)" bo zawsze tak robię - teraz jak o tym pomyślę to rzeczywiście nie powinno być żadnego zwracania bo przecież to jest jedyny problem. Nie wiem do czego jest cstdlib - chciałem odpalić jakiegoś gotowca i z tego punktu się uczyć. Pójdę tym tropem dziś. Tyle, że pewnie wszystko przyjdzie mi stawiać od początku bo po zainstalowaniu fluxboxa, moje Unity się krzaczy (niektóre menu się nie rozwijają i jedyny motyw jaki działa to "high contrast", który jest dla mnie mało czytelny).

    gaskoin - jakieś konkretne pozycje? K&R czy Stephen Prata w swoich książkach o C robią to dość pobierzenie.

    Pozdrawiam
    Janusz