ATTiny13 - avr-gcc हैलो वर्ल्ड 100 बाइट्स का उपयोग करता है?


9

मैं ATTiny13 के लिए एक कार्यक्रम लिखने की कोशिश कर रहा हूं। मेरी समस्या यह है कि इसमें बड़े आकार की बाधाएँ हैं। खैर, जब मेरा पहला हैलो वर्ल्ड प्रोग्राम बना, तो यह 100 बाइट्स का प्रोग्राम स्पेस ले गया, ताकि लाइट ऑन और ऑफ हो सके! क्या इस आकार को कम करने के लिए मुझे कोई विकल्प दिया जा सकता है? इसके अलावा, crt0 में क्या है? मैं AVR असेंबली के लिए बहुत उत्सुक नहीं हूं इसलिए मैं इसे ज्यादा नहीं समझता हूं।

मैं इस परियोजना के लिए विधानसभा को छोड़ना नहीं चाहता हूं।


थोड़ा साइड नोट के रूप में, कुछ लोग कहते हैं कि एक "ब्लिंकी" -प्रोग्राम।
जोहान

1
@ जोहान अच्छी तरह से मुझे यकीन नहीं था कि "
ब्लिंकलाइट्स

जवाबों:


9

crt0 यूसी के लिए स्टार्टअप रूटीन है। रूटीन रजिस्टरों के सेटअप और डेटा के आरंभीकरण का कार्य करता है।

क्या 100 बाइट्स में बाधित वेक्टर टेबल शामिल है? मैं ATtiny13 के बारे में निश्चित नहीं हूं, लेकिन ATtiny25 / 45/85 में 15 इंटरप्टर्स हैं। यह 30 बाइट्स तक ले जाएगा।

gcc के पास आपके crt0 में लिंक करने का एक विकल्प है। आप AVR crt0.S फ़ाइल ले सकते हैं और इसे संशोधित कर सकते हैं। यह बहुत लंबा नहीं है इसलिए इसे करना मुश्किल नहीं होना चाहिए।


मैं crt0 स्रोत को खोजने के लिए प्रतीत नहीं कर सकता, लेकिन crt1 में वही है जो एक बाधा वेक्टर तालिका लगती है। हो सकता है कि यह है
अर्लज़

