Noinit olarak açılmış RAM alanlarını temizlemek

Başlatan MrDarK, 01 Haziran 2018, 10:11:23

MrDarK

Merhabalar;

Pille çalışan bir uygulamamız var. Uygulamadaki bazı parametreler reset esnasında temizlenmiyor. Yani açılan bu elemanlar noinit özelliği ile açılmış. Kod yükleme anında ise bu noinit RAM alanlarının bir kereye mahsus temizlenmesini istiyorum. Mümkünse de bunu .ld dosyası içindeki ->RAM alanı içinde yapmak istiyorum.

Linker Script File için yardımcı olabilecek biri var mı veya yol gösterebilecek ?
Picproje Eğitim Gönüllüleri ~ MrDarK

MrDarK

Şu şekilde halledebildim. İlgilenenlere yardımcı olayım.

/* Specify the memory areas */
MEMORY
{
    RAM (xrw)      : ORIGIN = 0x20001400, LENGTH = 27K
    CLEAR_RAM (rx) : ORIGIN = 0x20001400, LENGTH = 27K
}

/* Define output sections */
SECTIONS
{
  .CleanRam :
  {
      KEEP(*(.CleanRam))
      FILL(0x00000000);
      . = ORIGIN(CLEAR_RAM) + LENGTH(CLEAR_RAM) - 1;
      BYTE(0x00)
  } > CLEAR_RAM
}

Kısa açıklama;
RAM uzayınızın kopyasını bir section olarak belirtin. Aslında buna gerek olmayabilir. RAM ismini kullanarak da yapabilirsiniz. Fakat ben amacın bu olduğunu direkt olarak göstermek adına yeni section açarak bildirdim.

KEEP Burası önemli. Optimizasyon sebebi ile derleyiciler bu alanlar kullanılmıyor diye nitelendirip bu tarz bölümlendirme işlemlerini iptal edebiliyorlar. Keep tag'i ile belirtildiğinde yapmak zorunda kalıyorlar.

FILL komutu ise bize hangi data ile doldurmak istediğimizi söylememizi sağlıyor. Başlangıç noktası CLEAR_RAM olan alanın 0 datası ile programlanmasını sağlıyor. Hangi noktaya kadar bunu yükleyeceğini söylüyoruz. 1 Byte eksik yazıyoruz. BYTE(0x00)'da Linker'ın bu işlemi yapması için yazılması gereken bir bilgi.

Bu konuda detaylı bilgisi olan varsa notlarımı düzeltebilir. Nette 3-4 saatlik bir araştırma sonucunda bu şekilde yapmak istediğim işi halledebildim.

Yardımcı kaynak = https://mcuoneclipse.com/2014/06/23/filling-unused-memory-with-the-gnu-linker/
Picproje Eğitim Gönüllüleri ~ MrDarK