mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PICC und 1 Befehl zuviel bei Zugriff auf Pin


Autor: sonderpreis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Code
void main(void) {

  //~ init_io();
  
  PORTA = 0x00;
  ADCON1 = 0x06;
  TRISA = 0xFF;

  PORTB = 0x00;
  TRISB = 0xFF;

  PORTC = 0x00;
  TRISC = 0xFD;


  while(1) {
    RC1 ^= 1;
  }
}

Das Toggeln wird zu:
l343:  
  bcf  status, 5  ;RP0=0, select bank0
  movlw  1<<((57)&7)
  xorwf  ((57)/8),f
  goto  l343


Wenn die Initialisierung in init_io() verlagert wird, gibt es immer 
einen Befehl mehr beim Toggeln:
l1517:  
  bcf  status, 5  ;RP0=0, select bank0
  bcf  status, 6  ;RP1=0, select bank0
  movlw  1<<((57)&7)
  xorwf  ((57)/8),f
  goto  l1517

Was passiert da und wieso?

Autor: sonderpreis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort "bank switching", aber wieso er (HI-TECH C Compiler for 
PIC10/12/16 MCUs (Lite Mode)  V9.80) das macht, weiß ich nicht.

Autor: Michael L. (michaelx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort "Codeoptimierung"

Ich kenne zwar den HI-TECH C Compiler nicht, aber wenn die 
Initialisierung nicht nach
init_io()
 ausgelagert wird, dann wird der Compiler das
bcf  status, 6
 wegoptimieren, weil sich das Bit RP1 seit der Initialisierung nicht 
mehr geändert hat. Wird die Initialisierung statt dessen in eine 
Funktion ausgelagert, ist der Zustand von RP1 vom Prinzip her unsicher, 
weil die Codeoptimierung wohl nicht die Funktion mit analysiert.

HTH

Autor: sonderpreis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, dann mache ich es wohl der Übersichtlichkeit halber einfach inline. 
Danke.

Autor: AS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Standard und der Lite Version werden absichtlich
solche Sinnlos-Befehle eingebaut (wobei dieses Beispiel noch
absolut harmlos ist...)

Autor: Michael L. (michaelx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AS schrieb:
> In der Standard und der Lite Version werden absichtlich
> solche Sinnlos-Befehle eingebaut (wobei dieses Beispiel noch
> absolut harmlos ist...)

Hast du Beispiele für deine Behauptung?

BTW Die Bitbefehle für das Bankselect der Register sind ganz sicher 
nicht sinnlos, geschweige denn absichtlich eingestreut, um den Code 
aufzublähen. Vielmehr werden diese Befehle erst mal vom Compiler 
eingefügt, um einen sicher funktionierenden Code zu erhalten. Allerdings 
wird die anschließende Code-Optimierung in einer Billig- oder 
Kostenlosversion fehlen oder weniger intensiv ausfallen. - Freie 
Entscheidung des Entwicklers.

Ich möchte mir nicht anmaßen, alles zu wissen, aber für etwas mehr als 
einfach nur drauf los zu hetzen und zu meckern reicht es sicher.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.