Forum: Mikrocontroller und Digitale Elektronik Libs im ROM CortexM


von temp (Gast)


Lesenswert?

Hallo zusammen,

Ziel ist es große getestete Codebestandteile in "geschützte" Flash- und 
Rambereiche zu legen. Beim IAR gibt es dazu das Tool ISymExport. Das 
erzeugt aus aus einer elf-Datei eine Datei mit Symbolen die dann zu 
einem anderen Projekt dazu gelinkt werden kann. Als Beispiel lwip und 
freertos belegen ja schon mal ein ganzes Teil im Flash. Wenn man diese 
Teile, in denen man sowieso in der Regel nichts debuggen muss, an feste 
Positionen in Flash und Ram legt, würde man sich das ständige Neuflashen 
sparen. Das spart Zeit und man könnte dann auch eventuell mit den auf 
32k beschränkten Eval-Versionen von Keil und co. noch größere Projekte 
realisieren. Kennt jemand da eine Möglichkeit wie das mit dem gcc 
machbar ist? Auf die Tippel-Tappel-Tour mit Sprungtabellen wollte ich 
aber nicht zurückgreifen. Da ist der Aufwand größer als der Nutzen.

Schönen Tag noch.

von pegel (Gast)


Lesenswert?

Beitrag "Libgcc.a in .frodata section legen"

Mit der *.ld lässt sich da einiges bewirken.

von temp (Gast)


Lesenswert?

@pegel

Das trifft es nicht ganz, da kommt am Ende ja auch nur ein einzelnes 
elf-File bei raus. Am Beispiel LPC1769. Im Linkerscript stehen da 
normalerweise z.b.:

MEMORY
{
 rom  (rx)   : ORIGIN = 0x00000000, LENGTH = 0x00080000
 ram  (rwx)  : ORIGIN = 0x10000000, LENGTH = 0x00008000
}

Ich möchte nun meine fixen Sachen an fixe Stellen Packen und erzeuge das 
erste hex-File (meine lib) z.b. mit

MEMORY
{
 rom  (rx)   : ORIGIN = 0x00070000, LENGTH = 0x00010000
 ram  (rwx)  : ORIGIN = 0x10007000, LENGTH = 0x00001000
}

das 2. mit

MEMORY
{
 rom  (rx)   : ORIGIN = 0x00000000, LENGTH = 0x00070000
 ram  (rwx)  : ORIGIN = 0x10000000, LENGTH = 0x00007000
}

Die Lib kriegt eine init-Methode die fast den selben Startup-Code 
enthält wie normale Programme. Stack und Vektoren werden dabei nicht 
initialisiert, aber bss u.s.w schon und auch die Construktoren für c++. 
Das kriege ich sicher gebacken.

Ich brauche jetzt eigentlich nur eine Symboltabelle der Funktionen und 
Variablen aus meiner Lib in einer Form, dass ld das beim Linken des 
eigentlichen Programms versteht. So ähnlich wie bei Bootloadern.

Erschwerend ist sicher, dass Funktionen aus der newlib die an meine 
"lib" gelinkt sind eventuell nochmal beim Programm auftauchen. Damit 
koennte man sicher leben zumal der Flash bei den Cortex M3 bei mir immer 
reicht. Besser wäre es natürlich das auch nur einmal zu haben.

von Lothar (Gast)


Lesenswert?

Beim ARM ist es eigentlich üblich, Code und Bibliothek komplett zu 
trennen (und nicht zu linken).

Die Bibliothek ist ein eigenständiges Projekt mit einer höheren 
Startadresse im Flash. Beim LPC1769 z.B. ab 256k = 0x40000. Die 
Bibliothek hat am Anfang die Liste der Einsprungadressen. Damit die 
Bibliothek nicht versehentlich überschrieben wird, kann sie per MPU 
protected werden.

Der Aufruf der Bibliotheksfunktionen aus dem Code sollte über SWI 
(Software-Interrupt) erfolgen. Insbesondere wenn die Bibliothek 
protected ist, kann man ja auch nicht einfach reinspringen.

von pegel (Gast)


Lesenswert?

Mit der ganzen Problematik habe ich mich auch schon etwas befasst und 
bin zu dem Schluss gekommen das man es dann auch gleich richtig machen 
kann, bzw. das Prinzip "ausleihen" von:

http://www.stm32circle.com/

von pegel (Gast)


Lesenswert?


von temp (Gast)


Lesenswert?

@pegel

Ich will ja kein Betriebssystem bauen. Aber ich weiß jetzt einen Weg. 
Beschrieben ist es hier:

http://netstorage.iar.com/SuppDB/Public/SUPPORT/006578/Protected%20library%20Cortex%20M3_isym.pdf

Das dort verwiesene Tool isymexport habe ich mal aus der Eval-Version 
probiert. Es erzeugt aus einer elf-Datei ein Datei mit den fixen 
Symbolen. Die kann man dann einfach zur Applikation dazu linken.

Danke nochmal für eure Mühen,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.