Hallo, ich verwende einen MSP430F168 und wollte fragen ob es möglich ist den Quellcode auf eine externen SPI Flash (z.B. SST25VF080B) zu speichern und zu nutzen? Das man so größeren Quellcode schreiben kann.
Jochen schrieb: > ich verwende einen MSP430F168 und wollte fragen ob es möglich ist den > Quellcode auf eine externen SPI Flash (z.B. SST25VF080B) zu speichern > und zu nutzen? Das man so größeren Quellcode schreiben kann. Warum nimmst du nicht einen groesseren MSP430? Kann man zwar machen muesste aber den Code erst ins RAM laden und dort ausfuehren. Dazu muesste dein Compiler aber Codebanking beherschen. Also verschiedene Programmteile an die gleiche Addresse linken koennen und das nachladen selber anstossen koennen.
Gibts heute noch Entwicklungsumgebungen, die Code Overlays unterstützen? Inspiriert die grosse Ähnlichkeit des MSP430 mit der PDP-11? Da war das recht verbreitet - aber das war vor 3-4 Jahrzehnten und kaum jemand weint dem eine Träne nach. Das Zeug adressmässig übereinander zu legen und nebeneinander ins Image zu schreiben sollte beim GNU-Linker allerdings problemlos möglich sein.
:
Bearbeitet durch User
A. K. schrieb: > Gibts heute noch Entwicklungsumgebungen, die Code Overlays unterstützen? Das letzte wo ich das mal gemacht habe war beim 68HC11 unter der COSMIC Entwicklungsumgebung ist aber auch schon fast 15 Jahre her. A. K. schrieb: > Das Zeug adressmässig übereinander zu legen und nebeneinander ins Image > zu schreiben sollte beim GNU-Linker allerdings problemlos möglich sein. Ist aber auch nur die halbe Miete. Der Compiler sollte einem aber auch Code dafuer erzeugen um das an Ort + Stelle laden zu koennen und auszufuehren.
A. K. schrieb: > Das Zeug adressmässig übereinander zu legen und nebeneinander ins Image > zu schreiben sollte beim GNU-Linker allerdings problemlos möglich sein. Das kann man auch jedem Linker beibringen, der nicht dafür vorgesehen ist, das erfordert aber einiges Knowhow. Fazit: geht aber lohnt sich nicht, wenn man für ein paar Cent mehr genügend Flash haben kann. Den SPI-Chip muss man ja auch bezahlen. Gruss Reinhard
Jochen schrieb: > Hallo, > > ich verwende einen MSP430F168 und wollte fragen ob es möglich ist den > Quellcode auf eine externen SPI Flash (z.B. SST25VF080B) zu speichern > und zu nutzen? Das man so größeren Quellcode schreiben kann. Der MSP430 kann Code aus dem RAM laufen lassen. Du kannst selber Code aus externen Speichern ins RAM kopieren und per Funktions-Pointer ausführen. Du musst nur selber aufpassen, dass der richtige Code vor dem Aufruf vorhanden ist.
easy schrieb: > Der MSP430 kann Code aus dem RAM laufen lassen. Allerdings gibt es keinen einzigen MSP430, bei dem sich das RAM erweitern ließe, und der schon sehr angestaubte 'F168 hat gerade mal 2048 Bytes RAM. Damit lässt sich nicht viel anstellen. Es gibt eigentlich keinen Grund mehr, noch so ein altes Schätzchen zu verwenden; das kann nur 4-Draht-JTAG (und ist deswegen nicht mit dem Launchpad programmierbar, sondern benötigt den teureren MSP-FET430UIF oder den Parallelportfrickler) und ist obendrein unverhältnismäßig teuer. Neuere MSP430-Varianten haben modernere Peripherie, benötigen weniger Strom, haben teilweise deutlich mehr Flash-ROM (der 'F5438 beispielsweise hat 256 kB), deutlich mehr RAM, können mit höheren Taktfrequenzen betrieben werden und kosten weniger.
Hallo Rufus, sollen wir ihm den Trick verraten, dass er seinen Code aus dem SPI scheibchenweise ins Flash spielen kann? Dazu müßte er sich ein Flash oder Boot-Programm in den RAM-Bereich laden. Wenn er das implementiert, nach Sinn und Unsinn sei nicht gefragt, hat er am Ende eine Menge gelernt. Gruß Bernd
Hinweiser schrieb: > sollen wir ihm den Trick verraten, dass er seinen Code aus dem SPI > scheibchenweise ins Flash spielen kann? Das kann man zwar machen, aber ob das sinnvoll ist? Das Flash hält schließlich nur eine begrenzte Anzahl an Schreibzyklen aus, und wenn zum Abarbeiten des zu großen Programmes ständig Teile des Flash neu programmiert werden müssen, ist der Controller bald ein Fall für die Tonne. Da aber Jochen sich nicht wieder gemeldet hat, vermute ich, daß das Thema ihm nicht so wichtig gewesen sein wird.
Rufus Τ. Firefly schrieb: > Das kann man zwar machen, aber ob das sinnvoll ist? Das Flash hält > schließlich nur eine begrenzte Anzahl an Schreibzyklen aus, und wenn zum > Abarbeiten des zu großen Programmes ständig Teile des Flash neu > programmiert werden müssen, ist der Controller bald ein Fall für die > Tonne. Oder man nimmt einen der neuen MSP430 mit FRAM drin.
Das ist in der Tat eine Möglichkeit, gibt es die mit bis zu 64 kiB FRAM. Allerdings bezweifle ich, daß das überhaupt nötig ist, für das, was der schweigende Threadstarter machen will. Tatsächlich wollte er ja den Quellcode auf dem Controller speichern ...
Hinweiser schrieb: > Hallo Rufus, > > sollen wir ihm den Trick verraten, dass er seinen Code aus dem SPI > scheibchenweise ins Flash spielen kann? > > Dazu müßte er sich ein Flash oder Boot-Programm in den RAM-Bereich > laden. Wer das auf dem MSP430 funktionierend hinbekommen hat, möge bitte Bescheid geben. An dem Thema verzweifle ich seit zwei Wochen. Der ins RAM kopierte Code macht einfach nur Blödsinn, so bald er ins Flash schreiben soll. Aus dem Flash heraus läuft er 1a. Sprünge sind alle relativ, ich überschreibe mir auch nicht den Stack. Aber sobald die 1:1-Kopie im RAM steht und angesprungen wird, passieren wunderliche Dinge :-( Max
Erstmal danke für die antworten war über die Woche nicht Zuhause. Also den Prozessor kann ich nicht tauschen, weil das nicht gewünscht ist. Daher versuche ich gerade das über SPI auszulagern auf dem Flash. Auslagern will ich einige Funktionen weil der Flashspeicher auf dem MSP430F168 dafür nicht ausreicht. Das Problem dabei ist habe da garkeine Erfahrungen wie man sowas macht.
Jochen schrieb: > Also den Prozessor kann ich nicht tauschen, weil das nicht gewünscht > ist. Aha. Und den Code zu optimieren, oder dem "Wünschenden" mitteilen, daß das Festhalten an unterdimensionierten Museumsstücken halt irgendwann harte Grenzen setzt, das geht nicht? Vergiss das mit dem Codeauslagern. Mit den gerade mal 2 kiB RAM könntest Du eh nur winzige Schnipsel aus externem Speicher laden; und Teile des Flashs willst Du nicht umprogrammieren, weil dann Dein 'F169 ziemlich bald stirbt. Mit was für einem Compiler arbeitest Du, was machst Du in Deinem Programm, und was möchstest Du noch an zusätzlichen Dingen anstellen? Oft lässt sich durch Optimierung oder Umstrukturierung einiges an Codegröße einsparen -- solltest Du floating-Point-Arithmetik nutzen, ist die Frage ganz laut zu stellen, ob das wirklich nötig ist, solltest Du printf und Konsorten nutzen, ist auch hier die Frage zu stellen, ob das wirklich nötig ist. Zu guter Letzt: Womit bestimmst Du die Codegröße? Siehst Du Dir nur die Dateigröße einer Hex-Datei an, oder wertest Du die tatsächliche Codegröße aus, die Dir der Linker verraten sollte?
Rufus Τ. Firefly schrieb: > Mit was für einem Compiler arbeitest Du, was machst Du in Deinem > Programm, und was möchstest Du noch an zusätzlichen Dingen anstellen? Ich nutze das Code Composer Studio 5. Was auf ein Display darstellen mit Berechnung und ich würde gerne die Schriftzeichen bzw. die Fonts auslagern. > Oft lässt sich durch Optimierung oder Umstrukturierung einiges an > Codegröße einsparen -- solltest Du floating-Point-Arithmetik nutzen, ist > die Frage ganz laut zu stellen, ob das wirklich nötig ist, solltest Du > printf und Konsorten nutzen, ist auch hier die Frage zu stellen, ob > das wirklich nötig ist. Habe schon den Code soweit optimiert und einiges gewonnen. Nutze floating-Point-Arithmetik Extra nicht, weil da ja nochmehr verloren geht. > Zu guter Letzt: Womit bestimmst Du die Codegröße? Siehst Du Dir nur die > Dateigröße einer Hex-Datei an, oder wertest Du die tatsächliche > Codegröße aus, die Dir der Linker verraten sollte? Die benötigte größe wird mir angezeigt und dazu auch der Adressbereich und der ist so bei 0xDF93.
Jochen schrieb: > Was auf ein Display darstellen mit Berechnung und ich würde gerne die > Schriftzeichen bzw. die Fonts auslagern. Ah. Die sind kein Code, und die kannst Du natürlich jederzeit aus einem externen Flash-ROM laden. Wie auch beliebige andere Daten, also z.B. irgendwelche Menütexte oder irgendwelche Umrechnungstabellen o.ä. Nur Programmcode ist zum Auslagern ungeeignet, weil er vor der Ausführung ausführbar ins RAM (bzw. interne Flash-ROM) geladen werden muss. Bei einem Font sieht das natürlich anders aus; Du wirst eine Routine haben, die das Bitmuster für ein darzustellendes Zeichen aus dem ROM holt - und diese Routine musst Du halt entsprechend anpassen, so daß das Bitmuster eben aus per SPI oder I2C oder wie auch immer extern angebundenem ROM geholt wird. Das ganze wird dann natürlich langsamer, weil das, was mit einem einzigen Speicherzugriff möglich war (lese ein bzw. zwei aufeinanderfolgende Bytes) jetzt einiges an Peripheriezugriffen erfordert.
Also sowas wie:
1 | const char character_a[]={0x1F,0x00,0x3F,0xB0,0x31,0xB0,0x31,0xB0,0x3F,0xF0,0x3F,0xE0}; |
kann man also auf dem Flash speichern? Das habe ich denn richtig verstanden?
Jochen schrieb: > kann man also auf dem Flash speichern? Das habe ich denn richtig > verstanden? So ist es.
Jochen schrieb: > Das habe ich denn richtig verstanden? Ja. Nur erfolgt der Zugriff dann natürlich nicht mehr mit einem einfachen Array-Zugriff à la
1 | c = character_a[24]; |
sondern durch Aufruf einer von Dir zu schreibenden Zugriffsfunktion auf das externe Flash-ROM. Das wird dann irgendwie so aussehen:
1 | uint8_t spi_rom_read(uint16_t addr); |
2 | |
3 | c = spi_rom_read(24); |
Was die Funktion genau machen muss, hängt vom verwendeten SPI-ROM ab. Nimmt man beispielsweise ein 25LC512*, so sind für jeden Lesezugriff vier SPI-Zugriffe durchzuführen, bei dreien davon werden Daten an das SPI-ROM übertragen, ein Befehlsbyte und zwei Bytes mit der Adresse. Der vierte Zugriff liefert dann die Nutzdaten. Damit sähe Deine Funktion in etwa so aus:
1 | uint8_t spi_rom_read(uint16_t addr) |
2 | {
|
3 | uint8_t wert; |
4 | |
5 | spi_set_cs(); |
6 | |
7 | spi_write_byte(READ); |
8 | spi_write_byte(addr >> 8); |
9 | spi_write_byte(addr & 0xFF); |
10 | |
11 | wert = spi_read_byte(); |
12 | |
13 | spi_clear_cs(); |
14 | return wert; |
15 | }
|
Das ist natürlich deutlich langsamer als ein einfacher Arrayzugriff. *) http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en530925
Rufus Τ. Firefly schrieb: > Damit sähe Deine Funktion in etwa so aus: > > uint8_t spi_rom_read(uint16_t addr) > { > uint8_t wert; > > spi_set_cs(); > > spi_write_byte(READ); > spi_write_byte(addr >> 8); > spi_write_byte(addr & 0xFF); > > wert = spi_read_byte(); > > spi_clear_cs(); > return wert; > } > > Das ist natürlich deutlich langsamer als ein einfacher Arrayzugriff. Okay das macht soweit Sinn, aber was ich noch nicht verstehe wie ich diesen Wert
1 | character_a[]={0x1F,0x00,0x3F,0xB0,0x31,0xB0,0x31,0xB0,0x3F,0xF0,0x3F,0xE0}; |
auf den Flash übertrage. Daran scheitert es gerade bei mir.
Jochen schrieb: > character_a[]={0x1F,0x00,0x3F,0xB0,0x31,0xB0,0x31,0xB0,0x3F,0xF0,0x3F,0x E0}; > auf den Flash übertrage. Daran scheitert es gerade bei mir. Dazu brauchst du die umgekehrte Funktion: void spi_rom_write(uint16_t addr,uint8_t val) Und dann schreibst du dir eine funktion wo du von aussen via RS232 etc. das aufrufen kannst. Dann einmal bei der Produktion die Daten in Flash uebertragen.
Helmut Lenzen schrieb: > Dazu brauchst du die umgekehrte Funktion: > > void spi_rom_write(uint16_t addr,uint8_t val) > > Und dann schreibst du dir eine funktion wo du von aussen via RS232 etc. > das aufrufen kannst. Dann einmal bei der Produktion die Daten in Flash > uebertragen. Achso also am besten zweites Programm schreiben, wo man nur den Flash beschreibt. Okay ich danke euch erstmal bei weiteren Frage melde ich mich :)
Hallo habe so ähnliches Problem. Was ich bei nicht verstehe beim beschreiben des Flashes Helmut Lenzen schrieb: > Jochen schrieb: >> character_a[]={0x1F,0x00,0x3F,0xB0,0x31,0xB0,0x31,0xB0,0x3F,0xF0,0x3F,0x E0}; > > Dazu brauchst du die umgekehrte Funktion: > > void spi_rom_write(uint16_t addr,uint8_t val) kann man z.B. die Variable von Jochen 1 zu 1 so übertragen oder wie genau macht man das? Kann da mal einer bitte einen Sample code posten mit dieser Variable?
Matze schrieb: > kann man z.B. die Variable von Jochen 1 zu 1 so übertragen Klar:
1 | for (i = 0; i < sizeof (character_a); i++) |
2 | spi_rom_write(basisadresse + i, character_a[i]); |
Basisadresse, falls das ROM nicht beginnend bei seiner Anfangsadresse 0 gefüllt werden soll.
Rufus Τ. Firefly schrieb: >> Matze schrieb: >> kann man z.B. die Variable von Jochen 1 zu 1 so übertragen > > Klar: > for (i = 0; i < sizeof (character_a); i++) > spi_rom_write(basisadresse + i, character_a[i]); > > Basisadresse, falls das ROM nicht beginnend bei seiner Anfangsadresse 0 > gefüllt werden soll. Danke schön dafür genau sowas habe ich gesucht.
Beim Schreiben natürlich das Löschen und evtl. Sichern des Sektors nicht vergessen. Ein bisschen mehr als der Pseudocode ist das schon, jedenfalls beim Schreiben.
Hab übrigens auch schon "Program-Code" Extern von einem MSP430 ausgelagert :-P Hab mir dazu im Flash des MSP430 die HAL (Hardware Abstraction), einen Interpreter und eine rudimentäre "EVA" (Eingabe-Verarbeitung-Ausgabe) gestopft und alle möglichen platzfressenden Sachen in eine "Zwischensprache" gebracht und dann auf den ext. Flash gespeichert. Der MSP430 hat dann einfach das Program im externen Speicher durch seinen Interpreter gejagt und schon hatte man größeren Speicher ;) Das war sehr viel Softwareaufwand und auch bei weitem nicht mehr schnell, ging aber! Bevor die Rückfrage kommt: Nein, ich gebe den Code nicht "Frei" - es steckt einfach zu viel arbeit da drinnen... Ich wollte halt nur berichten, das es auch geht ;)
Nun gut, der Interpreteransatz ist natürlich auch noch möglich. Hier z.B. ein Basic-Interpreter: http://www.rowley.co.uk/msp430/basic.htm Möglicherweise lässt sich auch Lua bzw. eLua auf den MSP430 portieren. Und für Freunde der UPN gibt es auch das hier: http://www.camelforth.com/page.php?8
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.