Bit Banding olayının mantığı nedir?

Başlatan yamak, 02 Temmuz 2012, 22:58:34

yamak

Bit banding olayı işlemci içinde nasıl bir donanım ile sağlanıyor bunun mantığı nedir.
mesela stm32f4 ' ün datasheet indeki bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4) formülünün mantığı nedir. Nede adresi 32 ile çarpıyoruz 32 bitlik işlemci oladuğu içindir de tam olarak mantığı nedir çözemedim. Bir de mesela pic168xa.h kütüphanesinde RB7 yi şu şeklide tanımlamış
volatile bit	RB7	@ (unsigned)&PORTB*8+7;
burada PORTB nin adresini neden 8 ile çarpıyor.
*(unsigned char*)(0x06)=7

diyerek PORTB nin ilk 3 biti aktif edebiliyorum. Bu 8 ile 32 ile çarpma olayı nereden geliyo.


JKramer


yamak

Benim anlamadığım nokta @ operantının kullanılma nedeni nedir. @ operantının yerine * kullanılsa olmuyo mu? Hi-tech in kütüphanelerinde hep kullanılmış.

OptimusPrime

olmuyoki @ koymuşlar.  ;D

belirli bir adresteki x değişkeni tanımlanırken derleyiciden derleyiciye fark gösterebilir.

mesela hi-tech ve ti ın ccs sinde kalıp aynen verdiğin gibi
volatile değişken_tipi değişkenin_ismi  @(değişkenin adresi);

keil de ise @(değişkenin adresi) ifadesi
__attribute__((at(adres))) şeklinde tanımlanıyor...
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 ||

mcan

Alıntı yapılan: yamak - 02 Temmuz 2012, 22:58:34
Bit banding olayı işlemci içinde nasıl bir donanım ile sağlanıyor bunun mantığı nedir.
mesela stm32f4 ' ün datasheet indeki bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4) formülünün mantığı nedir. Nede adresi 32 ile çarpıyoruz 32 bitlik işlemci oladuğu içindir de tam olarak mantığı nedir çözemedim. Bir de mesela pic168xa.h kütüphanesinde RB7 yi şu şeklide tanımlamış
volatile bit	RB7	@ (unsigned)&PORTB*8+7;
burada PORTB nin adresini neden 8 ile çarpıyor.
*(unsigned char*)(0x06)=7

diyerek PORTB nin ilk 3 biti aktif edebiliyorum. Bu 8 ile 32 ile çarpma olayı nereden geliyo.
Mantık m3 de m4 de şu ; işlemci 2^32 kadar adresleme özelliğine sahip olsa bile malum minik mcu'muz bu kadar donanım yazmacı ram yada rom a sahip değil .Adamlar da mcu komut setini değiştirip bit bit erişmek yerine kullanılmayan 32 bitlik adreslerin bir kısımını donanım yazmacı yada ram deki herbir bite bağlamışlar.

Mesela adresleri 0 den 9 a kadar 32 bitlik 10 adet ram alanımız olsun.Yani 1 ve 10. adresler arasında, 32*10 = 320 adet bitimiz var demek. O zaman 10 dan 330 e kadar olan adreslerin herbirini 0 ile 9 arasındaki 320 bite bağlayalım. Yani 10. adrese 0xff yazdığımızda aslında aynı zamanda 0.adresdeki ram alanının 0. bitine de yazmış oluyoruz.......bit_band_base + (byte_offset x 32) + (bit_number × 4)
bitband base bitband için ayrılmış adreslerin başlangıcıdır. Bizim örnekde 10.   adres
byte offset  her bir normal adres arası, 32 bitlik değişkenlerimiz olduğu için, bit_band adres aralığında 32 adet adrese tekabul eder.
bit numarası sayılar 32bitlik olduğu için 32/8 = 4 byte yani her 4byte bir bite karşılık geliyor.Bizim örneğimizdeki 2. adresin 3. bitini set etmek istersek
10+(2*32)+(3*4) = 86 . yani ha 86. adresdeki 32 bitlik sayıya bişeyler yazmışız , ha 2. adresin 3. bitine yazmışız aynı şey. Tek fark biri atomik diğeri değil.

Bu şekilde herbir bite ,yada pine yada interrupt flag a atomik düzeyde erişmiş oluyoruz. Bu bize hız sağlıyor,yada o biti değiştirirken herhangi bir kesme işleminin bit manuplasyonunu bozmasını engelliyoruz.

Benim bildiğim mantık bu.

yamak

Eğer olay anladığım gibiyse Bu çok masraflı bişey olmuyo mu ? Ben sırf 10 byte ın bitlerine erişebilmek için 320 byte lık yer ayırıyrum. Yani bi benim registerlarım için yer olacak bi de bunları bitlerine erişebilmek için bunun 32 katı kadar bellek alanı ayıracam. Eğer gerçekten böyleyse bit banding her baba yiğitin harcı değil. :)

mcan

Alıntı yapılan: yamak - 04 Temmuz 2012, 00:14:07
Eğer olay anladığım gibiyse Bu çok masraflı bişey olmuyo mu ? Ben sırf 10 byte ın bitlerine erişebilmek için 320 byte lık yer ayırıyrum. Yani bi benim registerlarım için yer olacak bi de bunları bitlerine erişebilmek için bunun 32 katı kadar bellek alanı ayıracam. Eğer gerçekten böyleyse bit banding her baba yiğitin harcı değil. :)
Bellek ayırmıyorsun ki sadece adres ayırıyorsun.Zaten kullanamayacağın kadar adres var . m3 de 1mbyte lık sram ve 1mbyte lık donanım yazmacı için iki adet 32mbyte lık adres ayırmışlar.yani toplam 4gbyte adresleyebilen işlemciden 64mbyte lık alanı reserve edivermişler,çok da bişey kaybetmemişler.Ayrıca bitband adresinin sadece 0. biti ilgili bite bağlı. 1-31 . bitlerin işlevi yok.

Tagli

M0'larda bu özellik yok galiba? Kolay olur düşüncesiyle ARM öğrenmeye M0 ile başladım ve dökümanlarda gözüme çarpmayınca bir sorayım dedim.
Gökçe Tağlıoğlu

MC_Skywalker

#8
Bit Band işlemcinin normal kullandığı SRAM ın ilk 1Mblik alan ve dış RAM in ilk 1Mb lik bellek alında kullanıyor. Tek saat döngüsünde okuma yazma yapılıyor. (bit olarak)

0x20000000-0x200FFFFF (SRAM 1Mb)
0x40000000-0x400FFFFF (peripherals 1Mb)


Alıntı Yap
Bit-Band Operations
Bit-band operation support allows a single load/store operation to access (read/write) to a single data bit. In the Cortex-M3, this is supported in two predefined memory regions called bit-band regions. One of them is located in the first 1 MB of the SRAM region, and the other is located in the first 1 MB of the peripheral region. These two memory regions can be accessed like normal memory, but they can also be accessed via a separate memory region called the bit-band alias (see Figure 5.3). When the bit-band alias address is used, each individual bit can be accessed separately in the least significant bit (LSB) of each word-aligned address.

For example, to set bit 2 in word data in address 0x20000000, instead of using three instructions to read the data, set the bit, and then write back the result, this task can be carried out by a single instruction

Alıntı Yap
Here's a simple example:
1.   Set address 0x20000000 to a value of 0x3355AACC.
2.   Read address 0x22000008. This read access is remapped into read access to 0x20000000. The return value is 1 (bit[2] of 0x3355AACC).
3.   Write 0x0 to 0x22000008. This write access is remapped into a READ-MODIFY-WRITE to 0x20000000. The value 0x3355AACC is read from memory, bit 2 is cleared, and a result of 0x3355AAC8 is written back to address 0x20000000.
4.   Now, read 0x20000000. That gives you a return value of 0x3355AAC8 (bit[2] cleared).

When you access bit-band alias addresses, only the LSB (bit[0]) in the data is used. In addition, accesses to the bit-band alias region should not be unaligned. If an unaligned access is carried out to
bit-band alias address range, the result is unpredictable.