Saya mencoba menulis program untuk ATTiny13. Masalah saya adalah ia memiliki batasan ukuran yang sangat besar. Nah, ketika membuat program Hello World pertama saya, butuh ruang program 100 byte hanya untuk menghidupkan dan mematikan lampu! Apakah ada opsi yang bisa saya berikan untuk avr-gcc untuk memperkecil ukuran ini? Juga, apa yang ada di crt0? Saya tidak terlalu tertarik pada perakitan AVR jadi saya tidak terlalu mengerti ..
Saya tidak mau harus turun ke perakitan untuk proyek ini ..
avr
attiny
programming
compiler
Earlz
sumber
sumber
Jawaban:
crt0 adalah rutinitas startup untuk UC. Rutinitas melakukan pengaturan register dan juga inisialisasi data.
Apakah 100 byte menyertakan tabel vektor interupsi? Saya tidak yakin tentang ATtiny13 tetapi ATtiny25 / 45/85 memiliki 15 vektor interupsi. Ini akan memakan waktu 30 byte.
gcc memiliki opsi untuk menautkan di crt0 Anda. Anda bisa mengambil file AVR crt0.S dan memodifikasinya. Ini tidak terlalu lama sehingga seharusnya tidak sulit untuk dilakukan.
sumber
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Anda dapat menggunakan avr-objdump -d .elf untuk melihat apa yang dihasilkan:
Mari kita analisa sedikit:
20 byte tabel vektor interupsi (setidaknya beberapa entri dapat dihilangkan jika Anda bersikeras dan berjanji Anda tidak akan pernah mengaktifkan interupsi yang sesuai).
Menghapus SREG (saya tidak yakin ini benar-benar diperlukan), menulis 0x9f (RAMEND) ke SPL (penumpukan tumpukan) dan melompat ke main. Rjmp terakhir adalah jenis yang berlebihan. (Anda bisa berjanji untuk tidak pernah kembali dari utama)
Prosedur interupsi default untuk interupsi-interupsi tersebut daripada yang tidak memiliki satu ditimpa dalam C. (aturan yang sama seperti untuk vektor _)
Proc utama Anda. Ketat.
Keduanya tidak terlalu berguna. _exit mungkin diperlukan oleh standar C dan __stop_program diperlukan agar bisa berfungsi sebagaimana mestinya.
sumber
Apa aplikasi akhirnya Anda? ATtiny13 memiliki 1kB flash dan Anda dapat melakukan banyak hal dengan itu di C. Crt0 adalah runtime avr-libc C. Ini berisi hal-hal seperti penanganan tumpukan sehingga Anda dapat menggunakan fungsi dengan argumen dan mengembalikan nilai.
100 byte untuk pengaturan C tertanam tidak terlalu buruk, dan ukurannya konstan. Menggandakan garis-garis logika program tidak akan membuatnya 200 byte. Di tingkat optimisasi apa Anda menyusun? Anda harus berada di "-Os". Dan bagaimana Anda menyusun ini? Makefiles dalam proyek demo yang tersedia dari situs avr-libc cukup bagus dan komprehensif.
Program on / off LED sederhana di bawah ini membutuhkan 62 byte pada ATtiny13 dengan "-Os" pada avr-gcc 4.3.3. dari CrossPack-AVR:
Menghapus panggilan _delay_ms () membuatnya menjadi 46 byte.
Contoh yang lebih besar pada ATtiny13 adalah prototipe Smart LED saya . Kode ini berisi PWM perangkat lunak 3-channel, konversi warna HSV-ke-RGB, mesin status, dan membaca dua tombol. Ini tidak ditulis dengan baik dan masuk pada 864 byte. Di bawah avr-gcc 3.x itu bahkan lebih kecil. (untuk beberapa alasan avr-gcc 4 telah membuat hampir semua program tumbuh beberapa byte)
sumber
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
adalah baris yang relevan di makefile saya (dibuat sendiri). dan saya menggunakan kode yang hampir sama kecuali untuk membalikkan LED yang saya gunakanPORTB &= ~(1 << LED);
dan semacamnyaJika Anda kekurangan ruang, coba meja kerja Embedded IAR - versi 'kickstart' gratis mereka memiliki batas ukuran kode kata 4K, begitu banyak untuk ATTiny, dan mungkin optimalisasi yang lebih baik daripada gcc
sumber
Perangkat seperti itu sering diprogram dalam assembler, menghasilkan executable yang lebih kecil. Perlu upaya dan pembelajaran untuk menggunakannya.
sumber