www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

LPC2xxx in funkcija na določeni lokaciji
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pet Okt 15, 2010 2:06 pm    Naslov sporočila:  LPC2xxx in funkcija na določeni lokaciji Odgovori s citatom

Zanima me ali se da v Cju (Keil) nastaviti določeni funkciji lokacijo v flashu.

Torej kaj bi rad naredil: Delam neko napravo, ki bo živela na hribu in bo imela GSM modem. Želim si, da bi ji lahko daljinsko zamenjal firmware z neke .hex datoteke na internetu. Moj program zasede le 20% flasha, ki ga ima mikrokontroler. Osnoven program bi lahko iz interneta prebral hex in ga zapisal v prost flash. Potem bi moral z neko funkcijo, ki se ne izvaja na istem bloku flasha kot osnoven program, prepisati to hex datoteko na začetne bloke (IAP) ter resetirati mikrokontroler.

Se pravi.. zanima me kako poriniti funkcijo na določeno lokacijo v uCju.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pet Okt 15, 2010 4:25 pm    Naslov sporočila:   Odgovori s citatom

Praktično gledano bi ti bi rad implementiral bootloader. Dokumentacije na to temo pa je veliko, zato ti predlagam, da najprej pregledaš kakšen NXPjev application note za implementacijo bootloaderja.

Ne pozabi, da kodo lahko izvajaš tudi iz RAMa! To ti bo lahko v pomoč, vendar pa, če želiš varen upgrade firmwera, boš delal kopijo firmwera in preverjal če je veljavna.
Ključna beseda tukaj, so reset vektorji.

Odgovor na tvoje vprašanje kako določiti določeni funkciji lokacijo v flashu: Za spremenljivke se uporablja #include <absacc.h> in atribut __at(naslov) npr: int spremenljivka __at(0x1000);
To ti je v tem primeru tudi lahko v pomoč, vendar mislim da reč ne deluje za funkcije, niti to ni čisto tisto kar ti potrebuješ.

Ti svoj firmware samo buildaj od naslova kamor želiš da se zapiše (Keil: Options for target->Read/Only Memory Areas: Start, Size), skopiraš tja firmware, spremeniš reset vektorje in resetiraš, potem pa narediš upgrade. In premisli še, kako boš naredil, da boš vedno imel eno rezervno kopijo, če upgrade ne uspe.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pet Okt 15, 2010 4:55 pm    Naslov sporočila:   Odgovori s citatom

Ok razumem.. grem izvest še v praksi Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Dorijan
Član
Član



Pridružen-a: Ned 22 Jun 2008 10:48
Prispevkov: 2564
Aktiv.: 12.37
Kraj: južnoprimorska

PrispevekObjavljeno: Pet Okt 15, 2010 6:58 pm    Naslov sporočila:   Odgovori s citatom

če ti zasede manj kot 20% flasha bi lahko imel 2 programa istočasno gor.
in bi to nastavljal z neko spremenljivko na začetku programa (pred while(1)).

,ko bi poslal signal bi šel v nastavitveni način, ki bi dalo spremenljivko na boot stanje in mikrokotroler bi se resetiral. Ko se zbudi v boot režimu se poveže in povozi glavni program (za tem lahko dodaš še en cikel, ki preveri kodo) na koncu spet spremeni spremenljivko za prehod v osnovni režim in se spet resetira.

tako nekako bi sam naredil.

_________________
Če nekaj deluje, razstavi in ugotovi zakaj.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Sob Okt 16, 2010 1:47 pm    Naslov sporočila:   Odgovori s citatom

Temu, kar hočeš ti narediti, bi se lahko reklo patching firmware-a. Jaz bi ti predlagal malo drugačno rešitev:

Že osnoven firmware mora imeti podporo za zamenjavo (določenih) funkcij. To se reši tako, da za vse (potencialno zamenljive) funkcije definiraš pointer na to funkcijo, in te funkcije uporabljaš izključno preko tega pointerja. V firmware mora biti tudi vključena neka patch() funkcija, ki zna v flashu poiskati npr. nek magic number, ki označuje začetek patcha, takoj za tem pa pointer na neko patch_init() funkcijo znotraj patcha. Ta patch_init funkcija pozna naslove pointerjev na vse funkcije, in ker so ti pointerji v RAMu, jih lahko zamenja - preprosto prestavi pointer neke stare funkcije na naslov nove funkcije, ki je del patcha.

