2012-06-08 26 views
5

पहले कुछ पृष्ठभूमि। एक छोटे से छोटे में, डेटा को रजिस्ट्रार में, Sram में, eeprom में या प्रोग्राम स्पेस में संग्रहीत किया जा सकता है। रजिस्टर और स्राम अस्थिर भंडारण हैं जबकि eeprom और प्रोग्राम स्पेस नहीं हैं। (यानी:। डेटा ठहरने जब संचालित नहीं)एक छोटे से छोटे में, माइक्रोकंट्रोलर संचालित होने पर प्रारंभिक रूप से डेटा को संग्रहीत करने का अर्थ कैसा होता है?

जब सी में प्रोग्रामिंग (AVR-जीसीसी पुस्तकालयों का उपयोग), एक ठेठ कोड लग सकता है जैसे:

avr-gcc -g -mmcu=attiny44 -o test.elf test.c 
:

#define F_CPU 8000000UL 
#include <inttypes.h> 
#include <avr/io.h> 
#include <avr/pgmspace.h> 
#include <avr/eeprom.h> 

//This data is put in the eeprom 
const uint8_t dat_eeprom EEMEM= 0xab; 
//This data is put in the program space 
const uint8_t dat_pgm_space PROGMEM= 0xcd; 
//This data is stored in the sram 
uint8_t dat_sram = 0xef; 

int main(){ 
    while(1){ 
    ;; 
    } 
} 

साथ संकलन

और .elf से एक इंटेल हेक्स निकालने:

avr-objcopy -j .text -j .data -O ihex test.elf test.hex 

हम निम्नलिखित test.hex मिलती है:

:1000000011C023C022C021C020C01FC01EC01DC0FF 
:100010001CC01BC01AC019C018C017C016C015C01C 
:1000200014C0CD0011241FBECFE5D1E0DEBFCDBF8F 
:1000300010E0A0E6B0E0EAE5F0E002C005900D9225 
:10004000A236B107D9F702D006C0DACFCF93DF933B 
:0A005000CDB7DEB7FFCFF894FFCF65 
:02005A00EF00B5 
:00000001FF 

और dissassembly निम्नलिखित:

00000000 <.sec1>: 
0: 11 c0   rjmp .+34  ; 0x24 
     <...skipped interrupt vector table...> 
20: 14 c0   rjmp .+40  ; 0x4a 
22: cd 00   .word 0x00cd ; this is our data stored in the program mem. 
24: 11 24   eor r1, r1 
26: 1f be   out 0x3f, r1 ; 63 
28: cf e5   ldi r28, 0x5F ; 95 
2a: d1 e0   ldi r29, 0x01 ; 1 
2c: de bf   out 0x3e, r29 ; 62 
2e: cd bf   out 0x3d, r28 ; 61 
30: 10 e0   ldi r17, 0x00 ; 0 
32: a0 e6   ldi r26, 0x60 ; X register low byte ; address of dest. in 
34: b0 e0   ldi r27, 0x00 ; X register high byte; sram 
36: ea e5   ldi r30, 0x5A ; z register low byte ; address of data in 
38: f0 e0   ldi r31, 0x00 ; z register high byte; program memory 
3a: 02 c0   rjmp .+4   ; 0x40 
3c: 05 90   lpm r0, Z+ 
3e: 0d 92   st X+, r0 
40: a2 36   cpi r26, 0x62 ; 98 
42: b1 07   cpc r27, r17 
44: d9 f7   brne .-10  ; 0x3c 
      <...skipped rcall to main...> 
5a: ef 00   .word 0x00ef ; this is our data that 
             should be stored in the sram. 

तो कैसे है डेटा (0xef) है कि हम SRAM में डालने के लिए प्रारंभ चाहते थे?
उत्तर मुख्य से पहले एक नियमित के माध्यम से है।

प्रोग्राम स्पेस में डेटा 0x5a पर संग्रहीत किया जाना चाहिए। यह SRAM में निम्नलिखित तरीके से डाल दिया है:

  1. एक्स रजिस्टर उच्च और निम्न बाइट जहाँ हम SRAM में डेटा रखना चाहते हैं का पता करने के लिए सेट कर रहे हैं (0x60) ध्यान दें कि यह पता नहीं है। प्रोग्राम मेमोरी में लेकिन डेटा मेमोरी में।
  2. z रजिस्टर के लिए एक ही है, लेकिन जहां डाटा (0x5a) कार्यक्रम अंतरिक्ष में है के पते के साथ
  3. पता z रजिस्टर में संग्रहीत पर कार्यक्रम स्मृति की सामग्री को LPM के माध्यम से रजिस्टर r0 में लोड किया जाता opcode। ध्यान दें कि ज़ेड रजिस्टर मान को क्रमशः (डेटा, यहां कोई भी नहीं) पर इंगित करने के लिए बढ़ाया गया है ताकि अगले डेटा को श्रम में लोड किया जा सके।
  4. आर 0 में डेटा को एक्स रजिस्टर में संग्रहीत पते पर संग्रहित किया जाता है।
  5. तब तक दोहराएं जब तक कि स्राम में होने वाले सभी डेटा को प्रारंभ नहीं किया गया हो।

यह मुख्य रूप से आरसीएल से पहले होता है।

क्या कोई बेहतर/स्पष्ट उत्तर है?

उत्तर

-1

यदि आप एसआरएएम में डेटा चाहते हैं, तो आपके कार्यक्रम को इसे वहां रखना होगा।

वहां, यह आपके लिए किया गया।

+0

हाँ, अब यह मेरे लिए स्पष्ट है, लेकिन मैंने थोड़ी देर बिताई कि यह आंकड़ा क्यों है कि मैं उस डेटा को शेम में क्यों चाहता था .hex के अंत में था। उम्मीद है कि यह किसी की मदद करता है। – user1443332

1

ठीक है, gnu टूल्स दुनिया में और निश्चित रूप से अन्य टूल्स के साथ समान तरीके।

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