زبان های برنامه نویسی Embedded
بِرَه، بریم سراغ «زبانهای بَرنامهنویسیِ امبِدِد» — یعنی همون زبونایی که میریزن توی خونِ میکروکنترلرها و بردهای کوچولو؛ جایی که رمِ شما ۲ کیلوبایتِ، جایی که اگر یه حلقهی بیمورد انداختی، باتریِ دستگاه یه هفتهای تموم میشه نه یه سال! میخوام مثلِ همونی باشم که داره واسه دوستش توِ کارگاهِ الکترونیک توضیح میده، نه تو کلاسِ تئوریِ دانشگاه.
۱) اصلاً Embedded یعنی چی؟
یه کامپیوترِ کوچولو که فقط یه کارِ خاص انجام میده:
– ترموستاتِ خونه،
– ماشینِ لباسشویی،
– ساعتِ هوشمند،
– ایربگِ ماشین،
– ماژولِ Wi-Fiِ داخلِ قهوهساز!
همشون یه «مغز» دارن که قرار نیست ویندوز بالا بیاره؛ قرارِ فقط همون کاری رو بکنه که مهندسِ سختافزار گفته، تا آخرِ عمرش، بدونِ ایراد.
۲) زبانهای اصلیِ این دنیا (از پرکاربرد تا تخصصی)
۱) C (پادشاهِ بیچونوچرایِ embedded)
چرا؟
– کمحجمترینِ؛ یه int ۲ بایت، یه char ۱ بایت.
– کامپایلرش واسه هر میکرویی (AVR، ARM، PIC، RISC-V) هست.
– میتونی مستقیم به رجیسترهای سختافزاری دست بزنی (*(uint32_t*)0x40021018 |= 0x04;).
– کتابخونههای HAL/LL شرکتها (STM32Cube، AVR Libc) همشون Cان.
مثالِ راهاندازیِ یه LED روی STM32:
#define RCC_AHB1ENR (*(uint32_t*)0x40023830)
#define GPIOA_MODER (*(uint32_t*)0x40020000)
#define GPIOA_ODR (*(uint32_t*)0x40020014)
int main(void){
RCC_AHB1ENR |= (1<<0); // کلاکِ پورت A رو فعال کن
GPIOA_MODER |= (1<<10); // پین 5 رو خروجی کن
while(1){
GPIOA_ODR ^= (1<<5); // LED رو_TOGGLE کن
for(volatile int i=0;i<100000;i++); // تأخیرِ خام
}
}
همینه؛ دیگه نیازی به هیچ OS ای هم نداری.
۲) C++ (با احتیاط، ولی قدرتمند)
– اگر چیپِ شما FLASHِ بالای ۱۲۸K و RAMِ ۲۰K داره، میتونی از کلاس، تمپلیت، inline استفاده کنی.
– STM32CubeIDE، Keil، IAR همشون C++17 رو پشتیبانی میکنن.
– میتونی هِدرِ register رو توی کلاس ببندی، بعد درایورات تمیز بشه:
class Led{
public:
void toggle(){ GPIOA->ODR ^= PIN5; }
private:
static constexpr uint32_t PIN5 = (1<<5);
};
فقط حواست به «حجمِ باینری» باشه؛ اگر حجم زیاد شد، -fno-exceptions و -fno-rtti رو به کامپایلر بده.
۳) Assembly (وقتی میخوای «ذرهبین» بذاری روی سختافزار)
– برای بوتلودرهای 512 بایتی، یا interrupt-handlerهایی که میخوای ۱۰ سیکل بیشتر نخورن.
– برای آموختنِ معماریِ ARM یا AVR عالیه؛ ولی روزمرهت نکن، چشمِ پیر میشه!
۴) Rust (نوپایِ امیدوارکننده)
– حافظهایمن بدونِ garbage collector.
– میتونی #![no_std] بزنی و توی bare-metal کار کنی.
– HAL رسمیِ شرکتها داره (nrf-hal, stm32f4xx-hal).
– یه LED toggle ساده:
#![no_std]
#![no_main]
use stm32f4xx_hal::{pac, prelude::*};
use cortex_m_rt::entry;
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let gpioa = dp.GPIOA.split();
let mut led = gpioa.pa5.into_push_pull_output();
loop {
led.toggle();
cortex_m::asm::delay(8_000_000);
}
}
فقط اینو بدون: compile حجمش ممکنه ۱۵-۲۰K بشه؛ هنوز برای چیپهای ۸K Flash گرونه.
۵) Ada/SPARK (وقتی قراره هواپیما یا فضاپیما سقوط نکنه!)
– تایپایمنیِ قوی، قراردادهای پیششرط/پسشرط.
– رویِ LEON (پردازندهِ فضاییِ اروپا) پرواز کرده.
– یادگیریش سخته، ولی اگر بخوای گواهیِ DO-178C بگیری، ارزش داره.
۶) MicroPython / CircuitPython (فقط واسه پروتوتایپ سریع)
– رویِ STM32F4 یا ESP32 ۲۶۰MHz و ۵۲۰KB RAM جواب میده.
– برای تستِ سنسور یا دموی یه ایده عالیه؛ ولی برای تولید انبوه، مصرفِ باتری ۱۰ برابر C میشه.
۷) Lua (NodeMCU) و JavaScript (Espruino)
– همون حرف بالا؛ سریع ببین چی میشه، بعد برو سراغ C.
۳) چه جوری انتخاب کنم؟
| حجم Flash/RAM | زبان پیشنهادی |
|---|---|
| < 32 KB Flash, 2 KB RAM | C یا Assembly |
| 32–256 KB Flash, 8–64 KB RAM | C (و اگر HAL خوب داشت C++) |
| > 256 KB Flash, > 64 KB RAM | C++17 یا Rust |
| پروتوتایپ سریع | MicroPython / Lua |
| پروژهِ ایمنی-حر بصی (Medical, Aviation) | Ada/SPARK یا MISRA-C |
۴) toolchainهایی که دستت میگیرن
– GCC-ARM (رایگان، واسه STM32، nRF، NXP)
– AVR-GCC (Arduino هم از همین زیرِ کاپوت استفاده میکنه)
– Keil MDK (ARM اصلی، ولی لایسنسِ شُل)
– IAR Embedded Workbench (اگر قراره گواهیِ صنعتی بگیری)
– PlatformIO (همون VSCode، ولی پلاگینش همهچیو دانلود میکنه)
– Rust: cargo-embed + flip-link برای حجم کم
۵) یه تمرینِ عملی کوچولو
بردِ BluePill (STM32F103) داری؟ بذار LED رو با PWM کمنور و پرنور کنه، بدون اینکه CPU رو درگیر کنه (Timer PWM).
۱) CUBE-MX باز کن، پین A8 رو TIM1-CH1 بذار.
۲) Prescaler = 72-1، ARR = 1000-1 → فرکانس 1 kHz.
۳) Compare = 500 → duty 50%.
۴) کامپایل، دانلود، LED نفسنفس میزنه!
همین یه تمرین ساده، معلوم میشه چرا C هنوز سلطانِ این دنیاست.
۶) یادت باشه اصولِ embedded
– هر سیکلِ CPU پولِ باتریِ مشتریِ.
– هر بایتِ RAM گرمه.
– printf برای دیباگ خوبه، ولی تولید نهایی حذفش کن.
– ** watchdog راه بنداز تا هنگ نکنه.**
– گیتِ JTAG رو غیرفعال نکن اگر قراره بعداً دیباگ کنی!
۷) خلاصهی سریع
اگر میخوای واردِ دنیای embedded بشی:
۱) C رو محکم بچسب (پایهِ ARM یا AVR فرقی نمیکنه).
۲) یه برد ارزون (STM32F4 Discovery یا Arduino Nano) بگیر.
۳) datasheet بخون، رجیسترها رو دستکاری کن.
۴) وقتی حجم پروژه بالا رفت، C++ یا Rust رو امتحان کن.
۵) اگر قراره FDA یا EASA تأییدت کنه، برو سراغ Ada/SPARK یا MISRA-C.
پست های مرتبط
27 آبان 1404
27 آبان 1404
27 آبان 1404
27 آبان 1404