Mogoče se sliši zakomplicirano, samo tak sistem se dolgoročno res dobro obnese, bolj kot siljenje nekih funkcij na določen naslov.

Tak sistem se da z gcc-jem dokaj lahko vzpostaviti, z malo čaranja po linker skripti. Kako je pa s tem v Keilu, pa žal ne vem.


LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Ned 19 Sep 2004 22:04
Prispevkov: 16777193
Aktiv.: 70649.47

PrispevekObjavljeno: Sob Okt 16, 2010 5:50 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70649.45

PrispevekObjavljeno: Sob Okt 16, 2010 6:09 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Sob Okt 16, 2010 6:11 pm    Naslov sporočila:   Odgovori s citatom

Ravno tega sedaj berem. Zraven sem potegnil zip, v katerem so primeri.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 6:51 pm    Naslov sporočila:   Odgovori s citatom

Uspel sem narediti sekundarni bootloader. Zaenkrat ni še čisto pravi bootloader, ker samo pokliče program na določenem naslovu, ampak za preverit delovanje je dovolj. Naložil sem tudi navadno aplikacijo na določen naslov (katerega pokliče bootloader). Stvar uspešno deluje (bootloader in aplikacija se oglasita na uartu).

Problem nastane, ko enostavno aplikacijo zamenjam z RTX aplikacijo. Če grem debugirat bootloader, se začne aplikacija izvajati, ampak kaj kmalu konča. Debuger obstoji v sledeči vrstici:
Koda:
SWI_Handler     B       SWI_Handler


Našel sem tole temo, vendar si nisem znal pomagati z njo. Imam pa LPC2138.

Kaka ideja?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 7:01 pm    Naslov sporočila:   Odgovori s citatom

Uh, tukaj je lahko več reči...
Obvisiš v software interrupt handlerju. Poiskati moraš, kdo kliče software interrupt (neka funkcija z atributom __swi), ampak mislim, da je to RTX.

Za začetek lahko zakomentiraš to vrstico. Pa poglej si kakšen RTX Blinky (Keil->ARM->Boards->Keil->MCB2130)

Startup bi moral izgledati nekako tako:
Koda:
Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                      ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

                IMPORT  SWI_Handler

Undef_Handler   B       Undef_Handler
;SWI_Handler    B       SWI_Handler            ; Part of RTL
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 7:13 pm    Naslov sporočila:   Odgovori s citatom

Funkcij z atributom __swi je v RTXu več, tako da je verjetno to razlog zakaj tam obvisi.

Startup aplikacije zgleda tako kot v tvojem primeru (se pravi z zakomentiranim SWI_Handler).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 7:18 pm    Naslov sporočila:   Odgovori s citatom

IMPORT SWI_Hander vrstico si opazil?

Če je SWI_Handler B SWI_Handler vrstica zakomentirana, kje obvisi?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 7:27 pm    Naslov sporočila:   Odgovori s citatom

Zakomentirano sem imel v aplikaciji, ne v bootloaderju. Debugiram bootloader (tam obstoji v na SWI_Handler).

Če zakomentiram isto vrstico v bootloaderju in dodam import stavek mi napiše tole:
Koda:
Error: L6218E: Undefined symbol SWI_Handler (referred from startup.o).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 7:36 pm    Naslov sporočila:   Odgovori s citatom

Ja, ja, sedaj razumem kakšen problem imaš. RTX se ti požene v aplikaciji in kliče bootloaderjev SWI handler, ki pa ne obstaja.
Rešitev? Na pamet, ne vem.
Poizkusi bootloader označit kot RTX aplikacijo, če ti bo linker v kodi pustil SWI handler... Sicer pa... Nekako bo potrebno priti do addresse SWI handerja in jo vpisat med vektor adresse...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 7:41 pm    Naslov sporočila:   Odgovori s citatom

Sem poskusil tudi to, da bootloader označim kot RTX aplikacijo, vendar ne deluje.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 6 dni


Powered by phpBB © 2001, 2005 phpBB Group