Ich versuche ein Programm für das ATTiny13 zu schreiben. Mein Problem ist, dass es enorme Größenbeschränkungen gibt. Nun, als ich mein erstes Hello World-Programm machte, brauchte ich 100 Bytes Programmspeicher, um ein Licht ein- und auszuschalten! Gibt es Optionen, die ich avr-gcc geben kann, um diese Größe zu verringern? Auch was ist in der crt0? Ich bin nicht besonders begeistert von der AVR-Montage, daher verstehe ich das nicht sehr.
Ich möchte für dieses Projekt nicht zur Montage gehen müssen.
avr
attiny
programming
compiler
Earlz
quelle
quelle
Antworten:
crt0 ist die Startroutine für den uC. Die Routinen führen den Aufbau der Register und auch die Initialisierung der Daten durch.
Enthalten die 100 Bytes die Interrupt-Vektortabelle? Ich bin mir beim ATtiny13 nicht sicher, aber der ATtiny25 / 45/85 hat 15 Interrupt-Vektoren. Dies würde 30 Bytes in Anspruch nehmen.
gcc hat eine Option zum Verknüpfen Ihres crt0. Sie können die AVR-Datei crt0.S nehmen und ändern. Es ist nicht sehr lang und sollte daher nicht schwierig sein.
quelle
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Sie können avr-objdump -d .elf verwenden, um zu sehen, was generiert wird:
Lassen Sie es uns ein wenig analysieren:
20-Byte-Interrupt-Vektortabelle (zumindest einige der Einträge könnten weggelassen werden, wenn Sie darauf bestanden und versprochen haben, die entsprechenden Interrupts niemals zu aktivieren).
Löscht SREG (ich bin nicht sicher, ob dies wirklich benötigt wird), schreibt 0x9f (RAMEND) in SPL (den Stapelzeiger) und springt zu main. Der letzte rjmp ist irgendwie redundant. (Sie könnten versprechen, niemals von der Hauptstraße zurückzukehren)
Standard-Interrupt-Prozedur für diese Interrupts, bei denen keine in C überschrieben wurde (dieselben Regeln wie für __vectors)
Dein Hauptprozess. Fest.
Diese beiden sind nicht sehr nützlich. _exit wird wahrscheinlich vom C-Standard benötigt und __stop_program wird benötigt, damit es ordnungsgemäß funktioniert.
quelle
Was ist Ihre spätere Bewerbung? Ein ATtiny13 hat 1 KB Flash und damit kann man in C viel anfangen. Das crt0 ist die avr-libc C-Laufzeit. Es enthält Dinge wie die Stapelbehandlung, sodass Sie Funktionen mit Argumenten und Rückgabewerten verwenden können.
100 Bytes für das Embedded C-Setup sind nicht schlecht und haben eine konstante Größe. Das Verdoppeln der Zeilen der Programmlogik macht nicht unbedingt 200 Bytes. Auf welcher Optimierungsstufe kompilieren Sie? Sie sollten bei "-Os" sein. Und wie kompilierst du das? Die Makefiles in den Demo-Projekten, die auf der avr-libc-Site verfügbar sind, sind ziemlich gut und umfassend.
Das einfache LED-Ein / Aus-Programm unten benötigt 62 Bytes auf einem ATtiny13 mit "-Os" auf dem avr-gcc 4.3.3. von CrossPack-AVR:
Durch Entfernen der Aufrufe von _delay_ms () werden 46 Byte benötigt.
Ein größeres Beispiel für den ATtiny13 sind meine Smart LED-Prototypen . Dieser Code enthält eine 3-Kanal-Software PWM, eine HSV-zu-RGB-Farbkonvertierung, eine Zustandsmaschine und liest zwei Tasten. Es ist nicht besonders gut geschrieben und kommt mit 864 Bytes. Unter avr-gcc 3.x war es noch kleiner. (Aus irgendeinem Grund hat avr-gcc 4 fast alle Programme um einige Bytes wachsen lassen)
quelle
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
ist die relevante Zeile in meinem Makefile (selbst erstellt). und ich benutze fast identischen Code, außer um die LED zu drehen, die ich benutzePORTB &= ~(1 << LED);
und soWenn Sie wenig Platz haben, probieren Sie die Embedded-Workbench von IAR aus. Die kostenlose Kickstart-Version hat eine Beschränkung der Codegröße von 4 KB, also viel für ATTiny und wahrscheinlich eine bessere Optimierung als gcc
quelle
Solche Geräte werden häufig im Assembler programmiert, was zu kleineren ausführbaren Dateien führt. Es lohnt sich, sich anzustrengen und zu lernen, es zu benutzen.
quelle