2014-07-09 9 views
5

के साथ arduino पुस्तकालयों का उपयोग कैसे करूं मैं एवीआर विकास के लिए ग्रहण केप्लर का उपयोग कर रहा हूं। मेरे पास जो कोड है वह सी (ओपन सोर्स) है, और मैंने इसे समायोजित कर लिया है ताकि यह पूरी तरह से चल सके। मेरा लक्ष्य एक अरुडेनो मेगा2560 के रूप में एक एटीमेगा 2560 है। Arduino बोर्ड का उपयोग हार्डवेयर सुविधा के लिए सख्ती से है; हम अधिकांश मूल arduino mega2560 घटकों के साथ एक कस्टम बोर्ड होने के लिए हार्डवेयर विकसित कर रहे हैं।मैं मानक सी कोड

मुझे इस परियोजना के साथ कई पुस्तकालयों का उपयोग करने की आवश्यकता है जो केवल एक ई-पेपर स्क्रीन (देखे गए स्टूडियो से) और नॉर्डिक के बीएलई एनआरएफ 8001 के लिए अरबीनो पुस्तकालयों के रूप में उपलब्ध हैं।

यदि मैं ग्रहण में प्लगइन का उपयोग कर एक नया आर्डिनो प्रोजेक्ट बनाता हूं, तो मैं पूरी तरह से आर्डिनो पुस्तकालयों के परीक्षणों को बना और चला सकता हूं।

जब मैं एक साथ 2 कोड अड्डों को मर्ज करने का प्रयास करता हूं, तो मैं अतिरिक्त आर्डिनो पुस्तकालयों में फ़ंक्शंस को कॉल नहीं कर सकता - अगर मैं उन्हें कॉल करता हूं तो संकलक एक लिंकिंग त्रुटि फेंकता है।

Building target: Virgin2ManualArdInsert.elf 
Invoking: AVR C Linker 
avr-gcc -Wl,-Map,Virgin2ManualArdInsert.map -mmcu=atmega2560 -o "Virgin2ManualArdInsert.elf"   ./avr/adc.o ./avr/eeprom.o ./avr/lcd_and_input.o ./avr/main.o ./avr/strings.o ./avr/unimplemented.o ./avr/usart.o ./aes.o ./baseconv.o ./bignum256.o ./ecdsa.o ./endian.o ./fft.o ./fix16.o ./hash.o ./hmac_sha512.o ./messages.pb.o ./p2sh_addr_gen.o ./pb_decode.o ./pb_encode.o ./pbkdf2.o ./prandom.o ./ripemd160.o ./sha256.o ./statistics.o ./stream_comm.o ./test_helpers.o ./transaction.o ./wallet.o ./xex.o 
./avr/main.o: In function `main': 
main.c:(.text.startup.main+0xc): undefined reference to `writeEink' 
collect2: error: ld returned 1 exit status 
makefile:53: recipe for target 'Virgin2ManualArdInsert.elf' failed 
make: *** [Virgin2ManualArdInsert.elf] Error 1 

एक परीक्षण के रूप में, मैं सिर्फ main.c से eInk.cpp में कॉल "प्रदर्शित करने के लिए लिखने" एक बुनियादी कॉल करने के लिए कोशिश कर रहा हूँ:

