Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.

Cevap

Fonksiyon pointer'ı, çalışma zamanında hangi fonksiyonun çağrılacağına karar vermeyi sağlar. Gömülü yazılımda callback'ler, sürücü soyutlama (HAL), komut çözümleyiciler ve state machine'lerde yaygındır; uzun switch-case bloklarının yerini alır.

Sözdizimi

typedef void (*callback_t)(uint8_t data);

void uart_register_rx_cb(callback_t cb);

static void on_rx(uint8_t b) { /* ... */ }
uart_register_rx_cb(on_rx);

typedef olmadan okunması zordur: void (*cb)(uint8_t).

State machine tablosu

typedef enum { ST_IDLE, ST_RUN, ST_ERROR, ST_COUNT } state_t;
typedef enum { EV_START, EV_STOP, EV_FAULT, EV_COUNT } event_t;

typedef state_t (*handler_t)(void);

static state_t start_motor(void) { motor_on();  return ST_RUN;   }
static state_t stop_motor(void)  { motor_off(); return ST_IDLE;  }
static state_t go_error(void)    { motor_off(); return ST_ERROR; }
static state_t ignore(void);     /* mevcut durumu döndürür */

static state_t current = ST_IDLE;
static state_t ignore(void) { return current; }

static const handler_t table[ST_COUNT][EV_COUNT] = {
    /*            START        STOP        FAULT    */
    [ST_IDLE]  = { start_motor, ignore,     go_error },
    [ST_RUN]   = { ignore,      stop_motor, go_error },
    [ST_ERROR] = { ignore,      stop_motor, ignore   },
};

void fsm_dispatch(event_t ev) {
    if (ev < EV_COUNT) {
        current = table[current][ev]();
    }
}

Tablo static const olduğu için Flash'ta durur; yeni durum eklemek kodu değil tabloyu değiştirmektir.

Sürücü soyutlama

typedef struct {
    int  (*init)(void);
    int  (*write)(const uint8_t *buf, size_t len);
    int  (*read)(uint8_t *buf, size_t len);
} comm_ops_t;

extern const comm_ops_t uart_ops, spi_ops;

Bu, C'de arayüz/polimorfizmin karşılığıdır (Linux kernel file_operations aynı yaklaşımı kullanır).

Dikkat edilecekler

  • Çağırmadan önce NULL kontrolü yapın; NULL pointer çağrısı HardFault üretir.
  • RAM'deki fonksiyon pointer'ı bellek bozulmasıyla ezilirse rastgele adrese atlanır; güvenlik kritik sistemlerde tablolar const tutulur.
  • MISRA C fonksiyon pointer kullanımını kısıtlar; tip dönüşümü yapmayın.
  • Callback'ler ISR bağlamında çağrılıyorsa kısa tutulmalı ve bloklayan API kullanmamalıdır.
  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?OrtaC ProgramlamaEmbedded
  6. Makrolar ile inline fonksiyonlar arasındaki fark nedir? Makroların klasik tuzakları nelerdir?OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle