PIC 16F Serie - CC5X Compiler

Oct 07, 2010 8 Replies

Hallo,



ich wei=DF nicht ob meine Frage hier richtig aufgehoben ist - ich programmiere einen PIC16 und bin von einem anderen C Compiler gekommen. Jetzt habe ich das Problem dass ich einige Variablen =FCber den Reset des Contrpollers hinaus halten m=F6chte.



Bei meinem Compiler HITECH war das so, dass diese Variablen als "persistent" gekennziechnet wurden und somit nach dem reset nicht automatisch mit "0" initialisiert werden.



Beispiel:



persistent char zaehler;



zaehler =3D 2; #asm RESET #endasm



// Zaehler hat nach wie vor den Wert 2



char zaehler; zaehler =3D 2; #asm RESET #endasm // Zaehler hat nach Reset den Wert "0"



Gibt es so einen Befehl bzw. Schl=FCsselwort auch beim BKND Compiler (CC5X) ?



W=E4re sehr dankbar f=FCr eine Antwort !!



Gr=FC=DFe,



Stefan


Das scheint beim Hitech eine compilerspezifische Erweiterung zu sein. Den CC5X kenne ich nicht, aber bei den Compiler, die ich kenne (GHS und IAR) legt man eine eigene Section (im Linker Command File) an, die als NO_INIT, no_clear o.ä. gekennzeichnet ist. Dadurch wird die Section nach einem Reset nicht initialisiert und die Variablenwerte bleiben erhalten.

Dann schreibt man im Sourcecode vor die Variable eine #pragma-Anweisung, damit diese Variable in der entsprechenden Section landet. Evtl. muss hinter die Variable ein weiteres #pragma, um wieder auf die default-Section umzuschalten.

Man muss nur aufpassen, dass die Variable sich, wenn man den Strom nur kurz abschaltet, nicht teilweise verändert (da kippen dann gerne mal nur einzelne Bits...). Also am besten immer eine CRC drüber oder doppelt invers ablegen oder so.

Gruß,

Andreas

.------- - - ---. | Andreas Schroeder - www.a-netz.de | '-----------------------------------'

Hallo Stefan,

Am 08.10.2010 00:27, schrieb Stefan:

Die Variablen in den PIC10/12/14/16 (also das File Register) bleibt ohnehin erhalten beim Reset, solange kein Brownout-Reset aufgetreten ist. Es gibt also gar keinen Grund, eine solche Kennzeichnung zu haben. Anhand der POR und BOR Bits kann man sauber entscheiden, ob ein Powerup oder "nur" ein Reset (z.B. Watchdog) aufgetreten ist.

Ich /vermute/, da ich den Hitech-Compiler nicht kenne, dass der beim Reset eine /automatische/ Initialisierung des ganzen RAMs einschiebt. Wenn Du das auch mit dem CC5X so möchtest, dann musst Du ein clear_all_ram() einfügen. Dann musst Du hat selbst dafür sorgen, dass Deine speziellen Variablen erhalten bleiben.

Sollen Deine Variablen PowerDowns überleben, dann musst Du diese ohnehin im EEPROM sichern, sofern Deine PIC-Variante das hat.

Ich halte diese RAM-Initialisierung beim Startup für Nonsense. Sauber programmierte und sauber getestete Software braucht sowas nicht. Bei rein in Assembler geschriebener Software mag das ja noch einen Sinn haben, aber bei C?

vg, Wolfgang, CC5X genial findend...

From-address is Spam trap Use: wolfgang (dot) mahringer (at) sbg (dot) at

Generell hast du Recht, aber der C-Standard schreibt vor, daß globale Variablen bei Programmstart auf 0 initialisiert werden (Kapitel 6.7.8, Abschnitt 10 im ISO/IEC 9899:1999 Standard), sodaß die Compiler sich meist daran halten. Auch wenn du selbst alles explizit initialierst, könntest du Probleme bekommen, wenn du allgemeine standardkonforme Drittsoftware einsetzt (was allerdings bei Microcontroller-Programmen selten der Fall ist), die das dann nicht machen bräuchte.

Frank Buss, http://www.frank-buss.de piano and more: http://www.youtube.com/user/frankbuss

Motlibschrieb: "

Generell werden bei diesen Mikrocontrollern die Variablen, die als "static" deklariert sind, in der startup.c oder startup.asm initialisiert. Unterschieden wird dann noch, ob diese static-Variablen vom Programmierer initialisiert werden oder nicht. So werden diese über ein Block copy vom ROM ins RAM in einem Rutsch initialisiert, oder auf 0 gesetzt. Das setzt voraus, dass diese Variablen vom Compiler zu diesen Blöcken (Segmenten) im RAM angeordnet werden, was dem Compiler über die Deklaration mitgeteilt wird.

Alle anderen Variablen werden nach einem Reset nicht initialisiert.

Ein Blick in die starup und in das generierte Map-File helfen da weiter.

Dirk

Hi Frank,

Am 09.10.2010 11:09, schrieb Frank Buss:

Abgesehen davon, dass die Mikrocontroller-Programme meist reihenweise Vorgaben des ISO-Standards verletzen, schreibst Du ja selbst "meist daran halten". /Mir/ wäre /meist/ zuwenig konkret. Aber, wie ich schon schreib, das ist meine persönliche Meinung.

vg, Wolfgang

From-address is Spam trap Use: wolfgang (dot) mahringer (at) sbg (dot) at

Stefan schrieb:

Der CC5x hat die schöne Eigenschaft, dass vor main() keine 'versteckten' Operationen ausgeführt werden. Also findet auch keine automatische Löschung des RAMs statt. Solange Du nicht die Funktion clearRAM() innerhalb Deines Programms aufrufst, bleiben alle Variablem in dem Zustand, den sie vor dem Reset hatten. Welchen Wert eine Speicherzelle nach PowerUp oder Reset hat, muß allerdings im Datenblatt des jeweiligen PICs nachgeschlagen werden.

- Heinz

Heinz Saathoffschrieb: "

Bevor main startet, müssen immer alle static-Variablen initialisert werden. Was ist das denn für ein "Compiler"?

Dirk

Dirk Ruth schrieb...

n'

Der CC5X ist (leider?) kein richtiger C-Compiler und hat deshalb sowohl=20 einige Einschr=E4nkungen als auch PIC-spezifische Erweiterungen. Zu den=20 Einscr=E4nkungen geh=F6rt auch, da=DF globale Variable nicht initialisiert= =20 werden k=F6nnen. =20 int xyz =3D 12; // geht nicht auf Filescope Ebene int abc =3D 0; // geht auch nicht, obwohl 0

L=E4stig sind die vielen Einschr=E4nkungen bei der Komplexit=E4t von=20 Ausdr=FCcken. Man mu=DF deshalb h=E4ufig selber Ausdr=FCcke in Subausdr=FCc= ke mit=20 tempor=E4ren Ergebnissen umformen. Die Subausdr=FCcke werden allerdings seh= r=20 sch=F6n und direkt auf 1:1 Assemblerbefehle umgesetzt, so wie man's auch=20 selbst machen w=FCrde.=20

Allerdings bietet der CC5X n=FCtzliche Erweiterungen an. Dazu geh=F6ren=20 Bit-Variablen, Zugriff auf Teile von int und long, Positionierung von=20 Variablen an feste Adressen.

Man mu=DF auch bedenken, da=DF die PIC16 und PIC18 Familie nicht besonders= =20 C-freundlich ist. Es fehlen haupts=E4chlich linearer Adressraum und ein=20 Variablenstack mit effizientem Zugriff.

Aber ansonsten bin ich mit dem Compiler zufrieden, vor allem wegen des=20 kompakten erzeugtem Code.

- Heinz

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required