Programı flash yerine rama yüklemek

Başlatan bunalmis, 10 Kasım 2010, 12:10:56

z

Keil otamında ARM işlemcilere kod gelilştirirken zamandan kazanmak adına kodları flasha atmadan dogrudan rama yuklemek ve burdan kosturmak mumkunmu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

PROTECH_

Programı ram den çalıştırmak içinde yine flash hafızaya yüklemek gerekiyor, Bahsettiğin özellik yok sanırım...
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

z

Burada kullanılan ICDI nin ne olduğunun önemi büyük. Sonuçta flasha yükleme işini bu yapıyor.

Jtag üzerinden aktarımda bildiğim kadarıyla hedef adres istendiği gibi belirlenebiliyor.

İstediğim özelliğin bir şekilde yapılabilir olması lazım. Tabiki flasha en azından vektor adreslerini en azından bir kere yüklemek gerekli ve ramda hep standart adresleri referans göstermeli. Bu bır kereye mahsus yapılabilir. Daha sonra C derleyiciye kod alanın burası vektorlerin burası denebilir.

Bu işlem yapıldıktan sonra artık rama atılan kod istenildiği gibi yazılıp bozulabilir.

Ancak bu konuda hazır bir örnek bulmadan çözüm bulmam zor.

Flasha yazma yapmak işime gelmiyor. Özellikle sistemi bloke edebilecek hatalı kodlama (yanlıs pll ayarlaması vs) deneme kartındaki işlemcinin tamamen programlanamaz hale gelmesine neden olabiliyor.

Neyseki benim kullandığım karta ait Flash programlama uygulamasında bu durumdan kurtulmayı sağlayan unblock özelliği var.

Eğer kod geliştirme işlemi ilk başlarda ramda yapılırsa bu tür blokaj durumları yaşanmaz ve flash programlama ile zaman kaybedilmez.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

Hocam ARM işlemcilerde uzman değilim ancak tecrübelerime göre program counter istediğiniz ram bölgesine yönlendirilebiliyorsa istediğiniz şey mümkün olmalı. Ayrıca aşağıdaki linke de bir göz atmanızı öneririm. Linkte daha çok programın yapısal olarak RAM e nasıl yerleştirileceği anlatılmış. Bu tıpkı win32 PE(Windows EXE,DLL, v.s.) formatındaki  .data ve .data? veya .bss(Delphi, C Builder) section ları gibi bir durum. Diğer yandan teorik olarak bir bootloader veya benzeri bir uygulama ile veri kanalı üzerinden veriyi (Mesela bu veri LZMA sıkıştırılmış olsun - yerden kazanacağız ya-) ram üzerine decompress etsin sonra program counter bu ram bölgesine yönlendirilirse ve bu adrese dallanılırsa kod işleyişi bu adresten devam edecektir. Tabi dediğim gibi ben ARM' de uzman değilim mimari destekliyorsa bu dediğim yapılabilir ki desteklediği düşünüyorum çünkü bunu gerçekleştiren uygulamalarının mevcut olduğunu biliyorum.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka11494.html
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

SpeedyX

Keil de scatter file yazarak yapılabilir.

Örnek:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00040000  {    ; load region size_region
  ER_IROM1 0x00000000 0x00040000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   
  }
  RW_IRAM1 0x20000000 0x00018000  {  ; RW data
   .ANY (+RW +ZI)
   .ANY (+RO)
  }
}

z

@Bytemaster evet verdiğin link kesim işimi kesin görecektir ve neden bunu düşenemedim kızdım kendime.

Keil de her bir C yada asm dosya için option seçeneğinde rom ve ram adres tanımı var.

Senin verdiğin linkte soruya cevaben rom alanı adresi olarak ramın fiziksel adresi yazılmış. Yani link aşamasında rom adresi diye ram adresi veriliyor. Programa ayrılan alanı da ramdan çıkartmak gerekiyor.

@Speedyx zaten verdiğin dosya keil tarafından otomatik oluşturuluyor. Yukarıda yazdığım gibi option menüde adresleri verince bu file bu adreslere göre kendiliğinden oluşmuş oluyor.



Assuming we have 8000h bytes of RAM, starting at 40000000H, and we want to execute about 1k of code from RAM:

Place all the code that you want to execute from RAM into its own C module (for example "ram_code.c") and add that module to your project.
Subtract 0x400 (= 1k) from the size of your IRAM1, in your Target options(Project — Options for Target — Target tab).
Set the start address for IROM2 to your IRAM1 start address, plus your IRAM1 size. for example
IRAM1 start = 0x40000000
IRAM1 size  = 0x7C00
IROM2 start = 0x40007C00
Set IROM2 size to 0x400.
Click OK in the options dialog
Right-click on ram_code.c in the project workspace, and select Options for File
Change the Code / Const: setting, under Memory Assignment, from <> to IROM2[0x40007C00-0x40007FFF]
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

SpeedyX

İşin sırrı .ANY (+RO) satırında.

Dosyayı oluşturan keil .ANY (+RO) satırını da ekliyor mu?