Soll ich Standardregisterwerte im Startcode definieren?

Mir ist aufgefallen, dass einige ARM-Programmierer einige CPU-Register mit Werten setzen, die die gleichen Standardwerte des Registers beim Zurücksetzen des Mikrocontrollers sind.

Beispiel: Der Standardwert von IOCON_PIO2_9, Parameter MODEauf LCP1114 ist 0x02 (Pull-up-Widerstand aktiviert). Im Beispielcode von Olimex wird dieser Wert 0x02bei der Softwareinitialisierung gesetzt, aber dies ist bereits der Standardwert.

Dieses Verhalten tritt bei vielen anderen Registern auf.

Warum sollte jemand das tun? Meiner Meinung nach verschmutzt dieser zusätzliche Code einfach alles und verschlechtert die Lesbarkeit des Codes. Ist das eine gute Programmierpraxis?

Ich bin keine Person, die über „Best Practice“ spricht, aber besonders auf einer Plattform wie ARM, wo alle peripheren Funktionen beim Hersteller liegen und Sie möglicherweise zwischen den Herstellern wechseln, scheint es, als würde diese Praxis die Portabilität verbessern.
Hast du schon mal das Zitat „Mariä Himmelfahrt ist die Mutter aller Scheiße“ gehört? Nehmen Sie niemals etwas an, selbst die Standardwerte können sich ändern, wenn es zu einem Spannungsabfall oder ähnlichem kommt. Verlassen Sie sich also niemals darauf, dass sich etwas in einem beliebigen Zustand befindet, es sei denn, Sie haben es selbst eingestellt.

Antworten (1)

  1. Code modular machen. Wenn Ihre A/D-Routine beispielsweise den A/D immer vollständig für den Modus einrichtet, in dem sie ihn verwendet, dann kann diese Routine jederzeit aufgerufen werden, ob unmittelbar nach dem Einschalten oder nachdem der A/D in einem anderen verwendet wurde Weg.
  2. Der Code kann zum Startort zurückspringen, um einen Software-Reset durchzuführen. In diesem Fall entsprechen die Einstellungen möglicherweise nicht den Standardwerten beim Einschalten.
  3. Die Powerup-Standardwerte können auf verschiedenen Prozessoren unterschiedlich sein, daher wird der Code besser portierbar, wenn Sie sie im Code festlegen.
  4. Es dokumentiert, was die Einstellungen sind. Wenn diese Register beim Start explizit festgelegt werden, muss jemand, der sich den Code ansieht, nicht im Datenblatt graben, um zu sehen, auf was sie eingestellt sind.
  5. Es dokumentiert, dass Sie sich interessieren. Überlassen Sie der Hardware die Standardeinstellungen, die Sie nicht verwenden, aber legen Sie explizit diejenigen fest, auf die Sie sich verlassen. Dies könnte einige zukünftige Betreuer auf die Wichtigkeit dieser speziellen Einstellungen aufmerksam machen.
Es kann erwähnenswert sein, dass FOO->CTL, wenn der Standardwert 0x12345678 ist und man sich nur darum kümmert, die unteren Bits auf 8 zu setzen, es einen Kompromiss zwischen Klarheit/Coderaum/Leistung zwischen dem Schreiben des gesamten Registers auf 0x12345678 und der Verwendung von etwas gibt wie maskedwrite32(&(FOO->CTL), BLAH_MASK, BLAH_MODE8);. Wenn die maskierte Schreibroutine Code enthält, um sie im Fall von Interrupts atomar zu machen, kann dies sie langsamer machen als sie sein muss, aber die Allgemeingültigkeit des Codes verbessern.