কীভাবে সত্যই স্কেচ সঙ্কুচিত করবেন


9

আমি পরীক্ষার প্রয়োজনে একটি স্কেচ তৈরি করতে চাই যা যতটা সম্ভব ছোট। সমস্যাটি হ'ল, আমি যখন বেয়ারিমিনিমাম স্কেচটি (একটি ফাঁকা সেটআপ এবং লুপ সহ) সংকলন করি, তখন আমি ইউনোর জন্য 466 বাইট এবং লিওনার্দোর জন্য পুরো 4,242 পাই। আপনার নিজস্ব কোড লেখার কোনও উপায় আছে যার কোনও অতিরিক্ত ফাংশন নেই (যথা টাইমার0 এর জন্য millis()এবং delay())। আমি লিওনার্দোর কীবোর্ড / মাউস ফাংশন অক্ষম করতে সক্ষম হতে চাই।


4
এটি লিওনার্দো ট্যাগ করা উচিত এবং উনো করা উচিত নয় (এবং একটি বোর্ডে ফোকাস)? এগুলি পৃথক প্রশ্ন।
asheeshr

আমি কেবল ইঙ্গিত করছি যে অনেকগুলি বোর্ডের জন্য একটি ফাঁকা সংকলিত স্কেচ বড়, বিশেষত নেটিভ ইউএসবি ভিত্তিক
TheDoctor

আমি লিওনার্দোর কীবোর্ড / মাউস ফাংশন অক্ষম করতে সক্ষম হতে চাই। দ্বিতীয় প্রশ্ন।
asheeshr

উত্তর:


3

আপনি https://github.com/arduino/Ardino/wiki/Ardino-IDE-1.5---3rd-party-Hardware-specifications অনুযায়ী কাস্টম boards.txt ফাইলের সাথে নিজের বোর্ড সংজ্ঞা তৈরি করতে সক্ষম হওয়া উচিত । আমি দেখতে পাচ্ছি লিওনার্দোর সংজ্ঞায় বেশ কয়েকটি ইউএসবি বৈশিষ্ট্য রয়েছে। আমি আশা করবো যে 4K এর সংকলনগুলি এই পতাকাগুলির ভিত্তিতে, প্রসেসরের ধরণের নয়।

যেখানে বোর্ডস.টিএসটিএসটি লিওনার্দোর আপলোড, বুটলোডার বিভাগ এবং ইউনো থেকে বিল্ড ব্যবহার করবে।

এটি সমস্ত গ্রন্থাগার বিল্ডটি ইউএসবি ফাংশন অন্তর্ভুক্ত করার জন্য প্রসেসরের নির্দিষ্ট পতাকা ব্যবহার করে না তা ধরে নেওয়া হচ্ছে।

আপনি যদি এই ধরনের কাজ পেতে। ফিরে পোস্ট করুন, আমি নিশ্চিত অন্যরাও এতে আগ্রহী হবে।


আমি সম্প্রতি একটি লাইব্রেরির ডেমোতে এই 4K ব্যবহৃত সীমাবদ্ধতার দিকে দৌড়েছি যা আসলে ইউএনওকে সর্বাধিক সরিয়ে নিয়েছিল এবং একটি

#if !defined(__AVR_ATmega32U4__)
...

লিওনার্দোতে ফিট করার জন্য স্কেচটিতে অতিরিক্ত বৈশিষ্ট্যগুলির একটি বিশাল অংশ around

আমার ধারনা (ভুল) ছিল যে এই 4 কে কারণ আমি এখনও সিরিয়াল.প্রিন্ট অন্তর্ভুক্ত করেছি যা যখন ইউএসবির সিডিসিতে লিওতে থাকে। তবে আমি দেখতে পাচ্ছি একটি খালি স্কেচের একটি মেমরি ডাম্প পরে তারা এখনও আছে।

C:\Users\mflaga\AppData\Local\Temp\build8958339595868119500.tmp>avr-objdump -d sketch_feb13a.cpp.elf > sketch_feb13a.cpp.elf.lst

যা বোঝায়। লিওনার্দো এখনও ইউএসবি-সিডিসি ক্লায়েন্টের (4 কে) প্রয়োজন হিসাবে এভিআর-ডুডি থেকে 1200 বাউড সংযোগ সনাক্ত করতে দূরবর্তী রিবুটটি স্ট্রোক করতে পারে।


