Cortex M0 + Keil - Flash Memory Page'i Bulk Data ile doldurmak

Başlatan Cemre., 29 Mayıs 2018, 16:46:43

Cemre.

Merhabalar,

STM32F030K6 MCU ile çalışıyorum. Bu işlemcinin 32kB Flash Memory alanı mevcut. Her biri 1kB'lık 32 Page'den oluşuyor. Ben en sondaki 1 Page'i elimdeki veri ile doldurmak istiyorum.

Örneğin,
0x0800 7C00 adresinden başlayıp 0x0800 7FFF adresine kadar bütün alanları doldurmak istiyorum.
Bunu Flash Unlock, Write ve Lock prosedürlerini sırası ile yaparak bir Array'deki verileri yazma şeklinde yapabilirim. Ancak, benim yapmak istediğim ise, örneğin bir hex dosyası veya herhangi bir formatta bu veriyi 1 Page dolduracak şekilde tutmak ve programı denetleyiciye yüklerken bahsettiğim spesifik adrese bu verilerin baştan yazılmasını sağlamak. Önceden programlanmış EPROM gibi düşünülebilir. Aksi halde bu veri memory'de bir yerlerde bir array olarak kalacak ve ben bunu gidip memory'nin istediğim alanına tekrar yazacağım. Bu da gereksiz memory kullanımına sebep olacak diye düşünüyorum.
Daha sonra bu adreslerdeki verileri program içerisinde ihtiyaç olduğunda programın Factory Default ayarları olarak kullanacağım.

Bunu keil'in scatter dosyası vs. ile yapmak mümkün müdür? Normal programı attıktan sonra STLink Utility gibi bir program ile belirli adrese belirli veriyi yazmak da bir yol sanırım ama ben bunu projenin içerisinde Keil ile birlikte yapmak mümkün mü diye merak ediyorum.

Herkese iyi çalışmalar dilerim.

Mucit23

Hocam __attribute__ ile bir değişkeni istenilen adreste tutabiliyorsunuz. Bende merak edip sizin sorunuz ile araştırdım. Hatta elimin altında hazır donanım var iken Flash memory için denedim. Ama Sanırım Ram içinde oluyor. Denemedim onu.

Şöyle bir kullanım var.

const int var __attribute__((at(0x0807F800))) = 0xAA;

http://www.keil.com/support/man/docs/armcc/armcc_chr1359124981140.htm



Siz istenilen boyutta const türünden bir dizi tanımlayıp istediğiniz adrese yazdırırsanız istediğiniz olur gibi.




Cemre.

Alıntı yapılan: Mucit23 - 29 Mayıs 2018, 17:09:19Hocam __attribute__ ile bir değişkeni istenilen adreste tutabiliyorsunuz. Bende merak edip sizin sorunuz ile araştırdım. Hatta elimin altında hazır donanım var iken Flash memory için denedim. Ama Sanırım Ram içinde oluyor. Denemedim onu.

Şöyle bir kullanım var.

const int var __attribute__((at(0x0807F800))) = 0xAA;

http://www.keil.com/support/man/docs/armcc/armcc_chr1359124981140.htm

(Resim gizlendi görmek için tıklayın.)

Siz istenilen boyutta const türünden bir dizi tanımlayıp istediğiniz adrese yazdırırsanız istediğiniz olur gibi.

Linker'ın bu adresleri kullanmaktan kaçınmasını nasıl sağlayabilirim peki?
Aslında array'im bir struct array. Bu şekilde denediğimde olumlu sonuç aldım ancak C'de struct array'i init ederken içerisinde union vs. barındıran bir struct'ı nasıl init edeceğimi bilemedim.

Örnek,

struct Short_Bits{
 unsigned short Bit0:1;
 unsigned short Bit1:1;
 unsigned short Bit2:1;
 unsigned short Bit3:1;
 unsigned short Bit4:1;
 unsigned short Bit5:1;
 unsigned short Bit6:1;
 unsigned short Bit7:1;
 unsigned short Bit8:1;
 unsigned short Bit9:1;
 unsigned short Bit10:1;
 unsigned short Bit11:1;
 unsigned short Bit12:1;
 unsigned short Bit13:1;
 unsigned short Bit14:1;
 unsigned short Bit15:1;
};

struct Short_Bytes{
 unsigned char Low_Byte:8;
 unsigned char High_Byte:8;
};

typedef struct{
 signed short Min;
 signed short Max;
} myVar_Limits_TypeDef;

typedef union{
 signed short Raw;
 struct Short_Bits Bits;
 struct Short_Bytes Bytes;
} myVar_Data_TypeDef;

typedef struct{
 unsigned short A:1;
 unsigned short B:2;
 unsigned short C:3;
 unsigned short Reserved:10;
 Register_Limits_TypeDef Limits;
 Register_Data_TypeDef Value;
} myVar_TypeDef;

myVar_TypeDef tipindeki bir Array'i nasıl ilk değerleri ile doldurursunuz? Syntax nasıl olmalı?

baran123

Hocam Options kısmından IROM bölümünü küçültürsen kalan alana derleyici'nin karışacağını sanmıyorum.

OptimusPrime

Istedigin seyi yapsa yapsa linker amca yapar ama sihirli sozcukleri bilmen gerek. Kullanma klavuzunda bir yerlerde yaziyordur (eger boyle birsey yapabiliyorsa tabi)

Flashin belli bir yerini kullanmadan da bu istegini yapabilirsin. Sadece gerekli datayi const olarak tanimlayacaksin. Linker bunu istedigi yere yazacak ama sen const datanin adini bildigin icin istedigin sekilde erisebileceksin.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Cemre.

Alıntı yapılan: baran123 - 29 Mayıs 2018, 19:39:29Hocam Options kısmından IROM bölümünü küçültürsen kalan alana derleyici'nin karışacağını sanmıyorum.

Evet, hatta scatter dosyasını açtığımızda da IROM Size'ın scatter dosyasına etkidiğini görüyoruz.
Bunu kullandım, teşekkürler.

Struct Array init etmek ile ilgili de şöyle bir örnek vereyim. Gayet kullanışlı bir yapı oldu. Belki birinin işine yarar. (C99 için geçerli)

struct sample {
  char *name;
  int age;
};

struct sample y[] = {
 {.name = "foo", .age = 1},
 {.name = "bar", .age = 2}
};

Cemre.

#### Yeni Soru ####

DMA Memory to Memory aktarım işlemi RAM'deki 1 Page'lik datayı ROM'a aktarmakta kullanılabilir mi? Ref Manual'de bu konudan hiç bahsedilmemiş. Ancak normal flash yazma işlemlerini (flash unlock vs.) DMA'i aktif etmeden önce yapar, DMA'i aktif eder ve tekrar flash lock işlemi yaparsak çalışır gibi geliyor bana. Siz ne diyorsunuz?

Cemre.

Alıntı yapılan: Cemre. - 29 Mayıs 2018, 22:07:18#### Yeni Soru ####

DMA Memory to Memory aktarım işlemi RAM'deki 1 Page'lik datayı ROM'a aktarmakta kullanılabilir mi? Ref Manual'de bu konudan hiç bahsedilmemiş. Ancak normal flash yazma işlemlerini (flash unlock vs.) DMA'i aktif etmeden önce yapar, DMA'i aktif eder ve tekrar flash lock işlemi yaparsak çalışır gibi geliyor bana. Siz ne diyorsunuz?

Denedim, çalışıyor gözüküyor.

Burak B

typedef struct sample {
  char *name;
  int age;
} sample_t;

volatile const sample_t var[2] __attribute__((at(0x0807F800))) =  {
 {.name = "foo", .age = 1},
 {.name = "bar", .age = 2}
};

Linker bunu görünce sana RW bölge RO oldu haberin olsun diye uyarı verebilir panikleme.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Cemre.

Alıntı yapılan: Burak B - 01 Haziran 2018, 03:41:16typedef struct sample {
  char *name;
  int age;
} sample_t;

volatile const sample_t var[2] __attribute__((at(0x0807F800))) =  {
 {.name = "foo", .age = 1},
 {.name = "bar", .age = 2}
};

Linker bunu görünce sana RW bölge RO oldu haberin olsun diye uyarı verebilir panikleme.

Eğer program içinde o bölgeye o değişken ismi ile müdahale etmeye çalışmazsanız sesini çıkarmıyor.