C'de sabit bir bellek bölgesinin kullanıcıya nasıl tahsis edilir?

Başlatan urmat, 02 Mayıs 2011, 16:49:14

urmat

Mikrodenetleyicinin RAM'i üzerindeki  (örneğin 1EC0h-1F00h) hergangi bir bölgeye dışarıdan veri yazmak istiyorum ama bu bölgeye mikrodenetleyicinin müdahale etmesini istemiyorum(sadece o bölgeden okuma ve yazma işlemi benim tarafımdan yapılacak) bu konuda yardımlarınızı bekliyorum. 

mufitsozen

Alıntı yapılan: urmat - 02 Mayıs 2011, 16:49:14
Mikrodenetleyicinin RAM'i üzerindeki  (örneğin 1EC0h-1F00h) hergangi bir bölgeye dışarıdan veri yazmak istiyorum ama bu bölgeye mikrodenetleyicinin müdahale etmesini istemiyorum(sadece o bölgeden okuma ve yazma işlemi benim tarafımdan yapılacak) bu konuda yardımlarınızı bekliyorum.

Kullandiginiz MCU PIC ise CCS C'de #RESERVE pragma'si var.

Baska Microlar icinde compiler/linker'a has pragmalar var.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Sorunun cevabi linkerden linkere degisir.

Asagidaki linkte Keil kullaniminda ayni soruna buldugum cevabi goreceksin.

https://www.picproje.org/index.php/topic,31692.0.html
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

urmat

Dediğiniz linki açıp inceledim ama benim burada asıl öğrenmek istediğim bunun ANSI C'de nasıl yapılacağıdır

controller

Benim tarafımdan derken yine mikrodenetleyici üzerinde çalışan kod ile mi? yoksa ISP vs. üzerinden mi? burayı tam anlayamadım. İlk aklıma gelen istediğin boyutta byte dizisini global olarak tanımla. Başlangıç adresi vermek istersen __at kullanabilirsin. Örnek;

char rezerve[1024]  __at (0x1000);

Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

urmat

sorunu daha ayrıntılı yazarsam mikrodenetleyiciye  dual port RAM  takılı bende, bu dışarıdan RAM'e erişerek mikrodenetleyiciyi yormadan dışarıdan 512b bir veri dizisi yazmak istiyorum , kısacası direct memory acces, işte sorun burda başlıyor benim veriyi yazacağım bellek gözünün mikrodenetleyici tarafından yazılmaması lazım. bu yüzden RAM üzerinde bana ayrılmış sabit bellek bölgesi lazım sorun bunu C'de nasıl sağlarım

urmat

Şöyle bir şey sorsam 512 elemanlı dizi tanımlasam ve bunun başlangıç adresini belli bir adresten başlatsak olur mu?

urmat

Ben FPGA üzerinde sanal işlemci(soft mcu)olan Texas MSP430 ile uyumlu olan openmsp430 isimli bir mikrodenetleyici kullanıyorum  direk olarak onun RAM'ine bağlanarak 512B lık bir veriyazıcam ama sanal işelmcinin DMA desteği yok o yüzden kendim bir DMA kontrolör yazıp ona göre ona entegre edecem ve belli bir bellek gözüne veriyi yazıcam, ama sorun dediğiniz gibi o bölgenin işlemcinin kullanmamasını garanti etmek.
Soruna gelirsek acaba diziyi const olarak tanımlasak yani const int *const p[512] gibi tanımlarsak olur mu?

controller

Alıntı yapılan: urmat - 02 Mayıs 2011, 22:29:05
Şöyle bir şey sorsam 512 elemanlı dizi tanımlasam ve bunun başlangıç adresini belli bir adresten başlatsak olur mu?

Olur.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

urmat

bunu const olarak tanımlarsan ROM'da bir sabit bellek alanı açmış olurum  yani RAM'de değil? 

z

