2013-02-02 20 views
11

पर मेमोरी सीमाएं मैंने हाल ही में Arduino Uno खरीदा है, और अब मैं इसके साथ थोड़ा सा प्रयोग कर रहा हूं। मेरे पास कुछ 18 बी 20 सेंसर और एक ईएनसी 28 जे 60 नेटवर्क मॉड्यूल है जो इसके साथ जुड़ा हुआ है, फिर मैं एक ब्राउज़र से कनेक्ट करने की अनुमति देने के लिए एक स्केच बना रहा हूं और तापमान को एक साधारण वेब पेज या JSON के रूप में पढ़ता हूं। कोड है कि वेब पृष्ठों बनाता है इस तरह दिखता है:Arduino

client.print("Inne: "); 
client.print(tempin); 
client.println("<br />"); 
client.print("Ute: "); 
client.print(tempout); 
client.print("<br /><br />"); 
client.println(millis()/1000); 
// client.print("<a href=\"/json\">j</a>"); 

अजीब बात है: अगर मैं अंतिम पंक्ति uncomment, स्केच ठीक संकलित है, ठीक है अपलोड कर देती है, लेकिन मैं बोर्ड से कनेक्ट करने के लिए नहीं मिल सकता है। वही बात होती है यदि मैं कुछ अन्य प्रिंटआउट में कुछ और अक्षर जोड़ता हूं। इस प्रकार, यह मुझे लगता है जैसे कि मैं किसी प्रकार की मेमोरी सीमा में चल रहा हूं (स्केच का कुल आकार लगभग 15   केबी है, और कोड में कहीं और कुछ अन्य तारों का उपयोग किया जाता है - और हाँ मुझे पता है, मैं अस्थायी स्टोर करने के लिए एक सरणी का उपयोग करने के लिए इसे फिर से लिखें, मैंने अभी एक उदाहरण से कुछ कोड चुरा लिया है)।

क्या कोई सीमा है कि मैं Arduino में तारों को स्टोर करने के लिए कितनी मेमोरी का उपयोग कर सकता हूं और क्या इसके आसपास जाने का कोई तरीका है? (GUI बनाम 1.0.1 Debian पीसी पर जीसीसी-एवीआर 4.3.5 और AVR Libc 1.6.8) का उपयोग कर।

उत्तर

17

रैम अपेक्षाकृत छोटा है, क्योंकि यूएनओ का 328 केवल 2K है। आप बस राम से बाहर हो सकते हैं। मैंने सीखा कि जब यह खत्म हो जाता है, तो यह सिर्फ वहां बैठता है।

मैं फ्री लाइम प्राप्त करने के लिए इस लाइब्रेरी से readme पढ़ने का सुझाव देता हूं। यह उल्लेख करता है कि ".print" रैम और रोम दोनों का उपभोग कैसे कर सकता है।

मैं हमेशा अब (Arduino आईडीई 1.0 के लिए। +) का उपयोग

Serial.print(F("HELLO")); 

बनाम

Serial.print("HELLO"); 

के रूप में यह रैम बचाता है, और इस lcd.print के लिए सच होना चाहिए। जहां मैं हमेशा

Serial.println(freeMemory(), DEC); // print how much RAM is available. 

कोड की शुरुआत में, और ध्यान दें। यह नोट करते हुए कि वास्तविक कोड चलाने और इसके सबराउटिन में पुनः शाप देने के लिए कमरे की आवश्यकता है।

आईडीई के 1.0.0 से पहले लाइब्रेरी getPSTR()) प्रदान करता है।

आईडीई 1.0.3 अब संकलन के अंत में रैम के अपेक्षित उपयोग को प्रदर्शित करना शुरू कर देता है। हालांकि, मुझे लगता है कि यह अक्सर छोटा होता है, क्योंकि यह केवल एक अनुमान है।


मैं भी रूप में यह एक पुस्तकालय JSON का समर्थन करता है कि है कि आप Webduino को देखने की सलाह देते हैं। इसके उदाहरण जाने के लिए बहुत जल्दी हैं। हालांकि यह सीधे ENC28J60 का समर्थन नहीं करता है।

+0

"बस एक तरह से वहाँ sist" मिल हाँ, बिल्कुल के लिए निम्न कोड का उपयोग करें। धन्यवाद! मैं आपको सलाह दूंगा – MortenSickel

+0

"एफ" चाल शानदार है और सीरियल प्रिंटिंग के साथ कई अजीब त्रुटियों को ठीक कर दिया है। – jjz

1

आप memoryFree नामक एक छोटी सी lib के साथ मेमोरी उपयोग की जांच कर सकते हैं।

जब राम छोड़ा जाता है, तो आप राम सीमा के बजाय धारावाहिक बफर सीमा को दबा सकते हैं। हां, तो आप (एक विंडोज़ मशीन पर C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino) HardwareSerial.cpp

में SERIAL_BUFFER_SIZE वृद्धि कर सकते हैं, तो

सावधान रहो, हालांकि, राम और धारावाहिक बफर दोनों SRAM पर संग्रहीत हैं।धारावाहिक बफर को बढ़ाने से आपके चर के लिए कम उपलब्ध स्मृति होगी।

arduino पर JSON के साथ खेलने के लिए aJson नामक एक बहुत अच्छा lib है।

+0

यह लड़का [हार्डवेयर सीरियल बफर] (http://www.hobbytronics.co.uk/arduino-serial-buffer-size) के बारे में और जानता है – mrv

0

इस फ़ंक्शन को जोड़ें और इसे सेटअप में और अब अपने लूप में यह सुनिश्चित करने के लिए कि RAM का उपयोग नहीं किया जा रहा है।

// Private function: from http://arduino.cc/playground/Code/AvailableMemory 
int freeRam() { 
    extern int __heap_start, *__brkval; 
    int v; 
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
} 

आप एक प्रिंट के अंदर उदाहरण के लिए कॉल करने के लिए की जरूरत है: Serial.println (freeRam());

2

मैं नि: शुल्क उपलब्ध रैम

int getFreeRam() 
{ 
    extern int __heap_start, *__brkval; 
    int v; 

    v = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 

    Serial.print("Free RAM = "); 
    Serial.println(v, DEC); 

    return v; 
} 

 संबंधित मुद्दे