সুতরাং বিল্ডে ইউএসবি ছাড়াই কাস্টম বোর্ডস.টিএসটি তৈরি করাও দরকার also

leonardo.upload.use_1200bps_touch=true

সরানো হয়েছে।

একবার লক্ষ্যটিতে লোড হয়ে গেলে, আপলোডটির জন্য লক্ষ্যটির ম্যানুয়াল রিসেটের সাথে সিঙ্ক্রোনাইজ করা প্রয়োজন। রিমোট রিবুট করার ক্ষমতাটি যেমন হারিয়ে যায়।


4K এখনও কেন সংকলিত রয়েছে তা আপডেট হয়েছে, এমনকি সিরিয়াল.প্রিন্ট বাদ দিলে।
এমপিফ্লাগা

3

আমি সম্প্রতি ঠিক এটি করতে চেয়েছিলাম। যেহেতু এটি করার কোনও দুর্দান্ত উপায় নেই, তাই স্টিনো সাব্লাইম-টেক্সট আরডুইনো প্লাগইনটি ঠিক এটি করার জন্য আমি একটি প্যাচ লিখে ফেললাম । এটি পরবর্তীকালে গৃহীত হয়েছে, সুতরাং এটি কোনও আপ-টু-ডেট স্টিনো ইনস্টলগুলিতে হওয়া উচিত।

এটি স্টিনোতে একটি নতুন বিকল্প যুক্ত করেছে:

এখানে চিত্র বর্ণনা লিখুন

এই মোডটি ব্যবহার করে নিম্নলিখিতগুলির মতো সংকলনের ফলাফল তৈরি হয়:

ইউনোর জন্য:

বাইনারি স্কেচের আকার: 172 বাইট (একটি 32256 বাইট সর্বাধিক, 0.53 শতাংশ)।
আনুমানিক মেমরি ব্যবহার: 0 বাইট (1024 বাইট সর্বাধিক, 0.00 শতাংশ)।

একটি লেওনার্ডো জন্য

বাইনারি স্কেচের আকার: 240 বাইট (একটি 28672 বাইট সর্বাধিক, 0.84 শতাংশ)।
আনুমানিক মেমোরি ব্যবহার: 0 বাইট (2560 বাইট সর্বাধিক, 0.00 শতাংশ)।

আসলে প্রোগ্রামিং উপরে কম্পাইল আউটপুট লিওনার্দো হয় সম্ভবত একটি খারাপ ধারণা, যেমন পারে স্বয়ং-রিসেট কার্যকারিতা বিরতি, কিন্তু আপনি পারে , যদি আপনি চেয়েছিলেন। তার উত্তরে এটি লক্ষ করার জন্য এমপিফ্লাগে টুপি-টিপ।

মনে রাখবেন যে মেমরির প্রতিবেদনগুলি আসলে ভুল, তবে এটি একটি পৃথক সমস্যা

উপরের জন্য ব্যবহৃত কোডটি হ'ল:

int main()
{
    while (1)
    {

    }
}

কিছু নোট:

  • আপনি আর "স্কেচ" লিখছেন না, আসলে আপনি কখনও স্কেচ লেখেন না । আপনি প্রোগ্রাম লিখুন । সময়কাল। আরডুইনো ওয়াকোস কী বলতে চায় তা আমি খেয়াল করি না, তারা শর্তগুলি নতুন করে সংজ্ঞায়িত করতে পারে না।
  • সমস্ত বিঘ্নিত ব্যবস্থাপনা ম্যানুয়াল। এর অর্থ না milis()বা অনুরূপ similar
  • আপনি করতে পারেন এখনও এবং তাই ঘোষণা Arduino সিরিয়াল লাইব্রেরি ব্যবহার করেন আপনি চান। আপনার আছে #include <Arduino.h>
  • আপনি সংজ্ঞা দিন main। আপনি কখনও থেকে ফিরে না main। আপনি যদি সেটআপ স্টাফ চান, এটি আগে যায় while (1)

@ jfpoil ব্যাখ্যা আপনি কি একটি আইডিই কল? ম্যাক্রো সহ নোটপ্যাডের মতো আরও ...
রন

