এটিটিইএন 13 - এভিআর-জিসিসি হ্যালো ওয়ার্ল্ড 100 বাইটের বেশি ব্যবহার করে?


9

আমি এটিটিইন 13 এর জন্য একটি প্রোগ্রাম লেখার চেষ্টা করছি। আমার সমস্যাটি হ'ল এতে বিশাল আকারের বাধা রয়েছে। ঠিক আছে, আমার প্রথম হ্যালো ওয়ার্ল্ড প্রোগ্রামটি তৈরি করার সময়, এটি হালকা চালু এবং বন্ধ করতে কেবল 100 বাইটের প্রোগ্রাম স্পেস নিয়েছিল! এই আকারটি সঙ্কুচিত করতে আমি avr-gcc কে দিতে পারি এমন কোনও বিকল্প আছে কি? এছাড়াও, crt0 এ কি আছে? আমি এভিআর সমাবেশে খুব আগ্রহী নই তাই আমি এটি বেশি বুঝতে পারি না ..

আমি এই প্রকল্পের জন্য সমাবেশে যেতে চাই না ..


সামান্য দিকের নোট হিসাবে, কিছু লোক এটিকে "ব্লিঙ্কি" -প্রগ্রাম বলে অভিহিত করবে।
জোহান

1
@ জোহান ভালই ছিলাম আমি কীভাবে "ব্লিঙ্কেনলাইটস" বানান করব তা নিশ্চিত ছিলাম না
আর্লজ

উত্তর:


9

crt0 ইউসির জন্য স্টার্টআপ রুটিন। রুটিনগুলি নিবন্ধগুলির সেটআপ এবং ডেটা শুরু করার কাজ করে।

100 বাইটের মধ্যে বাধা ভেক্টর টেবিল অন্তর্ভুক্ত রয়েছে? আমি এটিটিইনিং 13 সম্পর্কে নিশ্চিত নই তবে এটিটিই 25/45/85 এ 15 টি বাধা ভেক্টর রয়েছে। এটি 30 বাইট নিতে হবে।

আপনার crt0 এ লিঙ্ক করার জন্য gcc এর বিকল্প রয়েছে। আপনি AVR crt0.S ফাইলটি নিতে এবং এটি পরিবর্তন করতে পারেন। এটি খুব দীর্ঘ নয় তাই এটি করা কঠিন হওয়া উচিত নয়।


আমি crt0 উত্সটি খুঁজে পেতে পারি না, তবে crt1 এ এমন একটি জিনিস রয়েছে যা মনে হয় একটি বাধা ভেক্টর টেবিল বলে মনে হচ্ছে। সম্ভবত এটি হ'ল
আর্লজ

