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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren