persistent'in görevi nedir acaba?

Başlatan PARSIC, 19 Ocak 2011, 13:44:51

PARSIC

selamlar...

static persistent int intvar;

burada persistent'in görevi nedir acaba?
********************************************************************HI-TECH*******************************************************************

CLR

Alıntı yapılan: PARSIC - 19 Ocak 2011, 13:44:51
selamlar...

static persistent int intvar;

burada persistent'in görevi nedir acaba?

Merhaba,

persistent, registerin const gibi kullanılması sağlar yani bir defa içine yazarsın sonra bir daha yazamazsın.

Knowledge and Experience are Power

PARSIC

öncelikle cevabınız için teşekkür ederim örnek olarak ufak bir kod yazabilir misiniz acaba...birde neden register sabit olarak kullanılmak istenir ki const gibi..
********************************************************************HI-TECH*******************************************************************

F493

Alıntı yapılan: eemkutay - 19 Ocak 2011, 13:54:34
Alıntı yapılan: PARSIC - 19 Ocak 2011, 13:44:51
selamlar...

static persistent int intvar;

burada persistent'in görevi nedir acaba?

Merhaba,

persistent, registerin const gibi kullanılması sağlar yani bir defa içine yazarsın sonra bir daha yazamazsın.

Selam Üstad,

  Burada yapmış oldugunuz açıklama persisent'ın açıklaması mı. Yoksa
static persistent int intvar; bu soruya verilen bir cevap mı?. Bunu sormamın nedeni persistent'ın anlamını başka amaçla kullanıldıgını biliyorum.  Benim bildigim bu degiskenin içerigindeki deger işlemci reset olduktan sonra bile o degişkenin içeriginde en son hangi deger kaldıysa onunla devam eder.

Esen kalın.

PARSIC

yani bir nevi eeprom mantığı gibi sanırım
********************************************************************HI-TECH*******************************************************************

CLR

Alıntı yapılan: PARSIC - 19 Ocak 2011, 14:01:44
öncelikle cevabınız için teşekkür ederim örnek olarak ufak bir kod yazabilir misiniz acaba...birde neden register sabit olarak kullanılmak istenir ki const gibi..

Merhaba,

Mesela sinus bir voltajı opampla kuvvetlendirceksin ama sinyali DC değerin üzerine bindirdiğini ve AC sinyali bir analog anahtarla sisteme bağlayacağını kabul et.
Anahtar açıkken, adc yi okuduğunda  DC değeri okumuş olursun buna göre ac sinyalin referans noktası belirlenmiş olur.

persistent u8 sebeke;

sebeke=AdcRead();   // adc kanalını okuduk ve persistent olarak atadık
Knowledge and Experience are Power

PARSIC

tamam işte bu çok açıklayıcı oldu teşekkür ederim yardımınız için..
********************************************************************HI-TECH*******************************************************************

CLR

#7
Alıntı yapılan: F493 - 19 Ocak 2011, 14:15:07
Alıntı yapılan: eemkutay - 19 Ocak 2011, 13:54:34
Alıntı yapılan: PARSIC - 19 Ocak 2011, 13:44:51
selamlar...

static persistent int intvar;

burada persistent'in görevi nedir acaba?

Merhaba,

persistent, registerin const gibi kullanılması sağlar yani bir defa içine yazarsın sonra bir daha yazamazsın.

Selam Üstad,

  Burada yapmış oldugunuz açıklama persisent'ın açıklaması mı. Yoksa
static persistent int intvar; bu soruya verilen bir cevap mı?. Bunu sormamın nedeni persistent'ın anlamını başka amaçla kullanıldıgını biliyorum.  Benim bildigim bu degiskenin içerigindeki deger işlemci reset olduktan sonra bile o degişkenin içeriginde en son hangi deger kaldıysa onunla devam eder.

Esen kalın.

Merhaba,

"Registeri persistent tanımladın işlemcinin gücünü kestin, tekrar verdin persistent registerin içeriği korunacak" böyle bişey olmaz. Bu bahsettiğin olay eeprom veya flash özelliğidir. Bir işlemcinin flashına bir byte bile yazman için min. 4-5ms zaman harcanır.
Ama sadece fix bir değer atıyorsan olur bu durumda persistent'i main fonksiyonu içinde tanımlamış olursun. Yani her resette bu fix değer registere yüklenir ve değiştirilemez.

Static : Bir registerin aynı file veya fonksiyon içinde kullanılması sağlar. File içinde bir register static global  tanımlanırsa diğer C dosyalarında kullanılamaz sadece o C file içinde kullanılır veya aynı şekilde bir fonksiyon içinde. Fonksiyondan çıksanda fonksiyon içine geri döndüğünde
static registerin içeriği değişmez.



Knowledge and Experience are Power

F493

#8
Selam

Hi-tech c manual .

