PICC und 1 Befehl zuviel bei Zugriff auf Pin

Gast #1848193
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?
#1848461
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
#1864760
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

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