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
NULLkontrolü 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
consttutulur. - 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.
İlgili C Programlama soruları
- C dilinde volatile anahtar kelimesi ne işe yarar?
- Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.
- Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?
- Endianness nedir? Little-endian ile big-endian farkı nedir?
- Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?
- Makrolar ile inline fonksiyonlar arasındaki fark nedir? Makroların klasik tuzakları nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.