Gå til innhold

Lenke et program med et annet i GCC


Anbefalte innlegg

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 av GeirGrusom
Lenke til kommentar
Videoannonse
Annonse

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 av TheMaister
Lenke til kommentar

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...