2012-10-03 30 views
9

के लिए बूटलोडर मैं एमबीड से एलपीसी 1768 बोर्ड का उपयोग कर रहा हूं, (कॉर्टेक्स एम 3 सीपीयू के साथ) और मैं यहां कुछ हासिल करने की कोशिश कर रहा हूं, मुख्य रूप से एसडी कार्ड से उपयोगकर्ता एप्लिकेशन को अपग्रेड कर रहा हूं, मैं दो प्रोग्राम लिख रहा हूं, पहले बूटलोडर/नैनो गिरी, और उपयोगकर्ता-ऐप्लिकेशन (HelloWorld एक शुरुआत के लिए करना होगा):कॉर्टेक्स एम 3

  • बूटलोडर/0x00 पता रन पर नैनो गिरी, यह कुछ जांच कर और अंततः पर एसडी बाइनरी फ़ाइल हड़पने कार्ड
  • बूटलोडर/नैनो-कर्नेल इस बाइनरी को 0x9000 पते पर कॉपी करेगा (जिसे बाद में बदलना पड़ सकता है, लेकिन यह स्थान बूटलोडर/नैनो-कर्नेल द्वारा उपयोग नहीं किया जाता है, इसलिए ठीक होना चाहिए)
  • बूटलोडर 0x9000 + 4

एसडी कार्ड काम करने के लिए काफी आसान है, मुझे कूदने वाले हिस्से में समस्याएं हैं। कूदते फ़ंक्शन का कोड यहां दिया गया है।

void run(void) { 

    void (*user_code_entry)(void); 

    unsigned *p; 
    SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80); 

    // Load contents of second word of user flash - the reset handler address 
    // in the applications vector table 
    p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000 

    user_code_entry = (void (*)(void))p; 

    // Jump to user application 
    user_code_entry(); 

}

तो मैं तैयार की है (मैं Keil uvision4 उपयोग कर रहा हूँ) उपयोगकर्ता आवेदन 0x9000 शुरू पता बदलने। अगर मैं अपने बोर्ड (फ्लैशमैजिकटोल का उपयोग करके) प्रोग्राम करता हूं, और उसके बाद मैन्युअल रूप से फ्लैशमैजिकटोल का उपयोग कर 0x9004 (0x9000 + 4) पर जाता हूं, तो उपयोगकर्ता एप्लिकेशन चलाएगा, इसलिए मेरा मानना ​​है कि संकलन ठीक काम करता है इसलिए उपयोगकर्ता-ऐप 0x9000 पर चला सकता है।

लेकिन अगर मैं बूटलोडर/नैनो-कर्नेल चलाता हूं, तो यह उपयोगकर्ता-एप्लिकेशन पर नहीं जाता है और दुर्भाग्यवश, क्योंकि मैं डीबग नहीं कर सकता, मुझे यकीन नहीं है कि क्या हो रहा है ... मैंने भी कोशिश नहीं की है एसडी कॉपी भाग का उपयोग करें, इसलिए मैं बूटलोडर को मूल रूप से केवल 0x9004 पर कूदने के साथ प्रोग्राम करता हूं। मैं फिर उपयोगकर्ता अनुप्रयोग प्रोग्राम करता हूं जो 0x9000 पर बैठेगा। अगर मैं बोर्ड को रीबूट करता हूं, तो बूटलोडर चलता है लेकिन उपयोगकर्ता-ऐप पर नहीं जाता है। मैंने स्मृति की जांच की है, और ऐसा लगता है कि दोनों प्रोग्राम (बूटलोडर + उपयोगकर्ता-ऐप) सही और सही जगह पर हैं।

मुझे यकीन है कि मुझे यहां कुछ याद आ रहा है, क्या कोई निम्न स्तर वाला कोड मुझे देखना चाहिए? मैंने ऑनलाइन दस्तावेज़ों के टन पढ़े हैं, और उन उदाहरणों से जो मैंने पाया है, वे उपयोगकर्ता कोड पर उसी तरह कूद रहे हैं जैसा कि मैं करता हूं ... किसी भी मदद के लिए धन्यवाद।

