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


von sonderpreis (Gast)


Lesenswert?

Hier der Code
1
void main(void) {
2
3
  //~ init_io();
4
  
5
  PORTA = 0x00;
6
  ADCON1 = 0x06;
7
  TRISA = 0xFF;
8
9
  PORTB = 0x00;
10
  TRISB = 0xFF;
11
12
  PORTC = 0x00;
13
  TRISC = 0xFD;
14
15
16
  while(1) {
17
    RC1 ^= 1;
18
  }
19
}

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


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

Was passiert da und wieso?

von sonderpreis (Gast)


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.

von Michael L. (michaelx)


Lesenswert?

Stichwort "Codeoptimierung"

Ich kenne zwar den HI-TECH C Compiler nicht, aber wenn die 
Initialisierung nicht nach
1
init_io()
 ausgelagert wird, dann wird der Compiler das
1
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

von sonderpreis (Gast)


Lesenswert?

Aha, dann mache ich es wohl der Übersichtlichkeit halber einfach inline. 
Danke.

von AS (Gast)


Lesenswert?

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

von Michael L. (michaelx)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.