वास्तव में एक स्केच को कैसे सिकोड़ें


9

मैं एक स्केच बनाना चाहता हूं जो परीक्षण उद्देश्यों के लिए जितना संभव हो उतना छोटा है। समस्या यह है, जब मैं बेयरमिनिमेट स्केच (एक खाली सेटअप और लूप के साथ) को संकलित करता हूं, तो मुझे ऊनो के लिए 466 बाइट्स और लियोनार्डो के लिए 4,242 की छूट मिलती है। क्या आपके पास अपना कोड लिखने का कोई तरीका है जिसके पास कोई अतिरिक्त कार्य नहीं है (अर्थात् के लिए Timer0 millis()और delay())। मैं लियोनार्डो के लिए कीबोर्ड / माउस फ़ंक्शन को अक्षम करना भी चाहूंगा।


4
क्या यह लियोनार्डो को टैग नहीं किया जाना चाहिए और न ही (और एक बोर्ड पर ध्यान केंद्रित करना) होना चाहिए? ये अलग सवाल हैं।
एशेश्र

मैं सिर्फ इशारा कर रहा हूं कि बहुत सारे बोर्डों के लिए एक खाली संकलित स्केच बड़ा है, विशेष रूप से देशी यूएसबी आधारित
TheDoctor

मैं लियोनार्डो के लिए कीबोर्ड / माउस फ़ंक्शन को अक्षम करना भी चाहूंगा। दूसरा सवाल है।
असीश्र

जवाबों:


3

आपको https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3-3-party-Hardware-spotification के अनुसार एक कस्टम बोर्ड के साथ अपनी बोर्ड परिभाषा बनाने में सक्षम होना चाहिए । जैसा कि मैं देख रहा हूँ कि लियोनार्डो की परिभाषा में कई USB विशेषताएँ हैं। मुझे उम्मीद है कि 4K का समावेश इन झंडों से बना है, न कि प्रोसेसर प्रकार से।

जहाँ Board.txt लियोनार्डो से अपलोड, बूटलोडर सेक्शन और यूनो से बिल्ड का उपयोग करेगा।

यह सभी मान रहा है कि मुख्य पुस्तकालय निर्माण में USB फ़ंक्शन को शामिल करने के लिए प्रोसेसर विशिष्ट झंडे का उपयोग नहीं किया गया है।

अगर आपको इस तरह का काम मिलता है। पोस्ट बैक, मुझे यकीन है कि दूसरों को इस तरह से दिलचस्पी होगी।


मैं हाल ही में एक पुस्तकालय डेमो पर इस 4K उपयोग सीमा में भाग गया, जो वास्तव में संयुक्त राष्ट्र संघ को अधिकतम किया और एक में डाल दिया था

#if !defined(__AVR_ATmega32U4__)
...

लियोनार्डो पर फिट होने के लिए स्केच में अतिरिक्त सुविधाओं का एक बड़ा हिस्सा।

मैंने मान लिया था (गलत) कि यह 4K था क्योंकि मैंने अभी भी Serial.print को शामिल किया था जो कि जब USB के लियो पर CDC के ऊपर होता है। लेकिन मैं एक खाली स्केच की मेमोरी डंप के बाद देखता हूं वे अभी भी वहां हैं।

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

जो समझ में आता है। जैसा कि लियोनार्डो को अभी भी USB-CDC क्लाइंट (4K) की आवश्यकता है, ताकि रिमोट रिबूट को स्ट्रोक करने के लिए AVR-DUDE से 1200 बॉड कनेक्ट का पता लगाया जा सके।


इसलिए निर्माण में USB के बिना एक कस्टम बोर्ड बना रहे हैं

leonardo.upload.use_1200bps_touch=true

हटा दिया।

एक बार लक्ष्य पर लोड हो जाने के बाद, इसे अपलोड को लक्ष्य के मैनुअल रीसेट के साथ सिंक्रनाइज़ करने की आवश्यकता होगी। जैसे रिमोट रिबूट की क्षमता खो जाती है।


