Kütüphane yazma

Başlatan sifirzero, 01 Ekim 2023, 00:00:44

sifirzero

Alıntı yapılan: Tagli - 04 Ekim 2023, 22:57:15ASM'yi bırakalı çok oldu. Zamanında garip garip şeylerle uğraşmışım demek :)

Konu hakkındaki güncel görüşüm şu: Gömülü sistemlerde işlemci donanımına bağlı şeylerin kütüphanesi yazmak pek mümkün değil. Bu ancak işlemciniz belli ve sabit ise, veya altta STM32 HAL veya Arduino gibi ek bir donanım soyutlama katmanı varsa yapılabilir. Onu da zaten bir yerden diğerine taşıyamazsınız. Yani mesela Arduino için yazılmış MCP4922 DAC çipi kütüphanesi STM32 HAL altyapısı üzerinde çalışmayacak, çünkü SPI'ya erişim tamamen farklı.

Kaldı ki ben artık tüm gömülü sistem projelerimi olay tabanlı düşündüğüm ve inşaa ettiğim için kütüphanelerde alışık olduğumuz fonksiyon çağrısı mantığı işimi görmüyor. Bu tür sistemlerde fonksiyon çağrılarının yerini, bir "olay" (event) oluşturup bunu ilgili state machine'e atmak alıyor.

Bu arada bence üreticiler de sadece kendi işlemcileri için bile her derde deva kütüphane oluşturamıyorlar çünkü tek bir firmanın işlemcileri bile kendi içlerinde aileden aileye epey değişiklik gösterebiliyor. CubeMX gibi sistemlerin çıkmasının sebebi de bu bence: Parametrelere göre kütüphane sentezlemek. Ben sevemedim bir türlü bu tür şeyleri. İşe yararlıkları da tartışılır.

Donanımdan bağımsız şeylerin kütüphanesi olabilir tabi. Örneğin bir JSON string'i içinden belirli bir parametreyi falan çekmek veya CRC hesaplama gibi işler, donanımdan bağımsız fonksiyon çağrıları şeklinde ifade edilebilir.
Bir alanda ilerlemek gerekli ileri seviye olmaliyiz.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

X-Fi

Alıntı yapılan: Tagli - 04 Ekim 2023, 22:57:15ASM'yi bırakalı çok oldu. Zamanında garip garip şeylerle uğraşmışım demek :)

Konu hakkındaki güncel görüşüm şu: Gömülü sistemlerde işlemci donanımına bağlı şeylerin kütüphanesi yazmak pek mümkün değil. Bu ancak işlemciniz belli ve sabit ise, veya altta STM32 HAL veya Arduino gibi ek bir donanım soyutlama katmanı varsa yapılabilir. Onu da zaten bir yerden diğerine taşıyamazsınız. Yani mesela Arduino için yazılmış MCP4922 DAC çipi kütüphanesi STM32 HAL altyapısı üzerinde çalışmayacak, çünkü SPI'ya erişim tamamen farklı.

Kaldı ki ben artık tüm gömülü sistem projelerimi olay tabanlı düşündüğüm ve inşaa ettiğim için kütüphanelerde alışık olduğumuz fonksiyon çağrısı mantığı işimi görmüyor. Bu tür sistemlerde fonksiyon çağrılarının yerini, bir "olay" (event) oluşturup bunu ilgili state machine'e atmak alıyor.

Bu arada bence üreticiler de sadece kendi işlemcileri için bile her derde deva kütüphane oluşturamıyorlar çünkü tek bir firmanın işlemcileri bile kendi içlerinde aileden aileye epey değişiklik gösterebiliyor. CubeMX gibi sistemlerin çıkmasının sebebi de bu bence: Parametrelere göre kütüphane sentezlemek. Ben sevemedim bir türlü bu tür şeyleri. İşe yararlıkları da tartışılır.

Donanımdan bağımsız şeylerin kütüphanesi olabilir tabi. Örneğin bir JSON string'i içinden belirli bir parametreyi falan çekmek veya CRC hesaplama gibi işler, donanımdan bağımsız fonksiyon çağrıları şeklinde ifade edilebilir.


Hocam bu kadar karamsar olmanıza gerek yoktu  :)  donanım bağımsız kütüphane yazma konusunu gömülü sistemlerde ZephyrRTOS çözdü diyebiliriz. Devicetree Overlays ön işlem katmanı sayesinde gerekli donanım makroları üretlip soyutlanmış kütüphane koduna derleme zamanında bağlanabiliyor.

Hiçbir kod değiştirmeden derleme yapabildiğimiz aşağıdaki supported board listesine bir göz atmanızı öneririm.

https://docs.zephyrproject.org/latest/boards/index.html

Zephyr, linux büyük geldiye bunu kullanın mottosuyla birkaç yıl önce çıktı ve çok tutuldu. Resmi olarak üreticilerinde desteğini alıyor.(NXP,Nordic vs.)

Artık işlemciye özel IDE kullanıp, mimariye özel kod yazmayı bırakmak lazım.

Yeni arkadaşlara kütüphane yazmak yerine Makefile gibi bağımsız derleme araçlarını iyice anlayıp öğrenmelerini tavsiye ediyorum.






http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

MCansız

#17
Merhaba,
Genel bir kütüphane yazımı için yazılacak c fonksiyonları tüm c derleyicilerinde derlenir burada problem platformda dolanımın ve haberleşmenin farklı olmasıdır.  Bunun için kütüphane yazarken haberleşme vb. durumlarda bu olayı gerçekleştiren fonksiyonun olay güdümlü çalışması beklenir (interrupt event).
Mikroe firması bunu yapıyor farklı platformları var ve tüm click bordları yazilim fonksiyonları aynı.

peki biz nasıl yapabiliriz ?

Evrensel kütüphaneler yazılırken fonksiyon pointerlardan yararlanılabilinir.

aşağıdaki linkte ads131m serisi 24 bit adc entegresinin kütüphanesine bakacak olursak

https://github.com/MahdaSystem/ADS131

biraz incelersek

typedef struct
ADS131_Handler_s {
  void (*ADC_CS_HIGH)(void);          // Must be initialized
  void (*ADC_CS_LOW)(void);          // Must be initialized
  void (*ADC_Transmit)(uint8_t Data); // Must be initialized
  uint8_t (*ADC_Receive)(void);      // Must be initialized
  void (*ADC_START_HIGH)(void);      // Can be initialized (If you don't want to use software start, the START pin must be pulled down then pass this as NULL)
  void (*ADC_START_LOW)(void);        // Can be initialized (If you don't want to use software start, the START pin must be pulled down then pass this as NULL)
  void (*ADC_RESET_HIGH)(void);      // Can be initialized (If you want to use software reset, the RESET pin must be pulled up then pass this as NULL)
  void (*ADC_RESET_LOW)(void);        // Can be initialized (If you want to use software reset, the RESET pin must be pulled up then pass this as NULL)
  uint8_t (*ADC_DRDY_Read)(void);    // Can be initialized 
  void (*ADC_Delay_US)(uint32_t);    //! Must be initialized If You do not use Macro Delay (Place here your delay in MicroSecond)
  ADS131_OneSample ChannelsData[8];  // !!! DO NOT USE OR EDIT THIS !!!
} ADS131_Handler_t;

ADS131.h header dosyasında yükarıdaki struct tanımlanmış ve içerisinde function pointerlar var. Bunlar bu kütüphanenin donanım ile ilgili bölümlerin
GPIO SPI vb. olay kesmelarini(eventları) oluşturuyor.

kütüphanenin ADC_CS_HIGH bölümününü stm32 ile kullanmak için söyle bir kod yazabiliriz

#include "ADS131.h" // kütüphaneyi import ettim

ADS131_Handler_t myADS131; //kütüphane evetlarını almak için kendime struct oluşturuyorum.

void stm32_ADC_CS_HIGH_func()   // stm32 içi cs portunu high yapan fonksiyon tanımlıyorum. diğer IO durumlarını oluşturmadım oluşturdum varsayın.
{
    printf("cs_low");
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
    
}


void main()
{
  myADS131.ADC_CS_HIGH = stm32_ADC_CS_HIGH_func; //stm32 için yazmış olduğum fonksiyonu kendi struck fonksiyon pointer bölümüne kanalize ediyorum.
  myADS131.ADC_CS_LOW = .... // diger IO lar vs.
  .
  .

  ADS131_Init(myADS131,...) //şeklinde kendi struck ile parametrelerimi giriyorum.

  ADS131_ReadData(myADS131, ...) //şeklinde parametrelerimi girerek ilgili okumalarımı yapıyorum. 
 
}


 Görüldüğü üzere kütüphane içeriği ile oynamadan kütüphane header dosyasını kullanarak ve ilgili işlemci ailesi için stm32_ADC_CS_HIGH_func() adında basit bir ara fonksiyonlar ile kütüphaneni benden istemiş olduğu fonksiyonları yazdım. Kütüphane içeriğinde bulunan ADC_Handler->ADC_CS_HIGH() fonksiyonu çağırıldığında artık burada benim stm32_ADC_CS_HIGH_func() fonksiyonum çağırılacak. Örnekte diğer fonksiyonları yazmadım tabi gerçekte yazmak gerek.

 Buda arduino, nuvoton, pic vb platromlarda bu fonksiyonları  yazabilirsiniz. Geriye kütüphaneyi init etmek ve dataları okumak kalıyor. Basit bir şekilde evrensel bir kütüphane nasıl yazılır anlatmaya çalıştım.  Bu yöntem windows ve linux işletim sistemlerinde bolca kullanılmaktadır. C struct yapıları ve fonksiyon pointer(callback function) gibi konulara çalışmak önem arzediyor.


 
 

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

papsukkal

https://youtu.be/DrjkF5n-pqY?si=oPhuGBnWdDuu2Zkm

Arduino için lcd kütüphanesi yazma aşamaları. Adım adım. İncele.

sifirzero

ccs c compiler kullaniyorum ardunio hic kullanmadim.Bilgi icin Tesekkur ederim.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir