به گفته CNX Software – Embedded Systems News
هیاهوی زیادی پیرامون زبان برنامهنویسی Rust وجود دارد و من شاهد پذیرش آن در پروژههای مختلفی هستم که مهمترین آنها کرنل لینوکس است. با این حال، تا به حال برای من روشن نبود که آیا این زبان برای توسعه فریمور امبدد مناسب است یا خیر، چرا که منابع سختافزاری در یک میکروکنترلر محدود هستند. اشغال فضای کم در حافظه (RAM) و ذخیرهسازی (Flash) الزامی است و عملکرد بهینه نیز میتواند حیاتی باشد؛ برای مثال جهت کاهش مصرف توان در دستگاههایی که با باتری کار میکنند.
یک مقاله تحقیقاتی توسط شرکت STMicroelectronics، موسسه Inria و دانشگاه Freie Universität Berlin تحت عنوان «درسهایی از یک مورد صنعتی استفاده از میکروکنترلر با سیستمعامل Ariel OS» که در ArXiv (میزبانی شده توسط دانشگاه کرنل) منتشر شده است، تلاش میکند با استفاده از C امبدد و Rust به این سوال پاسخ دهد. نتیجهگیری این است که Rust گزینهای مناسب و قابل اتکا است:
«همزمان با افزایش محبوبیت Rust برای توسعه نرمافزارهای ایمنتر سیستمی، بررسی واقعبینانه آن در بخش سختافزارهای میکروکنترلر ضروری است. اکوسیستم Rust تا چه حد برای این بخش آماده است؟ آیا Rust در عمل میتواند با C رقابت کند؟»
این مقاله گزارشی از یک مورد پژوهشی صنعتی در حوزه IoT ارائه میدهد که به پاسخگویی به این سوالات کمک میکند. دو تیم که به طور همزمان یک عملکرد مشابه را (یکی با C و دیگری با Rust) توسعه میدادند، در یک دوره چند ماهه مورد تحلیل قرار گرفتند. تحلیلی مقایسهای از رویکردها، نتایج و تلاشهای تکرارشونده آنها ارائه شده است. تجزیه و تحلیلها و اندازهگیریها روی سختافزار نشان میدهد که دلیل محکمی برای ترجیح دادن C به Rust در توسعه فریمور میکروکنترلر، بر اساس میزان اشغال حافظه یا سرعت اجرا وجود ندارد.
علاوه بر این، نشان داده شده است که سیستمعامل Ariel OS یک محیط اجرایی (Runtime) کارآمد و قابل حمل در Rust فراهم میکند که میزان اشغال فضای آن کمتر از پشته (Stack) رایج C به صورت Bare-metal (بدون سیستمعامل) است که به طور سنتی در این زمینه استفاده میشود. نتیجه گرفته شده است که Rust امروزه انتخابی منطقی برای توسعه فریمور در این حوزه محسوب میشود.
اما بیایید این نتیجهگیری را بدیهی تلقی نکنیم و برای درک بهتر روش تحقیق و نتایج، نگاهی به پژوهش (فایل PDF) بیندازیم.
سختافزار مورد استفاده، برد توسعه SensorTile.box Pro مجهز به میکروکنترلر STMicro STM32U585AI با هسته ARM Cortex-M33 بود. این برد دارای قابلیتهای ارتباطی بلوتوث و NFC (که در اینجا استفاده نشد) و یک سنسور شتابسنج و ژیروسکوپ ۶ محوره IMU (مدل LSM6DSV16X) است. همچنین مجموعه هوش مصنوعی لبه شرکت ST با نام AIoT Craft، پردازش هوش مصنوعی روی دادههای دریافتی از سنسور را امکانپذیر کرده بود.
این برد توسعه، پروتکل ثبت دادههای Vanilla (VDL) را که به زبان C یا Rust نوشته شده اجرا میکند و از طریق پروتکل (VDP) و رابط UART، با یک کامپیوتر که دارای رابط کاربری گرافیکی (GUI) است ارتباط برقرار میکند.

هر تیم در فاز اولِ پیادهسازی فریمور VDL به زبانهای C و Rust، به مدت شش هفته به صورت مستقل کار کردند و سپس چهار هفته دیگر برای بهینهسازی کارهای یکدیگر با هم همکاری کردند. پیادهسازی C به نرمافزار STM32CubeMX، یک ماشین وضعیت محدود (FSM) نوشته شده به زبان C در حالت Bare-metal و کتابخانه متنباز Parson برای تبدیل JSON متکی است (توجه: این کتابخانه از تخصیص حافظه داینامیک استفاده میکند).

پیادهسازی C
فریمور نوشته شده با Rust به RTOS مخصوص میکروکنترلر یعنی Ariel OS متکی است و سریالسازی و دیسریالسازی JSON را با استفاده از پکیجهای (Crates) کتابخانه Serde (یک فریمورک سریالسازی) و Heapless (برای تخصیص حافظه استاتیک) پیادهسازی میکند.

پیادهسازی Rust
از آنجایی که معماریها کاملاً متفاوت هستند، این یک مقایسه مستقیم C در مقابل Rust نخواهد بود، اما در اینجا نتایج نهایی مربوط به میزان اشغال حافظه و فضای ذخیرهسازی آورده شده است.
| Metric (bytes) | VDL-C | VDL-Rust | Δ (Rust − C) |
|---|---|---|---|
| .text | 66,240 | 69,764 | 3,524 |
| Total ROM | 76,744 | 84,100 | 7,356 |
| Stack RAM | 2,048 | 10,240 | 8,192 |
| Static RAM | 14,960 | 14,400 | -560 |
| Heap RAM | 25,600 | 0 | -25,600 |
| Total RAM | 44,656 | 24,640 | -20,016 |
هر دو فایل باینری فریمور VDL نسبتاً کوچک هستند، اما نسخه C همچنان از نسخه Rust کمحجمتر است. در اینجا این موضوع چندان اهمیت ندارد، زیرا میکروکنترلر STM32U585AI دارای ۲ مگابایت حافظه فلش است؛ اما اگر روی میکروکنترلرهایی با منابع محدودتر به سقف ظرفیت ذخیرهسازی نزدیک شویم، ممکن است این اختلاف اهمیت پیدا کند و در آن صورت یا به بهینهسازی بیشتر و یا تعویض قطعه نیاز خواهد بود. مقایسه RAM به دلیل تخصیص حافظه داینامیک پیچیدهتر است، زیرا پیادهسازی C به حافظه Heap نیاز دارد. عدد نشان داده شده، حداکثر مقدار پیک اندازهگیری شده برای Heap است. پژوهشگران همچنین اشاره کردند که در مقایسه با کتابخانه Parson، «گزینههای کممصرفتری از نظر حافظه وجود دارند که اصلاً به Heap نیاز ندارند»، زیرا بهینهسازی حافظه هدف اصلی این تحقیق نبوده است.

تجزیه و تحلیل مقایسهای فریمور در C و Rust
در نهایت، هر دو فریمور در Rust و C با سطح عملکرد یکسانی از نظر نرخ خروجی داده (ODR) کار کردند: ۷۴۶۸ هرتز. نمودار زیر نشان میدهد که چه C و چه Rust را برای پروژه امبدد بعدی خود انتخاب کنید، فریمور بدون کار جدی به طور خودکار از نظر اندازه و عملکرد بهینه نخواهد شد.

عملکرد C در مقابل Rust
پیادهسازی Rust در اولین آزمایش دو برابر سریعتر از پیادهسازی C بود، اما پس از اعمال بهینهسازیها (که شامل تغییرات سادهای مانند غیرفعال کردن لاگهای دیباگ، فعال کردن I-Cache و پیشخوانی فلش برای کاهش تأخیر در پروتکل I2C بود)، جایگاه اول بین C و Rust جابجا میشد. جزئیات بیشتر در مورد نکات فنی و چالشها را میتوانید در فایل PDF کامل مقاله مطالعه کنید.
آنچه در این تحقیق جالب بود، این است که در فاز دوم، هر تیم با مقایسه کدهای C و Rust به تیم دیگر کمک کرد تا فریمور بهتری بسازد. در تئوری، بهترین راهکار استفاده همزمان از C و Rust در تیم توسعه برای محصول بعدی شماست، اما در عمل به دلیل محدودیتهای بودجه، بعید است این کار امکانپذیر باشد. کد منبع این پروژه در نهایت در پلتفرم STM32 Hotspot منتشر خواهد شد.
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.