GeirGrusom Skrevet 29. september 2011 Del Skrevet 29. september 2011 (endret) Jeg har en ARM prosessor med begrenset kapasitet. På den kjører allerede et program som skal utvides med et bruker-laget program. Jeg vil ikke lage en stor .elf fil, men heller laste inn programmet på et spesifikt sted, og lenke med programmet som allerede ligger der. Noen som aner hvordan det gjøres? Kort kode som forklarer hva som skal skje: Program A: void SendMessage(msg) { // ... } while(1) { ProcessMessages(); __B_MAIN__(); } Program B: extern void SendMessage(msg); void main() { SendMessage(arbitrary); } Program B er et program som blir skrevet av brukeren i en BASIC dialekt, som blir kompilert til C til dette formålet. Jeg er ganske GCC noob. Endret 29. september 2011 av GeirGrusom Lenke til kommentar
TheMaister Skrevet 29. september 2011 Del Skrevet 29. september 2011 Err ... Så du vil kjøre program B, kopiere rå maskinkode fra program A inn i program B og kalle på det direkte? En grunn til at program A ikke kan kompileres som et .so/.a bibliotek? Lenke til kommentar
GeirGrusom Skrevet 30. september 2011 Forfatter Del Skrevet 30. september 2011 (endret) Er i utgangspunktet .so jeg er ute etter, men kan ikke gjøre endringer i kernel programmet (fordi instillinger vil forsvinne, som ikke er veldig aktuelt) og det er ikke nok RAM til å kjøre programmet fra RAM (256 KB FLASH, 64 KB RAM). Endret 30. september 2011 av GeirGrusom Lenke til kommentar
TheMaister Skrevet 30. september 2011 Del Skrevet 30. september 2011 (endret) Så Program A et vanlig program som kjører med kernel-privilegier? Hvilket operativsystem (hvis det er et i det hele tatt) snakker vi om her? Forstod ikke helt den med "instillinger går tapt". Må Program A forsette å kjøre uavhenging av program B, som en server? Er poenget med program B bare å sende små beskjeder til program A? Høres ut som vanlig IPC ... Endret 30. september 2011 av TheMaister Lenke til kommentar
GeirGrusom Skrevet 30. september 2011 Forfatter Del Skrevet 30. september 2011 Ikke noe operativsystem. Det er en 50 MHz ARM Cortex M7 prosessor med 256 kB flash minne og 64 kB RAM, ingen multithreading eller IPC tilgjengelig. Det jeg vil er at program B skal ha tilgang til å sette meldinger i kø til program A. Dette er en kontroller for en servomotor. Grunnen til at instillinger forsvinner, er at de er lagret i flash sammen med program A. En kan bare slette en flash blokk av gangen, og ofte går dette utover instillinger (som ofte til at timesvis eller dager med kalibrering går i vasken). En kan anta at program A alltid vil ligge på samme plass. Det jeg har laget, er en BASIC compiler, som kompilerer til CIL som kjører på en konfigureringsprogram som etterligner oppførselen til programmet når det ligger på FLASH, og når en er fornøyd med oppførselen så skal programmet kompileres til ARM (noe som funker akkurat nå). Problemet er derimot hvordan skal GCC vite hvor WaitMotorArrived(), QueueMessage() etc. ligger på kernel programmet uten å lenke statisk, men forvente at alt ligger på plass når programmet starter? En løsning er kanskje å lage en jump-tabell et spesifikt sted i minnet. Lenke til kommentar
TheMaister Skrevet 30. september 2011 Del Skrevet 30. september 2011 Ja, hvis du vil kalle inn på spesifikke addresser i minnet er nok den minst hacky måten å gjøre ting på å lage stubs i assembly: WaitForStuff: jmp <spesifikk statisk addresse> SomethingElse: jmp <annen statisk addresse> Her antar man at kjører i samme "prosess", som de må gjøre uten et OS, så ... En annen mulighet er å benytte seg av linker script, som gir detaljert informasjon til linkeren hvordan ting skal plasseres i minnet, i henhold til symboler osv. Er nok overkill for dette, men benyttet det på et hjemmesnekra MIPS-system der jeg ville plassere .text til et visst address space, .data i et annet, etc. Lenke til kommentar
GeirGrusom Skrevet 3. oktober 2011 Forfatter Del Skrevet 3. oktober 2011 Hmmm er en del problemer å ta hensyn til her... Har forsåvidt nå lage en jump tabell, men har bare fylt den inn med adresser grunnet at det virker som ARM kun tillater relative jump. Så laget rett og slett dette: const void** JumpTable = // Linker scriptet skal sørge for at denne dukker opp der den skal { 0xfeedbead, // Magic! SetPosition, SetSpeed, SetMode, Reset, WaitArrive }; Som deretter blir kalt slik: const void** JumpTable = [adresse]; const PositionProc SetPosition = JumpTable[1]; void main() { Kernel_Assert(JumpTable[0] == 0xfeedbead); SetPosition(0); } Men jeg vet ikke om dette funker enda, fordi jeg har en del jobb med å flytte ting over til timere og slikt før dette vil være noe å satse på. Feedback? Jeg er veldig usikker på om dette i det hele tatt kan fungere. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå