XC8 Free Versiyon sınırı nedir ?

Başlatan elektroacemi, 12 Şubat 2022, 20:40:19

elektroacemi

Merhabalar.

Uzun zamandır Proton Basic kullanıyorum. Bazı projelerde yetersiz geldiği için başka platformlara yöneldim. (modbus gibi)
XC8 in free versiyonundaki kısıtlar nelerdir ?

power20

Optimizasyon yoktur. Kod şişer. Yavaş çalışır. Hatta bazı bloglarda bunun kasıtlı olarak yapıldığı, free versiyonda araya gereksiz işlemlerin doldurulduğu ispatlanmıştı.

Erol YILMAZ


Tagli

#3
Yakın zamanda kısıtlamaların çoğunu kaldırdılar. -O1 ve -O2 optimizasyonları açık ve kod boyutunu epey azaltıyor ve muhtemelen hızı da arttırıyor. -O3 ve -Os optimizasyonları ücretsiz versiyonda kapalı. Assembly optimizasyonları da anladığım kadarıyla kapalı olan bu son seviyelerden birine giriyor ve buna bağlı olarak fonksiyonları inline yapmayı es geçiyor. Bazı durumlarda macro'lar ile bunun çevresinden dolanmak mümkün. Ayrıca MISRA-C denetleyicisi ve sanırım "functional safety" (ne olduğunu bilmiyorum) için ayrıca lisans almak gerekiyor.
Gökçe Tağlıoğlu

Erol YILMAZ

Alıntı yapılan: elektroacemi - 12 Şubat 2022, 20:40:19Merhabalar.

Uzun zamandır Proton Basic kullanıyorum. Bazı projelerde yetersiz geldiği için başka platformlara yöneldim. (modbus gibi)
XC8 in free versiyonundaki kısıtlar nelerdir ?

Ilac buldun mu, işi çözdü mü?

ex_machina

Alıntı yapılan: Kılıç - 12 Şubat 2022, 20:56:16Optimizasyon yoktur. Kod şişer. Yavaş çalışır. Hatta bazı bloglarda bunun kasıtlı olarak yapıldığı, free versiyonda araya gereksiz işlemlerin doldurulduğu ispatlanmıştı.
Bunu zamanında ben de üşenmeden free ve kürekli versiyonda denedim ve karşılaştırdım. Kesinlikle doğru. Free versiyonda kod kasıtlı olarak şişiriliyor.
Bunu farkettikten sonra direkt stm'ye geçtim. Şimdi mecbur kalmadıkça pic kullanmıyorum.

Adamlar ICD debugger'ı fahiş fiyata satıyor, yetmiyor kendi derleyicilerini bile parayla satıyorlar. Eğer zamanında Atmel'i satın almasaydılar bence şimdiye batmıştılar.

Tagli

#6
Önceki mesajımda da belirttiğim gibi, şu anda ücretsiz versiyonda -O1 ve -O2 optimizasyon seviyeleri açık ve bunlar kodu oldukça iyi bir hale getiriyorlar. Yani XC8 ücretsiz versiyonu son derece kullanılabilir durumda. İlaçlamaya falan gerek de yok bence.

Öte yandan, 8-bit PIC'lerin donanımlarından kaynaklanan epey bir kısıtları var:

Donanımsal register'ların çok az olması (sadece bir veya iki tane W ve modele göre bir veya iki tane pointer register'ı var sanırım) ve genel amaçlı bir stack desteğinin olmaması, özellikle fonksiyon çağrılarında kodu çok şişiriyor. Bol miktarda $$$ bayılıp Pro versiyonu alsanız bile, derleyicinin bu konuda yapabilecekleri oldukça sınırlı.

Bence bir başka önemli kısıt da flash'ın normal adres uzayında olmaması ve erişim için ek komutlar gerektirmesi. Bildiğim kadarıyla bazı modellerde PSV (program space visibility) ile bu sorun bir derece çözülmüş, ancak çoğu modelde bu özellik yok diye biliyorum. Normalde sabitleri (tablolar mesela) mümkün olduğunca flash'a saklamak isteriz ki RAM'den yemeyelim. Ama bunu PIC'te yapmaya çalışınca, bu sabitlere erişmek yavaş olduğu gibi kod boyutunu da şişiriyor. (benzer sorunun AVR'lerde de olduğunu hatırlatmadan geçmeyelim)

İşlemcinin donanımsal kısıtları ve farklı adres uzaylarının olması pointer işlerini de karıştırıyor. XC8'de pointer'ların sabit boyutları yok. Mesela bir uint8_t* pointer'ı 1 byte olabileceği gibi 3 byte da olabilir. Yani sizeof(uint8_t*) yazarsanız üzülürsünüz (evet, başıma geldi).

Konudan biraz uzaklaşmış olacağız ama debug cihazlarının da tam bir çöp olduğunu belirtmeden geçemeyeceğim. Bende orijinal PicKit3 ve ICD3 var. Al birini vur ötekine. Linux üzerinde MPLAB X'in son versiyonunu kullanıyorum. ICD3 bağlantısı durup dururken zırt pırt kopuyor. Çoğu zaman MPLAB'i kapatıp tekrar açmak gerekiyor. Mesela önce MPLAB'ı açıp sonra ICD3'ü bilgisayarınıza taktınız. Geçmiş olsun... MPLAB görmüyor bunu. Önce ICD3'ü takıp sonra MPLAB'i açmak gerekiyor. İstisnasız her seferinde farklı bir şekilde saç baş yolduran bir eziyet...

Ha bir de neden debug sırasında işlemciyi durdurduğumuzda EEPROM veya flash'ı okuyamıyoruz? Kalıcı bellekle ilgili kütüphane yazmaya çalışıyorum şu sıralarda ve bu durum beni körlemesine çalışmaya zorluyor.
Gökçe Tağlıoğlu

mr.engineer

Alıntı yapılan: Tagli - 13 Şubat 2022, 19:32:28Önceki mesajımda da belirttiğim gibi, şu anda ücretsiz versiyonda -O1 ve -O2 optimizasyon seviyeleri açık ve bunlar kodu oldukça iyi bir hale getiriyorlar. Yani XC8 ücretsiz versiyonu son derece kullanılabilir durumda. İlaçlamaya falan gerek de yok bence.

Öte yandan, 8-bit PIC'lerin donanımlarından kaynaklanan epey bir kısıtları var:

Donanımsal register'ların çok az olması (sadece bir veya iki tane W ve modele göre bir veya iki tane pointer register'ı var sanırım) ve genel amaçlı bir stack desteğinin olmaması, özellikle fonksiyon çağrılarında kodu çok şişiriyor. Bol miktarda $$$ bayılıp Pro versiyonu alsanız bile, derleyicinin bu konuda yapabilecekleri oldukça sınırlı.

Bence bir başka önemli kısıt da flash'ın normal adres uzayında olmaması ve erişim için ek komutlar gerektirmesi. Bildiğim kadarıyla bazı modellerde PSV (program space visibility) ile bu sorun bir derece çözülmüş, ancak çoğu modelde bu özellik yok diye biliyorum. Normalde sabitleri (tablolar mesela) mümkün olduğunca flash'a saklamak isteriz ki RAM'den yemeyelim. Ama bunu PIC'te yapmaya çalışınca, bu sabitlere erişmek yavaş olduğu gibi kod boyutunu da şişiriyor.

İşlemcinin donanımsal kısıtları ve farklı adres uzaylarının olması pointer işlerini de karıştırıyor. XC8'de pointer'ların sabit boyutları yok. Mesela bir uint8_t* pointer'ı 1 byte olabileceği gibi 3 byte da olabilir. Yani sizeof(uint8_t*) yazarsanız üzülürsünüz (evet, başıma geldi).

Konudan biraz uzaklaşmış olacağız ama debug cihazlarının da tam bir çöp olduğunu belirtmeden geçemeyeceğim. Bende orijinal PicKit3 ve ICD3 var. Al birini vur ötekine. Linux üzerinde MPLAB X'in son versiyonunu kullanıyorum. ICD3 bağlantısı durup dururken zırt pırt kopuyor. Çoğu zaman MPLAB'i kapatıp tekrar açmak gerekiyor. Mesela önce MPLAB'ı açıp sonra ICD3'ü bilgisayarınıza taktınız. Geçmiş olsun... MPLAB görmüyor bunu. Önce ICD3'ü takıp sonra MPLAB'i açmak gerekiyor. İstisnasız her seferinde farklı bir şekilde saç baş yolduran bir eziyet...

Ha bir de neden debug sırasında işlemciyi durdurduğumuzda EEPROM veya flash'ı okuyamıyoruz? Kalıcı bellekle ilgili kütüphane yazmaya çalışıyorum şu sıralarda ve bu durum benim körlemesine çalışmaya zorluyor.


Hocam, bu pointer size işini ilk defa duydum. Pointer boyutunun 1 byte olması RAM'in 255 byte olması demek değil mi?

Bu arada ICD4'ü denediniz mi bilmiyorum ama önceki şirkette kullanıyordum sorunsuzdu. Pickit3 ise tam bir çöp.

Tagli

XC8 zaten çok az olan RAM'i mümkün olduğunca verimli kullanmak için zahmetli bir işe giriyor ve bir pointer'a yapılan tüm atamaları takip ediyor, ki bunlar flash adresleri de olabilir. Nasıl bir algoritma kullandığını bilmiyorum, ancak adreslenen verinin bellekteki konumuna göre bunu bir şekilde 1 byte'a da sığdırabiliyor. Belki bir çeşit bağıl adresleme yapıyordur. XC8 dokümanında bu durumdan bahsediyor.

Bu arada dokümanda şuna benzer bir örnek vermiş:
uint8_t a = 5;
uint8_t* a_ptr = &a;
Burada sizeof(uint8_t*) hatalı sonuç verebiliyor. Ancak sizeof(a_ptr) ifadesi doğru sonuç veriyor.

Benzer bir durum pointer içeren struct'lar için de geçerli. Mesela:
struct Link {
    uint8_t val;
    struct Link* next;
};
Burada sizeof(struct Link) ifadesinin ne olacağı belli değil. Yakın zamanda blok tabanlı bir memory allocation kodu yazmaya çalışıyordum. Bu durum elimi kolumu bağladı gibi. Sanırım şansa çalıştırmayı başardım ama içime sinmedi. Ham bellek adresinden böyle bir struct pointer'ına cast edip kullanıyorum. Ama aynı struct programın iki farklı yerinde iki farklı boyuta sahipse bu durumda işin içinden çıkmak mümkün olmaz.

Maalesef elime ICD4 hiç geçmedi. Fiyatı $300 civarında sanırım, benim bütçemi aşıyor. ICD3'ü de zamanında şirketimize TÜBİTAK proje desteği ile almıştık, sonra şirket batınca alet bana kaldı. Yoksa o da olmayacaktı. Gerçi bu kadar sorunlu bir cihaza bu parayı vermezdim. Yine de PicKit3'te olmayan debug özellikleri var, sınırsız breakpoint koyabilme gibi.

ICD3 ile yaşadığım sorunlar belki Linux ile ilgili olabilir. Windows'ta ne kadar sorunsuz çalışıyor bir fikrim yok. Kullanan arkadaşlar varsa deneyimlerini duymak isterim.

Teşekkür: Yeni forum güncellemesi ile kod blokları epey güzel olmuş. Eline sağlık @gevv hocam.
Gökçe Tağlıoğlu