 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pet Okt 15, 2010 2:06 pm Naslov sporočila: LPC2xxx in funkcija na določeni lokaciji |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Okt 15, 2010 4:25 pm Naslov sporočila: |
|
|
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pet Okt 15, 2010 4:55 pm Naslov sporočila: |
|
|
Ok razumem.. grem izvest še v praksi  |
|
Nazaj na vrh |
|
 |
Dorijan Član



Pridružen-a: Ned 22 Jun 2008 10:48 Prispevkov: 2564 Aktiv.: 12.36 Kraj: južnoprimorska
|
Objavljeno: Pet Okt 15, 2010 6:58 pm Naslov sporočila: |
|
|
č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 |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.64 Kraj: Zagorje ob Savi
|
Objavljeno: Sob Okt 16, 2010 1:47 pm Naslov sporočila: |
|
|
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 |
|
 |
. Član

Pridružen-a: Ned 19 Sep 2004 22:04 Prispevkov: 16777193 Aktiv.: 70641.70
|
Objavljeno: Sob Okt 16, 2010 5:50 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70641.69
|
Objavljeno: Sob Okt 16, 2010 6:09 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Sob Okt 16, 2010 6:11 pm Naslov sporočila: |
|
|
Ravno tega sedaj berem. Zraven sem potegnil zip, v katerem so primeri. |
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 6:51 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 7:01 pm Naslov sporočila: |
|
|
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 7:13 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 7:18 pm Naslov sporočila: |
|
|
IMPORT SWI_Hander vrstico si opazil?
Če je SWI_Handler B SWI_Handler vrstica zakomentirana, kje obvisi? |
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 7:27 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 7:36 pm Naslov sporočila: |
|
|
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 7:41 pm Naslov sporočila: |
|
|
Sem poskusil tudi to, da bootloader označim kot RTX aplikacijo, vendar ne deluje. |
|
Nazaj na vrh |
|
 |
|
|
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: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|