+0

यह भी काफी अपने पीसी पर समान काम करना चाहिए, लेकिन आभासी पते, बजाय के साथ शारीरिक - यह कोशिश करते हैं और देखते हैं कि यह काम करता है, तो कोड कोइल – Ulterior

+1

पर ले जाएं कॉर्टेक्स एम 3 में कोई एमएमयू नहीं है, इसलिए कोई वर्चुअल एड्रेस नहीं है। –

उत्तर

8

कॉर्टेक्स एम 3 केवल थंब मोड में चलाया जा सकता है। इस प्रकार आपको हमेशा address +1 पर जाना होगा, अन्यथा यह एक गलती उत्पन्न करेगा।

बस कोशिश:

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

+0

विश्वास नहीं कर सकता कि यह था! बहुत बहुत धन्यवाद टर्बो जे :) – batmat

+3

मुझे एहसास है कि यह शायद काम करता है लेकिन यह समझ में नहीं आता है। कंपाइलर आपके लिए थंब निर्देश उत्पन्न करना चाहिए। मैं वही काम करता हूं जैसा आपने वहां किया था (कोई +1 नहीं) और ऐसा लगता है कि यह मेरे लिए काम करता है। क्या आपके पास 'arm-none-eabi-gcc' कंपाइलर' के लिए 'थंब' ध्वज सेट है? – nonsensickle

+0

धन्यवाद! यह मेरे लिए एक एम 4 पर भी काम किया। सबकुछ ठीक संकलित हुआ, डीबगर सभी कोड के माध्यम से ठीक चला गया, इस आईएआर डीबगर चेतावनी के एक अपवाद के साथ जो कोड के माध्यम से कदम उठाने के दौरान कूदने पर होता है: "एक्सपीएसआर का टी-बिट 0 है लेकिन 1 होना चाहिए। 1 में बदल गया ।" – tniles09

3

बस एनएक्सपी साइट पर AN10866 दस्तावेज़ पढ़ें। आप पीसी और ढेर सूचक लोड और फिर रीसेट बाधा पर पहुँचा:

__asm void boot_jump(uint32_t address){ 
    LDR SP, [R0]  ;Load new stack pointer address 
    LDR PC, [R0, #4] ;Load new program counter address 
} 

void execute_user_code(void) 
{ 
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */ 
    SCB->VTOR = USER_FLASH_START & 0x1FFFFF80; 

    boot_jump(USER_FLASH_START); 
} 
+0

मैं इनलाइन असेंबलर के बीच मतभेदों के तहत पेज 4-6 और 4-7 पर http://infocenter.arm.com/help/topic/com.arm.doc.dui0056d/DUI0056.pdf को भी जोड़ना चाहूंगा। और armasm "यह बताता है कि आप पीसी को मूल्यों को स्टोर नहीं कर सकते हैं। यह भी बताता है कि 'बीएक्स' निर्देश समर्थित नहीं है लेकिन मेरे पास कोड है जो वर्तमान में इनलाइन एएसएम में उपयोग कर रहा है जो काम करता है (हालांकि मैं इसे फिर से देख रहा हूं)। – nonsensickle

+0

मेरी पिछली टिप्पणी इनलाइन जॉइन सिंकलेयर की तरह इनलाइन असेंबली को संदर्भित करती है। ये एक अलग असेंबली कोड फ़ाइल में उपयोग करने के लिए सुरक्षित हैं, हालांकि, मेरे पास इनलाइन असेंबली में एक संस्करण था और यह भी ठीक काम करता था इसलिए मुझे यकीन नहीं है कि एआरएम की सिफारिशों को क्या करना है। – nonsensickle

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

  • कोई संबंधित समस्या नहीं^_^