2012-06-08 12 views
5

İlk önce biraz arka plan. Küçük bir avda, veriler sramda, eepromda veya program alanında saklanabilir. Kayıt ve sram, eeprom ve program alanı olmadığında uçucu depolamadır.Bir avr minikte, mikro kontrolcü açıldığında veriler sram'da nasıl depolanacak?

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

#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){ 
    ;; 
    } 
} 

: (yani:. Powered değil veri kalmak) gibi

(avr-gcc kütüphaneleri kullanılarak) c programlama, tipik bir kod görünebilir

Ve .elf gelen bir Intel Hex ayıklanması: aşağıdaki test.hex olsun

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

:

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

Ve dissassembly aşağıdadır:

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. 

Yani nasıl verilerin (0xef) biz başlatıldı SRAM koymak istediğini?
Yanıt, ana işlemden önce bir rutin yoluyla gerçekleştirilir. SRAM saklanmalıdır

veriler program alanı, adres 0x5A yer almaktadır. Bu şu şekilde SRAM konur:

  1. x (0x60) biz SRAM veri koymak istediğiniz yerin adresine ayarlanır yüksek ve düşük byte kayıt bu adres olmadığını unutmayın. Program hafızasında ama veri hafızasında.
  2. Z kaydı için de aynıdır, ancak verilerin program boşluğunda (0x5a) olduğu adresle (0x5a)
  3. , z kaydında saklanan adresteki program belleğinin içeriği, lpm üzerinden r0 registerına yüklenir. işlemkodu. Z register değerinin, sram'a yüklenecek (nihai, burada yok) sonraki verileri işaret edecek şekilde artırıldığını unutmayın.
  4. r0'daki veriler, daha sonra x kaydında saklanan adreste sram içinde saklanır.
  5. Sram içinde olması gereken tüm veriler başlatılıncaya kadar tekrarlayın.

Bu ana kadar bir rcall önce olur.

daha iyi/daha net bir cevabı var mı?

cevap

-1

Eğer size SRAM veri istiyorsanız, programı var koymak zorundadır.

Bunu sizin için yaptınız.

+0

Evet, şimdi benim için açık, ama sram'da istediğim verilerin neden .hex'in sonunda olduğunu anlamak için biraz zaman harcadım. Umarım birisine yardım eder. – user1443332

1

Sağ, gnu araçlar dünyada ve kesinlikle benzer yollarla diğer araçlarla.

bağlayıcı .text, .data, .bss veri verildi ve ikili yerleştirmek için vardır. flaş tabanlı bir sistem için, avr'a özgü hiçbir şey, tüm platformlar için aynı değildir, tüm geçici olmayan bilgiler flaş üzerinde olmalıdır. Linker betiği, link vericiye .data segmentinin iki evi olduğunu, bir evin de .text ile ve flaşta başka bir şeyle tarandığını ve ardından ram adres alanında bir ev olduğunu söyler. Linker komut dosyasını, linker'ın boot kodunuzdaki harici değişkenlere (ana çağrı yapan asm) gireceği bazı anahtar kelimelerle donatırsınız.Bu kod, R'yi kopyalamak için .data'yı kopyalamak ve ana dili çağırmadan önce sıfırlamak için .bss'yi kullanır. Böylece C dili varsayımları (birim değişkenler sıfırdır ve başlatılan değişkenler kodunuzun başlattığı değişkenlerdir). Eğer herhangi bir değişkenin anaden önce başlatılmış olduğunu varsaymak için kodunuzu yazarsanız, o zaman bunlardan herhangi birini yapmak zorunda kalmazsınız, ana giriş kodunuz basitçe yığın işaretçisini ve dalı ana değere ayarlayabilir.

İlgili konular