Gönderen Konu: Volatile olup olmaması  (Okunma sayısı 2695 defa)

Çevrimdışı Muharrem Mandacı

  • OTOKON Üyesi
  • *
  • İleti: 493
  • ESKİ GİRİŞ KOORDİNATÖRÜ
Volatile olup olmaması
« : Mart 26, 2017, 04:25:07 ÖS »
Bugün Cemil ile birlikte msp430 çalışırken bir sorun ile karşılaştık.(CCS kullanıyoruz.)

Kod: [Seç]
#include <msp430.h>
#include <in430.h>
#include <stdint.h>

int main(void) {
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

    P1OUT = 0x00;
    P1DIR = 0x03;

    uint16_t i;

    while(1)
    {
        P1OUT ^= 0x03;

        i = 10000;                  // SW Delay
        do i--;
        while(i != 0);
    }

return 0;
}

Kodu bu şekilde yazdığımız zaman P1.0 ve P1.1 pinlerinden sürekli HIGH çıkışı alıyoruz. Ancak kodu aşağıdaki gibi değiştirdiğimizde...

Kod: [Seç]
#include <msp430.h>
#include <in430.h>
#include <stdint.h>

int main(void) {
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

    P1OUT = 0x00;
    P1DIR = 0x03;

    volatile uint16_t i;

    while(1)
    {
        P1OUT ^= 0x03;

        i = 10000;                  // SW Delay
        do i--;
        while(i != 0);
    }

return 0;
}

Bu sefer ledler sırası ile yanıp sönüyor. Tek yaptığımız değişiklik i değişkeninin başına volatile koymak. Ama bunun  nedenini bir türlü anlayamadık.
ESKİ GİRİŞ KOORDİNATÖRÜ

Çevrimdışı Ufuk Sevim

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 451
Ynt: Volatile olup olmaması
« Yanıtla #1 : Mart 26, 2017, 05:20:33 ÖS »
İlk durumda i değişkeni anlamlı(!) bir yerde kullanılmadığı için, yani kullanıldığı do-while döngüsü programın akışını/çıktısını değiştirmediği için derleyici bu kısmı optimize eder ve while döngüsünü tamamen koddan kaldırır. Bu durumda bir warning de vermesi lazım tabi, dolayısıyla warning'lere her zaman dikkat etmekte fayda var.

Normalde derleyici optimizasyonları istenen bir şey. Böylece kodda hiçbir değişiklik yapmadan daha hızlı ve az yer kaplayan bir program elde edilebilir. Ama bu durumda olduğu gibi bazen de bu istenmez. Bu durumda volatile ile derleyiciye "ben ne yaptığımı biliyorum, kafana göre optimizasyonlar yapma" demek gerekir.

Aynı etki proje ayarlarından optimizasyonu tamamen kapatarak da elde edebilir, ama dediğim gibi bu çok da istenmez. O nedenle özellikle gömülü sistemlerde volatile kelimesini doğru kullanmak çok önemlidir.
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Çevrimdışı Muharrem Mandacı

  • OTOKON Üyesi
  • *
  • İleti: 493
  • ESKİ GİRİŞ KOORDİNATÖRÜ
Ynt: Volatile olup olmaması
« Yanıtla #2 : Mart 26, 2017, 05:42:58 ÖS »
Yani oradaki delay atmak için kullandığımız döngüyü optimizasyon sırasında kodu yavaşlatan ve gereksiz bir şey olarak gördüğü için yok sayıyor. Teşekkür ederiz. Anladığımızı düşünüyorum.
ESKİ GİRİŞ KOORDİNATÖRÜ