मैं इसे अपने सिस्टम पर भी नहीं पा सकता :( मैंने स्रोत से सभी उपकरण संकलित किए, इसलिए मुझे लगा कि यह वहां होगा। यदि आप स्टार्टअप, crt0 और gcc के बारे में Atmel ऐप-नोट्स की एक जोड़ी "crt0.S atmel" के लिए Google करते हैं। अनुकूलन सामने आता है। हो सकता है कि उन डॉक्स में कुछ संकेत हों।
jluciani

@jlu मैं दोनों के बीच के अंतर का पता लगाने की कोशिश कर रहा हूं, लेकिन स्टैक ओवरफ्लो पर अभी तक कोई भी बात अच्छी नहीं हुई है: stackoverflow.com/questions/2709998/…
Earlz

2
AVR-libc में प्रत्येक प्रकार के AVR चिप के लिए एक अलग CRT होता है, और मानक avr-libc डिस्ट केवल फ़ाइल के .o संस्करण को शामिल करता है। ATtiny13 के लिए एक [avr-libc-path] /avr-3/lib/crttn13.o पर स्थित है
todbot

@todbot हम्म। आह, ठीक है मेरे पास यह है/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
अर्लज़

19

आप avr-objdump -d का उपयोग कर सकते हैं। यह देखने के लिए कि क्या उत्पन्न हो रहा है:

आइए इसका थोड़ा विश्लेषण करें:

[jpc@jpc ~] avr-objdump -d avr.elf | sed -e 's/^/    /' | pbcopy

avr.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:   09 c0           rjmp    .+18        ; 0x14 <__ctors_end>
   2:   0e c0           rjmp    .+28        ; 0x20 <__bad_interrupt>
   4:   0d c0           rjmp    .+26        ; 0x20 <__bad_interrupt>
   6:   0c c0           rjmp    .+24        ; 0x20 <__bad_interrupt>
   8:   0b c0           rjmp    .+22        ; 0x20 <__bad_interrupt>
   a:   0a c0           rjmp    .+20        ; 0x20 <__bad_interrupt>
   c:   09 c0           rjmp    .+18        ; 0x20 <__bad_interrupt>
   e:   08 c0           rjmp    .+16        ; 0x20 <__bad_interrupt>
  10:   07 c0           rjmp    .+14        ; 0x20 <__bad_interrupt>
  12:   06 c0           rjmp    .+12        ; 0x20 <__bad_interrupt>

20 बाइट्स वेक्टर टेबल को बाधित करते हैं (यदि आपने जोर दिया और कम से कम कुछ प्रविष्टियों को छोड़ा जा सकता है और वादा किया है कि आप कभी भी संबंधित इंटरप्ट को सक्षम नहीं करेंगे)।

00000014 <__ctors_end>:
  14:   11 24           eor r1, r1
  16:   1f be           out 0x3f, r1    ; 63
  18:   cf e9           ldi r28, 0x9F   ; 159
  1a:   cd bf           out 0x3d, r28   ; 61
  1c:   02 d0           rcall   .+4         ; 0x22 <main>
  1e:   05 c0           rjmp    .+10        ; 0x2a <_exit>

क्लियर SREG (मुझे यकीन नहीं है कि यह वास्तव में आवश्यक है), SPL (स्टैक पॉइंटर) को 0x9f (RAMEND) लिखता है और मुख्य रूप से कूदता है। अंतिम आरजेएम एक प्रकार का निरर्थक है। (आप मुख्य से वापस कभी नहीं आने का वादा कर सकते हैं)

00000020 <__bad_interrupt>:
  20:   ef cf           rjmp    .-34        ; 0x0 <__vectors>

उन लोगों के लिए डिफ़ॉल्ट रुकावट की प्रक्रिया सी में एक ओवरराइट नहीं की गई है (__vectors के समान नियम)

00000022 <main>:
  22:   bb 9a           sbi 0x17, 3 ; 23
  24:   c3 9a           sbi 0x18, 3 ; 24
  26:   c3 98           cbi 0x18, 3 ; 24
  28:   fd cf           rjmp    .-6         ; 0x24 <main+0x2>

आपकी मुख्य खरीद तंग।

0000002a <_exit>:
  2a:   f8 94           cli

0000002c <__stop_program>:
  2c:   ff cf           rjmp    .-2         ; 0x2c <__stop_program>

यह दो बहुत उपयोगी नहीं हैं। _exit को संभवतः C मानक द्वारा आवश्यक है और __stop_program के लिए आवश्यक है कि वह इसे काम करे।


16

आपका अंतिम आवेदन क्या है? ATtiny13 में फ्लैश का 1kB होता है और आप C. में बहुत कुछ कर सकते हैं। crt0 avr-libc C रनटाइम है। इसमें स्टैक हैंडलिंग जैसी चीजें शामिल हैं ताकि आप तर्कों और वापसी मूल्यों के साथ फ़ंक्शन का उपयोग कर सकें।

एम्बेडेड सी सेटअप के लिए 100 बाइट्स बहुत बुरा नहीं है, और यह निरंतर आकार है। प्रोग्राम लॉजिक की तर्ज पर डब करना जरूरी नहीं कि इसे 200 बाइट करें। आप किस अनुकूलन स्तर पर संकलन कर रहे हैं? आपको "-ओस" पर होना चाहिए। और आप इसे कैसे संकलित कर रहे हैं? Avr-libc साइट से उपलब्ध डेमो प्रोजेक्ट्स में मेकफाइल्स बहुत अच्छे और व्यापक हैं।

नीचे दिए गए साधारण एलईडी ऑन / ऑफ प्रोग्राम एवीटी -३.३ पर with -ओस ’के साथ ४.३.३ पर ४२ बाइट लेती है। क्रॉसपैक-एवीआर से:

# अलग करना <avr / io.h>
# अलग करें <avr / delay.h>

इंट मेन (शून्य)
{
    DDRB = = _BV (PB3);
    जबकि (1) { 
        PORTB | = _BV (PB3);
        _delay_ms (200);
        PORTB & = ~ _BV (PB3);
        _delay_ms (200);
    }
}

_Delay_ms () कॉल हटाने से यह 46 बाइट्स हो जाता है।

ATtiny13 पर एक बड़ा उदाहरण मेरे स्मार्ट एलईडी प्रोटोटाइप हैं । इस कोड में एक 3-चैनल सॉफ्टवेयर PWM, एक HSV-to-RGB रंग रूपांतरण, एक राज्य मशीन, और दो बटन पढ़ता है। यह विशेष रूप से अच्छा नहीं लिखा है और 864 बाइट्स में आता है। Avr-gcc 3.x के तहत यह और भी छोटा था। (किसी कारण से avr-gcc 4 ने लगभग सभी कार्यक्रमों को कुछ बाइट्स से बढ़ा दिया है)


avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.cमेरे मेकफाइल (स्वयं निर्मित) में प्रासंगिक पंक्ति है। और मैं लगभग समान कोड का उपयोग करता हूं सिवाय इसके कि मैं एलईडी का उपयोग PORTB &= ~(1 << LED);
करूं

और हाँ, आकार स्थिर है, लेकिन यहां तक ​​कि 46 बाइट्स थोड़े भारी लगते हैं अगर यह सब करना है तो एक
स्टैकफ्रेम

2

यदि आप अंतरिक्ष में कम हैं, तो IAR के एंबेडेड वर्कबेन्च को आज़माएँ - उनके मुफ्त 'किकस्टार्ट' संस्करण में 4K शब्द कोड आकार सीमा है, जो ATTiny के लिए बहुत अधिक है, और शायद gcc से बेहतर अनुकूलन।


1
अनुकूलन तुलना उच्च विवाद का विषय है। मैं वहां नहीं जाऊंगा।
टाइबलु

1
@tyblu मैं सहमत हूं, लेकिन IAR को उदाहरण के लिए avr-gcc की तुलना में छोटे बायनेरिज़ के निर्माण के लिए जाना जाता है। मैं हालांकि मिसेइलेक्ट्रिकस्टफ के साथ भी सहमत होगा और मुझे लगता है कि यह समझदार सलाह है।
मोर्टन जेन्सेन

1

इस तरह के उपकरण अक्सर कोडांतरक में प्रोग्राम किए जाते हैं, जिसके परिणामस्वरूप छोटे निष्पादन होते हैं। यह प्रयास करने और इसे इस्तेमाल करने के लिए सीखने के लायक है।


1
मैं सहमत होता हूं लेकिन IMHO लक्ष्य विधानसभा में पूरे उपकरणों को प्रोग्राम करना नहीं है (मुझे पता है कि यह अक्सर किया जाता है और मैंने यह भी किया है) लेकिन सी कंपाइलर आपकी पीठ के पीछे क्या कर रहा है, यह डिकोड और सत्यापित करने में सक्षम होना चाहिए। इसका मतलब यह भी है कि आप अक्सर संकलक का अनुमान लगाने में सक्षम होंगे और छोटे निष्पादन योग्य आकार प्राप्त करने के लिए सी में लिखे गए कोड को अनुकूलित कर सकते हैं।
jpc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.