আপনার ইতিমধ্যে কিছু পুরোপুরি ভাল উত্তর রয়েছে। আমি কেবল কিছু পরিসংখ্যান শেয়ার করার জন্য এটি পোস্ট করছি আমি একদিন নিজেকে একই ধরণের প্রশ্ন জিজ্ঞাসা করেছি: একটি ন্যূনতম স্কেচে এত স্থান কী নিচ্ছে? একই কার্যকারিতা অর্জনের জন্য ন্যূনতম কী প্রয়োজন?
নীচে একটি ন্যূনতম ব্লিঙ্কি প্রোগ্রামের তিনটি সংস্করণ রয়েছে যা প্রতি সেকেন্ডে 13 টি পিনে এলইডি টগল করে। সমস্ত তিনটি সংস্করণ একটি ইউনোর জন্য সংযুক্ত করা হয়েছে (কোনও ইউএসবি জড়িত নেই) avr-gcc 4.8.2, avr-libc 1.8.0 এবং arduino-core 1.0.5 (আমি আরডুইনো আইডিই ব্যবহার করি না) ব্যবহার করে।
প্রথমত, স্ট্যান্ডার্ড আরডুইনো উপায়:
const uint8_t ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
এটি 1018 বাইটে সংকলন করে। উভয় avr-nm
এবং অপ্রয়োজনীয় ব্যবহার করে , আমি সেই আকারটি পৃথক ফাংশনে বিভক্ত করেছিলাম। বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত:
148 A ISR(TIMER0_OVF_vect)
118 A init
114 A pinMode
108 A digitalWrite
104 C vector table
82 A turnOffPWM
76 A delay
70 A micros
40 U loop
26 A main
20 A digital_pin_to_timer_PGM
20 A digital_pin_to_port_PGM
20 A digital_pin_to_bit_mask_PGM
16 C __do_clear_bss
12 C __init
10 A port_to_output_PGM
10 A port_to_mode_PGM
8 U setup
8 C .init9 (call main, jmp exit)
4 C __bad_interrupt
4 C _exit
-----------------------------------
1018 TOTAL
উপরের তালিকায়, প্রথম কলামটি বাইটের আকার এবং দ্বিতীয় কলামটি জানিয়েছে যে কোডটি আড়ডিনো কোর লাইব্রেরি (এ, 822 বাইট মোট), সি রানটাইম (সি, 148 বাইট) বা ব্যবহারকারী (ইউ) থেকে এসেছে কিনা , 48 বাইট)।
এই তালিকায় দেখা যাবে, বৃহত্তম ফাংশনটি হল টাইমার 0 ওভারফ্লো বিঘ্নিতভাবে পরিবেশন করা রুটিন। এই রুটিন ট্র্যাকিং সময় দায়ী, এবং প্রয়োজন হয় millis()
, micros()
এবং delay()
। দ্বিতীয় বৃহত্তম ফাংশনটি হ'ল init()
, যা পিডব্লিউএম এর জন্য হার্ডওয়্যার টাইমার নির্ধারণ করে, TIMER0_OVF বিঘ্নকে সক্ষম করে এবং ইউএসআর্টকে সংযোগ বিচ্ছিন্ন করে (এটি বুটলোডার দ্বারা ব্যবহৃত হয়েছিল)। এটি এবং পূর্ববর্তী উভয় ফাংশনই সংজ্ঞায়িত করা হয়েছে
<Arduino directory>/hardware/arduino/cores/arduino/wiring.c
।
এরপরে সি + অ্যাভার-লিবিসি সংস্করণটি রয়েছে:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= _BV(PB5); /* set pin PB5 as output */
for (;;) {
PINB = _BV(PB5); /* toggle PB5 */
_delay_ms(1000);
}
}
পৃথক আকারের ব্রেক-ডাউন:
104 C vector table
26 U main
12 C __init
8 C .init9 (call main, jmp exit)
4 C __bad_interrupt
4 C _exit
----------------------------------
158 TOTAL
এটি অন্তর্নিহিত ফাংশন সহ সি রানটাইমের জন্য 132 বাইট এবং ব্যবহারকারী কোডের 26 বাইট _delay_ms()
।
এটি লক্ষ করা যেতে পারে যেহেতু এই প্রোগ্রামটি বিঘ্ন ব্যবহার করে না, তাই বাধা ভেক্টর টেবিলের প্রয়োজন নেই এবং নিয়মিত ব্যবহারকারী কোডটি তার জায়গায় স্থাপন করা যেতে পারে। নিম্নলিখিত সমাবেশ সংস্করণ ঠিক যে কাজ করে:
#include <avr/io.h>
#define io(reg) _SFR_IO_ADDR(reg)
sbi io(DDRB), 5 ; set PB5 as output
loop:
sbi io(PINB), 5 ; toggle PB5
ldi r26, 49 ; delay for 49 * 2^16 * 5 cycles
delay:
sbiw r24, 1
sbci r26, 0
brne delay
rjmp loop
এটি avr-gcc -nostdlib
কেবল 14 বাইটে একত্রিত হয় (এর সাথে ) বেশিরভাগটি টগলগুলি বিলম্ব করতে ব্যবহৃত হয় যাতে পলক দৃশ্যমান হয়। আপনি যদি এই বিলম্বের লুপটি সরিয়ে ফেলেন তবে আপনি একটি 6-বাইট প্রোগ্রাম শেষ করবেন যা দেখতে খুব দ্রুত জ্বলজ্বল করে (2 মেগাহার্টজ এ):
sbi io(DDRB), 5 ; set PB5 as output
loop:
sbi io(PINB), 5 ; toggle PB5
rjmp loop