2014-09-29 3 views
5

मैं क्यूईएमयू का उपयोग कर स्पार्क वर्चुअल मशीन पर आरटीईएमएस (एक वास्तविक समय ओएस) एप्लिकेशन चलाने की कोशिश कर रहा था। मैं लगभग वहां हूं और मैंने इसे घंटों पहले काम किया है। लेकिन कुछ प्रिंटों को हटाने के बाद यह काम नहीं कर रहा है और बाद में मैंने पाया कि यह हटाए गए प्रिंटों की वजह से नहीं है। डेटा आरटीईएमएस छवि और क्यूईएमयू इम्यूलेशन मॉडल के बीच सही ढंग से पारित नहीं किया जा रहा है। (मैं क्यूईएमयू संस्करण 1.5.50 और क्यूईएमयू संस्करण 2.0.0 से उधार लिया गया lan9118.c मॉडल के साथ काम कर रहा हूं। मैंने थोड़ा lan9118 संशोधित किया।)
QEMU मॉडल में, स्मृति क्षेत्र ऑप्स के रूप मेंएप्लिकेशन से क्यूमू में पास किए गए सीपीयू लिखने का मूल्य अजीब है

struct MemoryRegionOps { 
    /* Read from the memory region. @addr is relative to @mr; @size is 
    * in bytes. */ 
    uint64_t (*read)(void *opaque, 
        hwaddr addr, 
        unsigned size); 
    /* Write to the memory region. @addr is relative to @mr; @size is 
    * in bytes. */ 
    void (*write)(void *opaque, 
        hwaddr addr, 
        uint64_t data, 
        unsigned size); 
... 
} 

और RTEMS आवेदन में परिभाषित कर रहे हैं, मैं

 *TX_FIFO_PORT = cmdA; 
     *TX_FIFO_PORT = cmdB; 

जहां TX_FIFO_PORT नीचे के रूप में परिभाषित किया गया है जैसे डिवाइस के लिए लिखें।

#define TX_FIFO_PORT     (volatile ulong *)(SMSC9118_BASE + 0x20) 

लेकिन जब मैं लिख सकते हैं, उदाहरण के लिए,

cmdA : 0x2a300200 and cmdB : 0x2a002a00, 

मूल्यों मैं उम्मीद कर रहे हैं

cmdA : 0x0002302a and cmdB : 0x002a002a. (Just endian converted values) 

लेकिन मूल्यों मैं लिखने समारोह में देखना (QEMU के प्रवेश द्वार)

हैं
cmdA : 0x02000200 and cmdB : 0x2a002a00 respectively. 

मनाए गए मूल्य एच एवी एंडियन परिवर्तित नहीं किया गया है और यहां तक ​​कि पहला मान अलग है (कम 16 बिट दोहराया गया)। समस्या क्या हो सकती है?
किसी भी संकेत की गहराई से सराहना की जाएगी।

+0

यदि आप असंबद्ध कार्यक्षमता को जोड़ते/हटाते हैं तो डेटा अचानक दूषित हो जाता है, तो आपके पास शायद एक स्टैक ओवरफ़्लो हो। – Lundin

+0

क्यूईएमयू में, प्रत्येक डिवाइस मॉडल लिखने और पढ़ने का कार्य प्रदान करता है, यह भी निर्दिष्ट करता है कि शब्द को अंतहीनता के बारे में डिवाइस से/कैसे स्थानांतरित किया जाना चाहिए। यह नीचे की तरह निर्दिष्ट है।'स्थिर स्थिरांक MemoryRegionOps lan9118_mem_ops = { .read = lan9118_readl, .write = lan9118_writel, .endianness = DEVICE_NATIVE_ENDIAN, };' –

उत्तर

0

आश्चर्यजनक रूप से मैंने डिवाइस पर लिखने से पहले आरटीईएमएस में सेमीडीए और सेमीडीबी के लिए एंडियन रूपांतरण को टिप्पणी करके इसे ठीक किया। (एंडियन रूपांतरण के साथ यह ठीक था .. मुझे नहीं पता) तो यह 'लगभग' काम कर रहा है। वैसे भी, यहां क्यूईएमयू प्रोसेसर और डीवस में सीपीयू लिखने/पढ़ने के डेटा को निकालने के बारे में एक युक्ति है।
क्यूईएमयू में, प्रत्येक डिवाइस मॉडल लिखने और पढ़ने का कार्य प्रदान करता है, यह भी निर्दिष्ट करता है कि शब्द को अंतहीनता के बारे में डिवाइस से/कैसे स्थानांतरित किया जाना चाहिए। यह नीचे की तरह निर्दिष्ट है।

static const MemoryRegionOps lan9118_mem_ops = { 
    .read = lan9118_readl, 
    .write = lan9118_writel, 
    .endianness = DEVICE_NATIVE_ENDIAN, 
}; 

यहाँ मैं [email protected] मेलिंग सूची से पीटर Meydell से प्राप्त ईमेल से प्रति है।

------------------------

यह वही स्मृति क्षेत्र के लिए MemoryRegionOps struct करने के लिए अपने .endianness फ़ील्ड सेट करता है पर निर्भर करता है। DEVICE_NATIVE_ENDIAN का अर्थ है कि डिवाइस अतिथि सीपीयू के मूल अंतहीनता [*] के समान मूल्यों को देखता है, इसलिए यदि अतिथि 0x12345678 का 32 बिट लिखता है तो यह लेखन कार्य के तर्क 0x12345678 के रूप में दिखाई देता है। DEVICE_BIG_ENDIAN का अर्थ है कि यदि सीपीयू थोड़ा एंडियन है तो शब्द बाइटवॉप्ड होगा। DEVICE_LITTLE_ENDIAN का अर्थ है कि यदि सीपीयू बड़ा एंडियन है तो शब्द बाइटवॉप्ड होगा। उत्तरार्द्ध उन उपकरणों या बसों के लिए उपयोगी हैं जिनके पास विशिष्ट अंतराल है जो सीपीयू के समान नहीं है (उदाहरण के लिए पीसीआई हमेशा छोटा अंत होता है)।

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