क्यों 4K को अभी भी संकलित किया गया है, भले ही Serial.print छोड़ दिया गया हो।
एमपीफ्लगागा

3

मैं हाल ही में ठीक यही करना चाहता था। के बाद से कोई अच्छा तरीका ऐसा करने के लिए, मैं समापन एक पैच लेखन के लिए Stino वास्तव में यह करने के लिए प्लगइन arduino उदात्त-पाठ। इसे बाद में स्वीकार कर लिया गया है, इसलिए यह किसी भी अप-टू-डेट स्टिनो में स्थापित होना चाहिए।

यह स्टिनो के लिए एक नया विकल्प जोड़ता है:

यहां छवि विवरण दर्ज करें

इस मोड का उपयोग करने से निम्नलिखित परिणाम संकलन परिणाम प्राप्त होते हैं:

एक ऊनो के लिए:

बाइनरी स्केच का आकार: 172 बाइट्स (32256 बाइट अधिकतम, 0.53 प्रतिशत)।
अनुमानित स्मृति उपयोग: 0 बाइट्स (1024 बाइट अधिकतम, 0.00 प्रतिशत)।

एक लियोनार्डो के लिए

बाइनरी स्केच का आकार: 240 बाइट्स (28672 बाइट अधिकतम, 0.84 प्रतिशत)।
अनुमानित स्मृति उपयोग: 0 बाइट्स (2560 बाइट अधिकतम, 0.00 प्रतिशत)।

वास्तव में उपरोक्त संकलित आउटपुट के साथ लियोनार्डो को प्रोग्रामिंग करना शायद एक बुरा विचार है, क्योंकि यह ऑटो-रीसेट कार्यक्षमता को तोड़ सकता है , लेकिन यदि आप चाहते थे, तो आप कर सकते थे। अपने जवाब में इस पर ध्यान न देने के लिए mpflaga को हैट-टिप।

ध्यान दें कि मेमोरी रिपोर्ट वास्तव में गलत हैं, लेकिन यह एक अलग मुद्दा है

उपरोक्त के लिए प्रयुक्त कोड है:

int main()
{
    while (1)
    {

    }
}

कुछ नोट:

  • आप एक "स्केच" अब और लिख नहीं है, नहीं है कि आप कभी वास्तव में है एक स्केच लिखें। आप प्रोग्राम लिखते हैं । अवधि। मुझे परवाह नहीं है कि Arduino wackos क्या कहना चाहते हैं, वे शर्तों को फिर से परिभाषित नहीं करते हैं।
  • सभी व्यवधान प्रबंधन मैनुअल है। इसका मतलब नहीं milis()या समान है।
  • आप अभी भी arduino सीरियल लाइब्रेरी का उपयोग कर सकते हैं और आगे, यदि आप चाहते हैं। आपको करना है #include <Arduino.h>
  • आप परिभाषित करते हैं main। तुम कभी नहीं लौटे main। यदि आप सेटअप सामान चाहते हैं, तो यह पहले चला जाता है while (1)

@jfpoilpret आप उसे आईडीई कहते हैं? मैक्रोज़ के साथ नोटपैड की तरह ...
रॉन

@ Ron-E मैं इसे IDE नहीं कहता, Arduino IDE इसका नाम है, इसलिए मैंने इसके नाम का उपयोग किया है, भले ही यह उस नाम के लायक नहीं है।
jfpoilpret 6

2
@FakeName स्टैक एक्सचेंज साइटों पर खराब भाषा की अनुमति नहीं है (देखें: stackoverflow.com/help/behavior )। मैंने इसे इस मामले में संपादित कर दिया है, लेकिन कृपया भविष्य में इस साइट पर एक्सपेलेटिव्स का उपयोग करने से बचने की कोशिश करें। धन्यवाद।
पीटर ब्लूमफील्ड

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);
}

Arduino Uno पर 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% की कमी है!

