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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.