2011-05-31 17 views
5

मैं एम्बेडेड सिस्टम के लिए नया हूँ और अधिक जानना चाहते हैं,एम्बेडेड सिस्टम कार्यों शीर्षक

मैं वर्तमान में एक हाथ एम्बेडेड सिस्टम के लिए पदचिह्न पर संबंध के साथ एक सॉफ्टवेयर के अनुकूलन रहा हूँ, और सोच रहे हैं, हेडर फाइल जो आप शामिल आपकी स्रोत फाइलों में। वे कहां रखे जाते हैं?

अभी मैं एआरएम हार्डवेयर प्लेटफ़ॉर्म अनुकरण करने के लिए एक सॉफ्टवेयर (ओवीपी) का उपयोग कर रहा हूं लेकिन असली हार्डवेयर में, आपको हेडर फ़ाइलों को कहीं और सही रखना होगा? जीसीसी में एचडी पर मानक पुस्तकालय है। क्या हमें इस पुस्तकालय को एम्बेडेड मशीन में भी डालना है? अंतरिक्ष सीमित है! और पुस्तकालय के आकार को कम करने का कोई तरीका है? धन्यवाद!

उदाहरण

#include <stdio.h>

#include <stdlib.h>

मैं पार संकलक हाथ-योगिनी-जीसीसी का उपयोग कर रहा

बेस्ट सादर

श्री Gigu

+0

वे पुस्तकालय नहीं हैं। –

+0

वे क्या हैं? – MrGigu

+0

वे हेडर फाइलें हैं। –

उत्तर

11

आपके पास संकलित निष्पादन योग्य कोड के बारे में कुछ मौलिक गलतफहमी हैं। निम्नलिखित एम्बेडेड और डेस्कटॉप सिस्टम पर लागू होता है।

शीर्षलेख फ़ाइलें किसी अन्य की तरह स्रोत फ़ाइल से अधिक नहीं हैं। अंतर यह है कि उन्हें सीधे संकलित करने के बजाय प्री-प्रोसेसर द्वारा संकलन इकाई में डाला जाता है। इसके अलावा ज्यादातर मामलों में उनमें केवल घोषणात्मक बयान होते हैं, और आम तौर पर निष्पादन योग्य निर्देशों या संग्रहीत डेटा के अर्थ में जेनरेट कोड में योगदान नहीं करते हैं।

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

एक हेडर फ़ाइल लाइब्रेरी जैसी ही नहीं है। यह केवल (आमतौर पर) लाइब्रेरी सामग्री की घोषणा (फ़ंक्शन प्रोटोटाइप और अन्य प्रतीक घोषणाएं जैसे कि स्थिरांक, डेटा, मैक्रोज़, अंकन)। लाइब्रेरी संयुक्त संग्रह में संग्रहीत पूर्व-संकलित/एकत्रित ऑब्जेक्ट कोड का रूप लेती है। यह आपके स्वयं के स्रोत के संकलन से उत्पन्न ऑब्जेक्ट कोड के साथ आवश्यक लाइब्रेरी कोड को गठबंधन करने के लिए लिंकर का काम है। यह इस लिंक किए गए निष्पादन योग्य है जिसे लक्ष्य पर संग्रहीत और निष्पादित किया गया है, मूल स्रोत कोड नहीं।

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

जब लाइब्रेरी कोड लिंक किया जाता है, तो केवल उन लाइब्रेरी ऑब्जेक्ट कोड घटकों को एप्लिकेशन कोड में संदर्भों को हल करने के लिए आवश्यक होते हैं, पूरी लाइब्रेरी नहीं (जब तक कि संपूर्ण लाइब्रेरी केवल एक ऑब्जेक्ट फ़ाइल से बना न हो)।

+0

स्पष्टीकरण के लिए धन्यवाद! अगर मैं इसके बारे में अधिक जानकारी प्राप्त करना चाहता हूं, तो मुझे क्या खोजना चाहिए? लिंकर्स और कंपाइलर्स? – MrGigu

+0

क्या मैं यहां सही हूं, अगर मैं में printf फ़ंक्शन का उपयोग करता हूं, तो केवल वह फ़ंक्शन निष्पादन योग्य elf फ़ाइल में संकलित किया जाएगा? तो अगर मुझे अन्य लाइब्रेरी मिलती हैं जिनमें एक छोटा प्रिंटफ फ़ंक्शन होता है (जैसे कि दूसरे उत्तर में आहार libc) मैं सी फ़ाइल को उसी फ़ोल्डर में कॉपी कर सकता हूं और इसे <> के बजाय "" में शामिल कर सकता हूं? – MrGigu

+0

यदि आप 'printf() 'ऑब्जेक्ट फ़ाइल का उपयोग करते हैं जिसमें उसका कार्यान्वयन होता है और इसमें कोई और निर्भरता शामिल होती है। पुस्तकालय की ग्रैन्युलरिटी और एकजुटता के आधार पर, इसमें ऐसी सामग्री शामिल हो सकती है जिनकी आपको आवश्यकता नहीं हो सकती है। कुछ मामलों में सी रनटाइम एक साझा लाइब्रेरी या डीएलएल हो सकता है (जैसा कि विंडोज/वीसी ++ और एमएनजीडब्लू में एमएसवीसीआरटी.डीएलएल के मामले में है), इस मामले में इसका निष्पादन योग्य आकार पर न्यूनतम प्रभाव होगा लेकिन अभी भी रन-टाइम होगा स्मृति पदचिह्न। – Clifford

1

पुस्तकालय indee करता है डी को उस छवि में शामिल करना होगा जिसे एम्बेडेड सिस्टम की मेमोरी में जला दिया गया है। आम तौर पर आप लिंकर को अप्रयुक्त कार्यों को बाहर करने के लिए कहते हैं, जो स्मृति को संरक्षित करने के लिए एक लंबा रास्ता तय करता है। लेकिन यह स्मृति वह स्मृति है जो आपका प्रोग्राम फ्लैश में लेती है या जो भी आप गैर-अस्थिर कोड संग्रहण के लिए उपयोग करते हैं। यह कुछ भी नहीं कहता है कि आपका प्रोग्राम रनटाइम पर कितना रैम लेता है। आप अंतरिक्ष के लिए अनुकूलित करने के लिए अपने कंपाइलर को भी बता सकते हैं, और विभिन्न रनटाइम पुस्तकालयों का भी उपयोग कर सकते हैं - विक्रेता द्वारा प्रदान किए गए लोग अक्सर जितना तेज़ या छोटा नहीं हो सकते हैं।

+0

मेरा सॉफ़्टवेयर ओवर-ओ 1 पर कोई ऑप्टिमाइज़ेशन डालने पर काम करना बंद कर देता है, सॉफ़्टवेयर (एक हाइपरवाइजर) संदर्भ स्विच और इंटरप्ट्स के बहुत से हैंडल करता है (इनलाइन के साथ असेंबलर), मुझे लगता है कि ऑप्टिमाइज़ेशन मेमोरी स्थानों आदि के साथ गड़बड़ करता है – MrGigu

+0

मैं काफी रनटाइम करता हूं कि आप विभिन्न रनटाइम लाइब्रेरीज़ का उपयोग कैसे करते हैं, क्या यह है कि आपको मेकफ़ाइल में इंस्टॉल करना और निर्दिष्ट करना है? मैं arm-elf-gcc का उपयोग करता हूं और यह अनुमान लगाता है कि यह अपनी मानक लाइब्रेरी का उपयोग करता है? इसके अलावा मैं विंडोज 7 का उपयोग करता हूं। – MrGigu

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