वैसे भी, हालांकि यह एक स्केच को बहुत कम नहीं करता है , यह कभी-कभी सबसे आसान मार्ग हो सकता है जब आप सीमा से दो बाइट्स होते हैं, या बस किसी भी कार्यक्षमता को खोए बिना शुरू करने के लिए एक अधिक कॉम्पैक्ट स्केच बनाना चाहते हैं। यह हर स्थिति के लिए नहीं है, लेकिन मुझे यह कभी-कभी उपयोगी लगता है।


आम तौर पर, यदि आप कोड को कार्यों में बाहर निकालते हैं, तो संकलक कड़ी मेहनत करेगा और आपके लिए शेष अधिकार प्राप्त करेगा।
साइबर्गिबोन्स

@Cybergibbons क्या आप परिभाषित कर सकते हैं कि [उन उपयोगकर्ताओं के लिए जो उस से परिचित नहीं हैं]?
अनाम पेंगुइन

3
यदि आप किसी फ़ंक्शन में कोड को तोड़ते हैं और यह कुशल नहीं है, तो आमतौर पर कंपाइलर इसे आपके लिए इन-लाइन कर देगा। हालांकि, एक कंपाइलर कभी भी फंक्शन में कोड आउट नहीं करेगा। इसलिए, अधिक फ़ंक्शन लिखना लगभग हमेशा बेहतर होता है।
साइबर्ग रिबन

1
इसके अलावा कोड को कार्यों में लगाने से पढ़ने और समझने में बहुत आसान हो जाता है

डायरेक्ट पोर्ट एक्सेस का उपयोग करते हुए, आकार 646 बाइट्स तक कम हो जाता है। केवल avr-libc (कोई Arduino कोर) का उपयोग करते हुए, यह 220 बाइट्स तक नीचे चला जाता है।
एडगर बोनट

0

@annonomus पेंगुइन, निश्चित रूप से हम कर सकते हैं हालांकि कोड 1180 बाइट्स में संकलित करता है + 13 बाइट्स रैम मेरे कंप्यूटर पर एक यूनो के लिए, हम इस पर सुधार कर सकते हैं :) इसलिए गोल्फ चुनौती स्वीकार की जाती है और कुछ उपयोगी टिप्स भी जब से हम व्यवसाय में हैं सीख रहा हूँ।

चरण 1: परिवर्तनीय आवश्यकताओं को कम करें। एक एलईडी पोर्ट के लिए एक इंट का उपयोग करना थोड़ा ओवरकिल लगता है, हमारे पास निश्चित रूप से 65535 पता करने योग्य आईओ पोर्ट नहीं हैं Arduino पर :) तो हम इसे केवल मनोरंजन के लिए एक बाइट में बदलते हैं। हम इसे बाद में #define पर बदल देंगे, लेकिन बहुत बड़े वैरिएबल प्रकारों के उपयोग के प्रभाव को दिखाने के लिए।

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 बाइट्स की उम्मीद करूँगा RAM, लेकिन ठीक है। इतना नहीं है, लेकिन बचाया हर बाइट अच्छा है।

चरण 2: परिवर्तन से अधिक चर में जब यह समझ में आता है। उदाहरण के लिए, एलईडी बाइट की आवश्यकता नहीं है, पिन खुद को अनसोल्ड नहीं करेगा।

#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 देरी में बदल देता हूं तो यह अंतरिक्ष को बचाएगा, लेकिन मुझे एलईडी पिन के मूल्य का पता लगाना होगा और इसे उल्टा करना होगा। हम digitalRead () के साथ ऐसा कर सकते हैं, लेकिन क्या यह अंतरिक्ष को बचाएगा?

#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 कम लाइनें बनाता है।

इसके अलावा कम होने पर एक और सामान्य टिप। स्ट्रिंग वर्ग का उपयोग न करें। यह बहुत बड़ा है, चर सरणियों, strcpy (), strcmp () से निपटना सीखें। यदि आपके पास कुछ बुनियादी स्ट्रिंग ऑपरेशन हैं, तो स्ट्रिंग क्लास का उपयोग ज्यादातर फ्लैश और रैम दोनों पर केवल अंतरिक्ष बर्बाद कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.