PIC alle String-Konstanten ins RAM legen

Gast #2430000
Lesenswert?
• ▲
▼
Matthias schrieb:
> was ggf. zu Zeigerproblemen führt

nur, wenn du den falschen Zeigertyp verwendest. Nehme mal an, du 
verwendest einen PIC18. Da muss man nämlich zwischen Zeigern aufs RAM 
und Zeigern aufs Flash unterscheiden. Hier mal zwei Beispiele, wie sowas 
aussehen muss:
1
//  put RAM string to uart
2
void uart_puts_ram(char * ptr)
3
{
4
  while(*ptr)
5
    uart_puttxbyte(*ptr++);
6
}
7

8

9
//  put ROM string to uart
10
void uart_puts_rom(rom far char * ptr)
11
{
12
  while(*ptr)
13
    uart_puttxbyte(*ptr++);
14
}
Gast #2430074
Lesenswert?
• ▲
▼
plop schrieb:
> Nehme mal an, du
> verwendest einen PIC18.

ja

Gibt es ein Pragma oder ähnliches, welches veranlasst, dass 
Stingkonstanten in den RAM abgelegt wird?

uart_puts_ram("my_put_constant");

würde im Bsp. ein Problem bedeuten, weil "my_put_constant" im FLASH 
liegt.

Beim GCC/AVR liegt "my_put_constant" standardmäßig im RAM. Bedeutet zwar 
Platzverschwendung, aber ist im Handling einfacher.
Gast #2430082
Lesenswert?
• ▲
▼
Dann musst du wohl ein Array deklarieren und in der 
Initialisierungsroutine den ganzen Kram einfach mit memcopy 
rüberkopieren. Irgendwie müssen die Konstanten ja ins RAM reinkommen. 
Wenn du Spannung an den MCU anlegst ist der Inhalt des RAM erstmal leer 
oder undefiniert.
Gast #2430655
Lesenswert?
• ▲
▼
kein Holger schrieb:
> #device PASS_STRINGS=IN_RAM

Hört sich gut an:
PASS_STRINGS=IN_RAM A new way to pass constant strings to a function by 
first copying the string to RAM and then passing a pointer to RAM to the 
function.

Das führ zu Fehlermeldungen:
23 Can not change device type this far into the code

(far benutze ich nicht in Code)
#2430805
Lesenswert?
• ▲
▼
> 23 Can not change device type this far into the code
>
> (far benutze ich nicht in Code)

:-)

far hat hier nichts mit dem Code zu tun, so wie in den berühmten 
far-Pointern. "this far into" ist eine Phrase und bedeutet im 
wesentlichen "zu diesem Zeitpunkt", "an dieser Stelle", "ein Vorgang ist 
schon so weit fortgeschritten, dass ..."
Der Compiler, der den Code ja von oben nach unten liest, will dir also 
sagen: An dieser Stelle ist es bereits zu spät. Ich muss die Direktive 
früher im Code sehen, damit ich sie berücksichtigen kann.

Also hoch mit der Preprozessor-Directive. Ich würd mal sagen: Auf jeden 
Fall vor die erste Funktion.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.