4.4.9.1 Persistent Type Qualifier    
By default, any C variables that are not explicitly initialised are cleared to zero on startup. This is consistent with the definition of the C language. However, there are occasions where it is desired for some data to be preserved across resets or even power cycles (on-off-on).    
The persistent type qualifier is used to qualify variables that should not be cleared on startup. In addition, any persistent variables will be stored in a different area of memory to other variables. Persistent objects are placed within one of the non-volatile psects. If the persistent object is also qualified near, it placed in the nvrram psect. Persistent bit objects are placed within the nvbit psect. All other persistent objects are placed in the nvram psect.    

Benim yazıdan az çok anladıgım bu.
Ayrıca;

Üstad kaldı ki hi-tech ve C18 de vu özellik var. işlemci çalışırken reset aldı ve tekrar başladı bu deger degişmez aynen kaldıgı yerden devam eder. Kaldıki FRAM diye bir olay var bu flash şeklinde çalışıyor fakat yazma hızları ram gibi. Siz benim sordugumu yanlış anlamış olabilirsiniz. örnegin BOR durumunda değişken içerigini saklar.


http://ww1.microchip.com/downloads/en/DeviceDoc/51284H.pdf
Sayfa 21
persistent
The persistent attribute specifies that the variable should not be initialized or
cleared at startup. A variable with the persistent attribute could be used to store state
information that will remain valid after a device reset.
int last_mode __attribute__ ((persistent));
Persistent data is not normally initialized by the C run-time. However, from a
cold-restart, persistent data may not have any meaningful value. This code example
shows how to safely initialize such data:
#include "p24Fxxxx.h"
int last_mode __attribute__((persistent));
int main()
{
if ((RCONbits.POR == 0) &&
(RCONbits.BOR == 0)) {
/* last_mode is valid */
} else {
/* initialize persistent data */
last_mode = 0;
}
}

CLR

Alıntı yapılan: F493 - 19 Ocak 2011, 21:20:34
Selam

Hi-tech c manual .

4.4.9.1 Persistent Type Qualifier    
By default, any C variables that are not explicitly initialised are cleared to zero on startup. This is consistent with the definition of the C language. However, there are occasions where it is desired for some data to be preserved across resets or even power cycles (on-off-on).    
The persistent type qualifier is used to qualify variables that should not be cleared on startup. In addition, any persistent variables will be stored in a different area of memory to other variables. Persistent objects are placed within one of the non-volatile psects. If the persistent object is also qualified near, it placed in the nvrram psect. Persistent bit objects are placed within the nvbit psect. All other persistent objects are placed in the nvram psect.    

Benim yazıdan az çok anladıgım bu.
Ayrıca;

Üstad kaldı ki hi-tech ve C18 de vu özellik var. işlemci çalışırken reset aldı ve tekrar başladı bu deger degişmez aynen kaldıgı yerden devam eder. Kaldıki FRAM diye bir olay var bu flash şeklinde çalışıyor fakat yazma hızları ram gibi. Siz benim sordugumu yanlış anlamış olabilirsiniz. örnegin BOR durumunda değişken içerigini saklar.


http://ww1.microchip.com/downloads/en/DeviceDoc/51284H.pdf
Sayfa 21
persistent
The persistent attribute specifies that the variable should not be initialized or
cleared at startup. A variable with the persistent attribute could be used to store state
information that will remain valid after a device reset.
int last_mode __attribute__ ((persistent));
Persistent data is not normally initialized by the C run-time. However, from a
cold-restart, persistent data may not have any meaningful value. This code example
shows how to safely initialize such data:
#include "p24Fxxxx.h"
int last_mode __attribute__((persistent));
int main()
{
if ((RCONbits.POR == 0) &&
(RCONbits.BOR == 0)) {
/* last_mode is valid */
} else {
/* initialize persistent data */
last_mode = 0;
}
}

Merhaba F493,

Benim anladığımı söylüyeyim, İşlemci mesela kitlendi ve WDT reset attı veya komut ile soft reset yaptın diyelim bu durumda, Power on reset olur ama  besleme kesilmez. Dolayısıyla Non volatile ram(NVRRAM diye bahsettiği şey) durumu oluşur. İsternirse tüm ram içeriği silinmez ama
derliyici dökümanı diyorki persistent yaptığın registerler nvram bölgesine taşınır bu durumda resette (beslemesi kesilmemiş resette) sadece bu ram(registerler) içeriği korunur, diğerleri silinir. Ama senin bahsettiğin gibi program belleğe kalıcı data gibi yazamaz. Mantıkende öyle zaten, flash presedürü gerekli.






Knowledge and Experience are Power

iyildirim

Derleyici startup kodunda ön değer atanarak tanımlanan değişkenlerin içeriklerini RAMde set eder. Öndeğer atanmamış değişkenlerin içeriklerini ise ANSI C standardı  gereği sıfırlar.