extern "C"{ 
void writeEink() 
{ 

    EPAPER.begin(EPD_SIZE);        // setup epaper, size 
    EPAPER.setDirection(DIRNORMAL);      // set display direction 

    eSD.begin(EPD_SIZE); 
    GT20L16.begin(); 

// int timer1 = millis(); 
    EPAPER.drawString("testing", 10, 10); 
    EPAPER.drawNumber(12345, 60, 40); 
    EPAPER.drawFloat(-1.25, 2, 80, 65); 
    EPAPER.display();         // use only once 

} 

arduino से बनाया गया एक स्थिर पुस्तकालय है यहां जाने का रास्ता है? मैंने कोशिश की है (हालांकि ऐसा लगता है कि अधिकांश प्रक्रियाएं पुरानी हैं) और पुस्तकालय लिंक/कॉल नहीं करना चाहते हैं।

मेरे सी कोड में सी ++/Arduino कॉल सहित सही प्रक्रिया क्या है? मैंने बाहरी "सी" {फ़ंक्शन()} का उपयोग करने का प्रयास किया है; मेरी .cpp फ़ाइलों और .h फ़ाइलों में लेकिन कोई उपयोग नहीं है।

किसी भी मदद या पॉइंटर्स के लिए धन्यवाद जहां मैं इसे अपने लिए समझ सकता हूं।

+1

_ "कंपाइलर एक लिंकिंग त्रुटि फेंकता है" _ - यह त्रुटि क्या होगी? –

+0

आप gcc विकल्प -Wl का उपयोग कर लिंक त्रुटियों पर विवरणों की जांच कर सकते हैं, - verbose – Mansuro

+0

स्पष्टता के लिए कोड स्निपेट जोड़ा गया। – ThesQuid

उत्तर

0

आप फ़ाइलों को * .CPP में बस नामित करके सी ++ के रूप में अपने सी कोड को संकलित करने का प्रयास कर सकते हैं, लेकिन संभावना है कि आपको इसे C++ कोड के रूप में संकलित करने के लिए अपने कोड को संशोधित करना होगा। ऐसी चीजें हैं जिन्हें सी के लिए अनुमति है, लेकिन सी ++ के लिए नहीं (जैसे कॉलिंग फ़ंक्शंस जिन्हें घोषित नहीं किया जाता है)।

अन्य समाधान सी ++ के आसपास कार्यों रैपर है कि आप सी ++ के खिलाफ सी के दो सीमाओं पर विचार करने के लिए सी से उपयोग करने के लिए आपके पास चाहते wirte के लिए है:

  1. सी उन्मुख वस्तु नहीं है
  2. सी

    : कार्यों

Serial.print() के लिए यह उदाहरण दिखाता है कि कैसे आप एक आवरण के साथ इस संभाल कर सकते हैं की अधिक भार का समर्थन नहीं करता

extern "C" void SerialPrintInteger(int value) 
{ 
    Serial.print(value); 
} 

इस उदाहरण में आप SerialPrintFloat() की तरह समान कार्य लिखते थे, SerialPrintString() आदि extern "C" उपसर्ग संकलक बताता है एक तरीका है कि यह सी

0

त्रुटि आप प्रतिसाद नहीं ऊपर प्राप्त से प्रतिदेय बनाता में समारोह बनाने के लिए एक कंपाइलर त्रुटि नहीं है, यह एक लिंकर त्रुटि है। मैंने Arduino विकास के लिए ग्रहण का उपयोग नहीं किया है, मैं बस Arduino आईडीई के साथ चिपक गया है, लेकिन मानक Arduino परियोजनाओं की उम्मीद है कि आपका सभी कोड एक स्रोत फ़ाइल में होना चाहिए, जो इसे संकलित करता है और फिर Arduino पुस्तकालयों के साथ लिंक करता है। Arduino कार्यक्रमों में सी/यूनिक्स-शैली "मुख्य" फ़ंक्शन नहीं है, मानक फ़ंक्शन "सेटअप" और "लूप" हैं।"

मैं Arduino उदाहरण कार्यक्रम, उदाहरण के लिए झपकी, और कंसोल लॉग देख ग्रहण संकलित करता है तथा कार्यक्रम लिंक के रूप में से एक के लिए वापस जा रहा की सिफारिश यहाँ क्या हो रहा है यह है:।

  1. C/C++ संकलक एक ऑब्जेक्ट फ़ाइल में सेटअप(), लूप(), और आपके द्वारा बनाए गए किसी अन्य फ़ंक्शन सहित आपके स्रोत कोड को संकलित करता है।
  2. लिंकर इस एकल ऑब्जेक्ट फ़ाइल को Arduino रनटाइम और आपके द्वारा निर्दिष्ट किसी भी Arduino लाइब्रेरी से लिंक करता है। इसका आउटपुट प्रोग्राम की एक छवि है, ऊपर दिए गए उदाहरण में यह 'वर्जिन 2ManualArdInsert.elf' बनाने की कोशिश कर रहा है।
  3. अपलोडर (शायद avrdude) इस छवि को आपके Arduino में लोड करता है और इसे रीसेट करता है।
  4. Arduino रीसेट से बाहर आता है और आपका नया कोड चलाता है।

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

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

सी बनाम सी ++ स्रोत कोड के रूप में, आप आम तौर पर एक सी फ़ंक्शन को C++ स्रोत फ़ाइल में छोड़ सकते हैं और इसे संकलित कर सकते हैं। कुछ मतभेद हैं, लेकिन इस तरह आपको "सी" लिंकेज या उस सीलनेस के बारे में चिंता करने की आवश्यकता नहीं है।

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