@ রন-ই আমি এটিকে আইডিই বলি না, আরডুইনো আইডিই এটির নাম, তাই আমি এটির নামটি ব্যবহার করি না, যদিও এটির নামটি মূল্যবান নয়।
jfpoil ব্যাখ্যা

2
স্ট্যাক এক্সচেঞ্জ সাইটগুলিতে @ ফেকনাম বাজে ভাষা ব্যবহারের অনুমতি নেই (দেখুন: stackoverflow.com/help/behaviour )। আমি এই ক্ষেত্রে এটি সম্পাদনা করেছি, তবে দয়া করে ভবিষ্যতে এই সাইটে এক্সপ্লিটিভ ব্যবহার থেকে বিরত থাকার চেষ্টা করুন। ধন্যবাদ।
পিটার ব্লুমফিল্ড

2

যদিও এটি আপনার স্কেচের উপর নির্ভর করে, আপনি পদ্ধতিগুলি সহ কোডটি পুনরায় ব্যবহার করে কিছুটা আকার হ্রাস করতে পারবেন

এই কোডটি নিন:

int led = 13;
int val;

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second

  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second

  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second

  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second

  val = digitalRead(10);
}

আরডুইনো ইউনোতে 1,322 বাইট এখন এটি কিছুটা সঙ্কুচিত করা যাক:

int led = 13;
int val;

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  for(uint8_t i = 0; i < 8; i++) {
    blink(HIGH);
    blink(LOW);
  }    
  val = digitalRead(10);
}

void blink(uint8_t state) {
  digitalWrite(led, state);   // turn the LED to the right state
  delay(1000);                // wait for a second
}

1,194 বাইট এটি প্রায় 10% হ্রাস!

যাইহোক, যদিও এটি কোনও স্কেচটি খুব একটা সঙ্কুচিত করে না , সীমা ছাড়িয়ে আপনি যখন দুটি বাইট হয়ে থাকেন তবে কখনও কখনও এটি সহজতম পথ হতে পারে বা কোনও কার্যকারিতা না হারিয়েই শুরু করার জন্য আরও কমপ্যাক্ট স্কেচ তৈরি করতে চান। এটি প্রতিটি পরিস্থিতির জন্য নয়, তবে আমি কখনও কখনও এটি দরকারী মনে করি।


সাধারণত, আপনি কোডগুলিকে ফাংশনগুলিতে টেনে আনলে, সংকলক কঠোর পরিশ্রম করবে এবং বাকিটি আপনার জন্য সঠিকভাবে পাবে।
সাইবার্বিবনস

@ সাইবারিগিবনস আপনি কি এটি সংজ্ঞায়িত করতে পারেন [যে ব্যবহারকারীদের সাথে পরিচিত নন]?
বেনামে পেঙ্গুইন

3
আপনি যদি কোনও ফাংশনে কোডটি বিভক্ত করেন এবং এটি কার্যকর না হয় তবে সাধারণত সংকলকটি এটি আপনার জন্য ইন-লাইন করবে। যাইহোক, একটি সংকলক ফাংশনগুলিতে কোড ভাঙবে না। অতএব, আরও ফাংশন লেখার জন্য এটি প্রায় সর্বদা ভাল।
সাইবার্বিবনস

1
প্লাস

সরাসরি পোর্ট অ্যাক্সেস ব্যবহার করে আকারটি হ্রাস পেয়ে 64৪ 64 বাইটে পরিণত হয়। শুধুমাত্র অ্যাভিআর-লিবিসি (কোনও আরডুইনো কোর নেই) ব্যবহার করে এটি 220 বাইটে নেমে যায়।
এডগার বোনেট

0

@ অ্যাননোমাস পেঙ্গুইন, নিশ্চিত যে আমরা কোডটি আমার কম্পিউটারে আনো করার জন্য 1180 বাইট ফ্ল্যাশ + 13 বাইট র‌্যামে সংকলন করতে পারি, তবে আমরা এটির উন্নতি করতে পারি :) তাই গল্ফ চ্যালেঞ্জ গৃহীত হয়েছে এবং কয়েকটি কার্যকর টিপস যেহেতু আমরা ব্যবসায়ে আছি শেখার।