Persistent ile declare edilmiş değişkenler ise persistent data section da tanımlanır.  Hard ve/veya soft reset de RAM üzerinde persistent data section olarak tanımlanmış bölüme startup kodunda dokunulmaz.
Derleyici persistent olarak tanımlanmış değişkenlerin içeriklerine startup-initilization aşamasında bulaşmaz.
Kalıcı RAM gibi birşeylerle herhangi bir ilgisi yok. Persistent sadece startup kodunda değişkenlerin içeriklerinin tanımlanmamasını ifade eder.

F493

#11
Alıntı yapılan: eemkutay - 19 Ocak 2011, 21:48:04

Merhaba F493,

Benim anladığımı söylüyeyim, İşlemci mesela kitlendi ve WDT reset attı veya komut ile soft reset yaptın diyelim bu durumda, Power on reset olur ama  besleme kesilmez. Dolayısıyla Non volatile ram(NVRRAM diye bahsettiği şey) durumu oluşur. İsternirse tüm ram içeriği silinmez ama
derliyici dökümanı diyorki persistent yaptığın registerler nvram bölgesine taşınır bu durumda resette (beslemesi kesilmemiş resette) sadece bu ram(registerler) içeriği korunur, diğerleri silinir.

Üstad bende tam bunu demek istedim.

Ben böyle birşey demedim  :).
Ama senin bahsettiğin gibi program belleğe kalıcı data gibi yazamaz. Mantıkende öyle zaten, flash presedürü gerekli.

Fakat şunu demek istedim şimdiki teknoloji ile mümkün olabilir. Çünkü FRAM diye bir olay var biraz pahalı ve external olarak kullanılıyor.

The theoretical performance of FeRAM is not entirely clear. Existing 350 nm devices have read times on the order of 50-60 ns. Although slow compared to modern DRAMs, which can be found with times on the order of 2 ns, common 350 nm DRAMs operated with a read time of about 35 ns,[7] so FeRAM performance appears to be comparable given the same fab.

detaylı ilgi.
http://en.wikipedia.org/wiki/Ferroelectric_RAM
Görüldügü gibi harika bir olay.
Texas Ins yeni işlemcilerinde flash yerine bunu koyacak sanırım ama biraz daha zaman alır heralde. Ucuzlaması gerekir.

In memory applications, the stored value of a ferroelectric capacitor is read by applying an electric field. The amount of charge needed to flip the memory cell to the opposite state is measured and the previous state of the cell is revealed. This means that the read operation destroys the memory cell state, and has to be followed by a corresponding write operation, in order to write the bit back. This makes it similar to the ferrite core memory. The requirement for a write cycle for each read cycle, together with the high but not infinite write cycle limit, poses a potential problem for some special applications.
Detay : http://en.wikipedia.org/wiki/Ferroelectric_capacitor

Bu bellegi gerçekleştirmek biraz zor sanırım maliyet fazla.

Sonuç olarak bu anahtar kelime dogru amaçla kullanıldıgında faydalı olabilir. Örnegin atıyorum siz bir porttan gelen pulse'leri sayıyorsunuz ve bir nedenden dolayı reset aldı işlemci bu durumda işlemci tekrar uyandıgında persistent olarak tanımlanan degisken içerigi kaldıgı yerden devam edecek faydalı gerçekten.


Bence tartışma faydalı oldu.
Esen kalın.

CLR

Merhaba F493,

Açıkçası POR'da da registeri koruduğunu bilmiyordum, assembly olarak düşündüğümde derleyicinin sadece bu registerler hariç, diğer tüm registerleri silen bir altprogram eklemesi gerekir gibime geliyor, NVRAM bölgesi dediği kısımda bu registerlerin bulunduğu bölge olması lazım, Ama ana program içinde ise dediğim gibi tek değer atıp, değiştirilemez ve silinemez yapıyorsun.

Evet güzel bir tartışma oldu.
Knowledge and Experience are Power

CLR

Alıntı yapılan: iyildirim - 20 Ocak 2011, 00:29:10
Derleyici startup kodunda ön değer atanarak tanımlanan değişkenlerin içeriklerini RAMde set eder. Öndeğer atanmamış değişkenlerin içeriklerini ise ANSI C standardı  gereği sıfırlar.

Persistent ile declare edilmiş değişkenler ise persistent data section da tanımlanır.  Hard ve/veya soft reset de RAM üzerinde persistent data section olarak tanımlanmış bölüme startup kodunda dokunulmaz.
Derleyici persistent olarak tanımlanmış değişkenlerin içeriklerine startup-initilization aşamasında bulaşmaz.
Kalıcı RAM gibi birşeylerle herhangi bir ilgisi yok. Persistent sadece startup kodunda değişkenlerin içeriklerinin tanımlanmamasını ifade eder.

Merhaba,

Yazını sonradan okudum, bende ondan bahsettim zaten yoksa işlemci yapısında NVRAM diye bişey yok sadece mantık öyle. NVRAM, içinde güç kaynağı olan RAM'lardir, dallas'ın bir ürünü vardı.
Knowledge and Experience are Power