আমি এটি আমার সিস্টেমে খুঁজে পাচ্ছি না :( আমি উত্স থেকে সমস্ত সরঞ্জামগুলি সংকলন করেছি তাই আমি ভেবেছিলাম এটি সেখানেই রয়েছে you আপনি যদি "crt0.S atmel" জন্য স্টার্টআপ, crt0 এবং gcc সম্পর্কে একাধিক অ্যাপল নোটের জন্য গুগল করেন তবে অপ্টিমাইজেশান উঠে আসে
those ডক্সে

@jlu আমি দুই এর মধ্যে পার্থক্য চিন্তা করার চেষ্টা করছি তবে স্ট্যাক ওভারফ্লো কোন জিনিস ভাল পাইনি এখনো: stackoverflow.com/questions/2709998/...
Earlz

2
এভিআর-লিবিসি-তে প্রতিটি ধরণের এভিআর চিপের জন্য আলাদা আলাদা সিআরটি থাকে এবং মানক অ্যাভিআর-লিবিসি ডিস্ট্রোস কেবলমাত্র ফাইলের .o সংস্করণ অন্তর্ভুক্ত করে। এটিটিনি 13 এর জন্য একটিটি [অ্যাভির-লিবিসি-পাথ] /avr-3/lib/crttn13.o
টডবট

@ টডবোট হুম। আহ, ঠিক আছে আমি এটিতে /avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
পেয়েছি

19

আপনি আওয়ার-অজডাম্প-ডি ব্যবহার করতে পারেন elf

আসুন এটি একটু বিশ্লেষণ করুন:

[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>

ক্লিয়ার এসআরজি (আমি নিশ্চিত এটির সত্যতা প্রয়োজন কিনা), এসপিএলকে (0 স্ট্যাক পয়েন্টার) 0x9f (র‌্যাম্যান্ড) লিখে মূল দিকে লাফিয়ে যায়। শেষ rjmp এক ধরণের অপ্রয়োজনীয়। (আপনি প্রতিশ্রুতি দিতে পারেন কখনই মূল থেকে ফিরে আসবেন না)

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>

এই দুটি খুব দরকারী নয়। _ এক্সিট সম্ভবত সি স্ট্যান্ডার্ড দ্বারা প্রয়োজন এবং এটির মতো কাজ করার জন্য __স্টপ_প্রগ্রাম প্রয়োজন।


16

আপনার শেষ আবেদন কি? একটি এটিটিনি 13 এর 1kB ফ্ল্যাশ রয়েছে এবং আপনি সি এর সাথে অনেক কিছু করতে পারেন crt0 হল অ্যাভ্র-লিবসি সি রানটাইম। এতে স্ট্যাক হ্যান্ডলিংয়ের মতো জিনিস রয়েছে যাতে আপনি আর্গুমেন্ট এবং রিটার্ন মান সহ ফাংশন ব্যবহার করতে পারেন।

এমবেড করা সি সেটআপের জন্য 100 বাইট খুব খারাপ নয়, এবং এটি ধ্রুব আকার। প্রোগ্রাম লজিকের লাইনগুলি দ্বিগুণ করা এটি অগত্যা 200 বাইট তৈরি করবে না। আপনি কোন অপ্টিমাইজেশন স্তরে সংকলন করছেন? আপনার "ওস" এ থাকা উচিত। এবং আপনি এই সংকলন হয় কিভাবে? অ্যাভিআর-লিবিসি সাইট থেকে উপলব্ধ ডেমো প্রকল্পগুলির মেকফিলগুলি বেশ ভাল এবং ব্যাপক।

নীচে সাধারণ এলইডি অন / অফ প্রোগ্রামটি এটিআর-জিসিসি ৪.৩.৩ এ "-ওস" সহ একটি এটিটিনি 13 এ 62 বাইট নেয়। ক্রসপ্যাক-এভিআর থেকে:

# অন্তর্ভুক্ত <avr / io.h>
# অন্তর্ভুক্ত <এআরআর / বিলম্ব

প্রধান প্রধান (শূন্য)
{
    ডিডিআরবি | = _বিভি (পিবি 3);
    (1) while 
        পোর্টবি | = _বিভি (পিবি 3);
        _delay_ms (200);
        পোর্টটিবি & = ~ _বিভি (পিবি 3);
        _delay_ms (200);
    }
}

_ডলে_এমএস () কলগুলি সরিয়ে ফেলা এটি 46 বাইট করে।

এটিটিইন 13 এর আরও বড় উদাহরণ হ'ল আমার স্মার্ট এলইডি প্রোটোটাইপগুলি । এই কোডটিতে একটি 3-চ্যানেল সফ্টওয়্যার PWM, একটি এইচএসভি-থেকে-আরজিবি রঙ রূপান্তর, একটি রাষ্ট্রীয় মেশিন রয়েছে এবং দুটি বোতাম পড়ে। এটি বিশেষভাবে ভালভাবে লেখা হয়নি এবং এটি 864 বাইটে আসে। Avr-gcc 3.x এর অধীনে এটি আরও ছোট ছিল। (কোনও কারণে avr-gcc 4 প্রায় সমস্ত প্রোগ্রামকে কয়েকটি বাইট দ্বারা বাড়িয়েছে)


avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.cআমার মেকফিলের প্রাসঙ্গিক লাইন (স্ব-নির্মিত)। এবং আমি ছাড়া প্রায় অনুরূপ কোড ব্যবহার নেতৃত্বাধীন আমি ব্যবহারের টুসকি PORTB &= ~(1 << LED);এবং এই ধরনের
Earlz

এবং হ্যাঁ, আকারটি ধ্রুবক, তবে 46 টি বাইট এমনকি ভারী মনে হয় যদি এটি করতে হয় তবে একটি স্ট্যাকফ্রেম সেটআপ করা হয়
আর্লজ

2

আপনি যদি জায়গাতে স্বল্প হয়ে থাকেন তবে আইএআর এর এমবেডড ওয়ার্কবেঞ্চ ব্যবহার করে দেখুন - তাদের বিনামূল্যে 'কিকস্টার্ট' সংস্করণে 4K শব্দের কোড আকারের সীমা রয়েছে, এটিটিইনির জন্য যথেষ্ট পরিমাণে, এবং সম্ভবত জিসিসির চেয়ে আরও ভাল অপ্টিমাইজেশন রয়েছে


1
অনুকূলকরণ তুলনা উচ্চ বিতর্ক একটি বিষয়। আমি সেখানে যাব না।
tyblu

1
@tyblu আমি সম্মত, তবে আইএআর উদাহরণস্বরূপ avr-gcc এর চেয়ে ছোট বাইনারি তৈরির জন্য পরিচিত ..
মর্টেন জেনসেন

1

এর মতো ডিভাইসগুলি প্রায়শই এসেম্বলারের মধ্যে প্রোগ্রাম করা হয়, ফলে ছোট এক্সিকিউটেবল হয়। প্রচেষ্টা করা এবং এটি ব্যবহার করতে শেখার মূল্য।


1
আমি সম্মত হবো তবে আইএমএইচও লক্ষ্যটি পুরো ডিভাইসগুলিকে প্রোগ্রামিং করা নয় (আমি জানি এটি প্রায়শই করা হয়ে থাকে এবং আমি এটিও করেছি) তবে সি সংকলকটি আপনার পিছনে কী করছে তা যাচাই করতে এবং যাচাই করতে সক্ষম হতে। এর অর্থ হ'ল আপনি প্রায়শই দ্বিতীয়টি সংকলকটি অনুমান করতে সক্ষম হন এবং ছোট এক্সিকিউটেবল আকার পেতে আপনি সি তে যে কোডটি লিখেছেন তা অপ্টিমাইজ করতে পারে।
jpc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.