পদক্ষেপ 1: পরিবর্তনশীল প্রয়োজনীয়তা হ্রাস। নেতৃত্বাধীন বন্দরটির জন্য কোন ইন্ট ব্যবহার করা কিছুটা ওভারকিল বলে মনে হচ্ছে, আমাদের কাছে অবশ্যই অর্ডিনোতে 65535 ঠিকানাযোগ্য আইও বন্দর নেই :) সুতরাং আমরা এটি কেবল মজাদার জন্য এটি বাইটে পরিবর্তন করি। আমরা পরে এটি একটি # নির্দিষ্ট সংখ্যায় পরিবর্তন করব, তবে খুব বড় ভেরিয়েবল প্রকারের ব্যবহারের প্রভাব প্রদর্শন করতে।

byte led = 13;
int val;

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  blink();
  val = digitalRead(10);
}

void blink() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

1172 বাইট + 13 বাইট র‌্যামে সংকলন করে। একটি পূর্ণসংখ্যার পরিবর্তে বাইটের জন্য কম প্রয়োজনীয় অপারেশনের কারণে এটি 8 বাইট ফ্ল্যাশ সাশ্রয় করে। আমি 12 বাইট র‌্যাম আশা করব, তবে ঠিক আছে। তেমন কিছু নয়, তবে প্রতিটা বাইট সংরক্ষণ করা ভাল।

পদক্ষেপ 2: যখন এটি বোধগম্য হয় তখন পরিবর্তনশীলকে পরিবর্তিত করে সংজ্ঞায়িত করে into উদাহরণস্বরূপ, নেতৃত্বাধীন বাইটের প্রয়োজন হয় না, পিনটি নিজেই সসোল্ডার করবে না।

#define LED 13
int val;

void setup() {                
  pinMode(LED, OUTPUT);     
}

void loop() {
  blink();
  val = digitalRead(10);
}

void blink() {
  digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

1142 বাইটসফ্ল্যাশ + 11 বাইট র‌্যামে সংকলন করে। ইতিমধ্যে 38 বাইট সংরক্ষণ করা হয়েছে। এটি অন্তর্ভুক্ত মান আনতে প্রয়োজন নিবন্ধভুক্ত অপারেশনগুলির কারণে। এছাড়াও আমরা র‌্যাম থেকে 2 বাইট সংরক্ষণ করেছি। (এখনও অবাক হয়ে যাচ্ছেন কেন বাইটটি 1 টি কম বাইট র‌্যামের মধ্যে সংকলিত হয়নি .....)

পদক্ষেপ 3: কোডটি অনুকূলিত করুন। আমি 2 বিলম্ব দেখছি। আমি আশ্চর্য হয়েছি যদি আমি এটি 1 বিলম্ব করে পরিবর্তন করি তবে এটি স্থান সাশ্রয় করবে, তবে আমাকে এলইডি পিনের মূল্য বের করতে হবে এবং এটিকে টগল করতে হবে (বিপরীত করা)। আমরা এটি ডিজিটালরিড () দিয়ে করতে পারি, তবে এটি কি স্থান বাঁচাবে?

#define LED 13
int val;
void setup() {                
  pinMode(LED, OUTPUT);     
}
void loop() {
  blink();
  val = digitalRead(10);
}
void blink() {
  digitalWrite(LED, !digitalRead(LED));   // toggle the led based on read value
  delay(1000);               // wait for a second and spare yourself the other delay
}

1134 বাইট + 11 বাইট র‌্যামে সংকলন করে। হ্যাঁ! অন্য 8 বাইট। এটি মোট 46 বাইট এবং কোডের 2 টি কম লাইন করে।

হ্রাস কোডাইজ করার জন্য আরও একটি সাধারণ পরামর্শ। স্ট্রিং ক্লাস ব্যবহার করবেন না। এটি বিশাল, চার অ্যারে, স্ট্রিপিপি (), আরআরসিএমপি () কীভাবে মোকাবেলা করতে হয় তা শিখুন। আপনার সমস্ত কিছু যদি কিছু প্রাথমিক স্ট্রিং অপারেশন হয় তবে স্ট্রিং ক্লাসের ব্যবহার বেশিরভাগ ক্ষেত্রে কেবল ফ্ল্যাশ এবং র‌্যাম উভয় জায়গাতেই অপচয় করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.