Alıntı yapılan: urmat - 02 Mayıs 2011, 21:57:49
sorunu daha ayrıntılı yazarsam mikrodenetleyiciye  dual port RAM  takılı bende, bu dışarıdan RAM'e erişerek mikrodenetleyiciyi yormadan dışarıdan 512b bir veri dizisi yazmak istiyorum , kısacası direct memory acces, işte sorun burda başlıyor benim veriyi yazacağım bellek gözünün mikrodenetleyici tarafından yazılmaması lazım. bu yüzden RAM üzerinde bana ayrılmış sabit bellek bölgesi lazım sorun bunu C'de nasıl sağlarım

Dual port ramin kullanim amaci heriki tarafin da rami ortak kullanabilmesi. Burada dikkat edilmesi gereken ayni goze ayni zamanda yazma erisime engel olmak olmali.

Buraya kadar ok fakat,

Rami islemcilerden birisine tamamen yasaklayip gerektigi zaman erisimine izin vermek istiyorsunuz diye anliyorum. Bu durumda yazilan verileri okuyacak islemciye, veriler hazir ramin blokajini da actim git oku yada yaz mi diyeceksin?

Ram yasaklama yapmadan yazilimla iki taraf senkronlanabilir gibime geldi.

Dual port ram uzerinden veri aktarim metodunuzu detayli yazarsaniz bir seyler cikar. Istediginiz adres bolgesinin tahsisi ile sonuca ulasilamaz diye dusunuyorum.


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

mufitsozen

Alıntı yapılan: urmat - 03 Mayıs 2011, 00:24:48
bunu const olarak tanımlarsan ROM'da bir sabit bellek alanı açmış olurum  yani RAM'de değil?

compilerlar code, data, initialized data ve read-only data icin tanimlanmis bir takim alanlar kullanirlar. Sizde 'const' gibi keywordler kullanarak degiskenleri bunlara yerlestirebilirsiniz.

Ama bu tanimli segmentlerin nereye yuklenecegi, ram'dami rom'dami vs locator denilen ve linkerdan sonra kullanilan bir takim programlar ile yapilir.
Cunki linker tanimi geregi 'relocatable' (yerdegistirebilir) dosyalar hazirlarlar(exe dosyalari) isletim sistemleri bu dosyayi hafizaya koyarken tanimlanbmis segmentleri onlarin 'offset'lerini hesaplayarak yukler. Eger embedded bir uygulama yapacaksaniz vede executable dosyanizi yukleyecek bir isletim sistemi (RTLinux gibi) yok ise, sizin bu relocatable kodu hafizaya nasil yerlestirmek istediginizi, MCU/processor ilk yuklendiginde kullanilacak 'initialization' program kodunu, C/C++ kullanmis iseniz compilerin varsaydigi cevre tanimlarini yapacak kodlari vs sizin belirlemeniz lazim. Buda 'locator' dene programlar ile yapilir idi (x86, 68000 vsde) daha modern compilerlar (GCC gibi) linkerda bir script vasitasi ile bu islemi yaparlar.

Yani bu is kullandiginiz toollar (compiler ve linker, vs) ve kullandiginiz MCU ve onun mimarisine gore degisir.

"kısacası direct memory access" konusuna gelince, DMa icin siz program icinde nasil yazilacagi konusunda acik program tanimi yapmasaniz bile, DMA ile memory access processor'in instruction cycledan calarak, yada mevcut instructionlar calisirken cycle icinde hw tarafindan 'contention/corruption' olmadan memeory'e erisim ile yapilir ve muhakkak processor'a bir yuku olur.

yanliz DMA iceren sistemlerdeki veri transferi genellikle cok buyuk veriler icin yapilir (diskten okuma vb) cunku DMA islemine hazirlik vsde oldukca karisiktir. 512 bye icin degermi ...zannetmiyorum. Attiginiz tas urkuttugunuz kusa/kurbagaya degmeyecektir. (buda benim naciz fikrim, katilmasaniz da olur)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.