این دوره آموزشی برگرفته از کتاب BARE METAL C به نویسندگی Steve Oualline میباشد.
آموزش برنامه نویسی c یا Embedded Programming فرایند نوشتن برنامهها و کدهای کامپیوتری برای کنترل و مدیریت میکروکنترلرها و سیستمهای امبدد (Embedded Systems) است. میکروکنترلرها در دستگاهها یا محصولات مختلف جای میگیرند و برخی از ویژگیها و عملکردهای آنها توسط برنامهنویسی امبدد تعیین میشود.
در برنامهنویسی امبدد، برنامهنویسان به شکل عمده با سختافزارهای محدود، مانند میکروکنترلرها، SOC (System on Chip) ،FPGAها سروکار دارند. این سیستمها معمولاً در دستگاههای خاص جای میگیرند و بهمنظور اجرای وظایف مختلفی طراحی شدهاند.
برنامهنویسی امبدد نیازمند شناخت دقیق از سختافزار، معماری سیستم، و محیط عملکردی دستگاه است. برنامهنویسان امبدد باید بهینهسازی منابع سختافزاری، مدیریت حافظه، و کنترل تعامل با ورودی/خروجی را در نظر بگیرند. همچنین، این نوع برنامهنویسی اغلب با استفاده از زبانهای برنامهنویسی مانند C و Assembly صورت میپذیرد.
امروزه میکروکنترلرها در دستگاههای زیادی مورد استفاده قرار میگیرنده، به عنوان مثال، می توان به انواع لوازم خانگی هوشمند یا دستگاه های پزشکی و… اشاره کرد.
چرا زبان برنامهنویسی C
دلایل استفاده از زبان C برای برنامهنویسی سیستمهای تعبیهشده بسیارند. در زیر به تفسیر مهمترین آنها میپردازیم:
1. دقت دستورات (Precise Control)
دقت در اجرای دستورات (Precise Control) به ویژگی زبان C اشاره دارد که به برنامهنویسان اجازه میدهد تا در کنترل عملیاتی که توسط برنامه انجام میشود، دقت بسیار زیادی داشته باشند.
بهطور خاص، در زبان C دستورات مانند a = b;
بهصورت ساده و بدون اثرات جانبی انجام میشود و هیچ عملیات پنهانی اضافی در این فرایند انجام نمیشود. این امر در سیستمهایی با منابع محدود مانند سیستمهای امبدد و میکروکنترلرها بسیار مهم است، زیرا مدیریت حافظه در این سیستمها دارای اهمیت بسیار زیادی است.
2. عدم وجود عملیات پنهانی (No Behind-the-Back Operations)
در زبانهای برنامهنویسی دیگر مانند C++، اجرای یک دستور ممکن است عملیاتهای پنهانی بسیار زیادی را به همراه داشته باشد. این عملیاتها ممکن است شامل فراخوانی توابع عملگرها (operator functions) یا مدیریت حافظه بهصورت پنهان باشد.
در C، این پنهانکاریها وجود ندارند هر عملیات و دستوری که انجام میشود به طور صریح و با دانش و تایید برنامهنویس انجام میشود. این ویژگی به منظور اطمینان از پایداری و قابلیت پیشبینی برنامهها استفاده میشود و در محیطهایی مانند برنامهنویسی امبدد که دقت و قابلیت پیشبینی اجرا اهمیت زیادی دارد، بسیار حیاتی است.
3. ارتباط مستقیم با سختافزار (Direct Hardware Interaction)
ارتباط مستقیم با سختافزار (Direct Hardware Interaction) به معنای ارتباط و تعامل مستقیم بین نرمافزار (برنامه) و سختافزار است، بدون واسطههای نرمافزاری اضافی. در این حالت، برنامههای نرمافزاری میتوانند به صورت مستقیم با واحدهای سختافزاری مانند ورودی/خروجیها، حافظه، سیگنالهای سختافزاری و غیره، ارتباط برقرار کنند و عملیات مورد نیاز را انجام دهند.
این ویژگی در برنامهنویسی امبدد بسیار مهم است زیرا برنامههای امبدد معمولاً برای کنترل و مدیریت دستگاهها یا سیستمهای خاصی طراحی میشوند که نیازمند ارتباط مستقیم با سختافزار هستند. این امر امکان کنترل دقیق و مستقیم بر روی سختافزار را فراهم میکند و از این طریق، بهینهسازیهایی در عملکرد و مصرف انرژی امکانپذیر میشود.
باتوجهبه موارد فوق، زبان C بهعنوان یک زبان برنامهنویسی مناسب برای توسعه سیستمهای امبدد انتخاب میشود که نیازمند کنترل دقیق بر روی حافظه و ارتباط مستقیم با سختافزار هستند.
این دوره برای افرادی طراحی شده است که دانش اولیه کامپیوتر و سختافزار دارند؛ اما دانش برنامهنویسی محدودی دارند. دوره برای طراح سختافزاری است که میخواهد یک سختافزار جدید را به یک میکروکنترلر متصل کند و برای اولینبار از آن استفاده کند.
در این دوره قراره چی یاد بگیریم!؟
در این دوره یاد میگیریم چگونه میتوان برنامه بهینه برای معماری ARM نوشت. برای مثال، استفاده از اعداد صحیح 32 بیتی نسبت به 16 بیتی در تراشههای ARM کمک میکند که برنامه بهینهتری در عملکرد و سرعت داشته باشیم.
چه ابزارهایی نیازداریم؟
برای برنامهنویسی و دیباگ میکروکنترلر شامل هسته ARM، نیازمند به ابزارهای زیر هستید:
- پروگرامر حافظه فلش (Flash Memory Programmer): پروگرامر حافظه فلش به شما کمک میکند که کد برنامه را به حافظه تراشه منتقل کنید.
- مبدل USB به سریال (USB-to-Serial Converter): این تبدیل به شما امکان میدهد که از خطوط سریال جهت اشکالزدایی و رفع عیب استفاده کنید. این ارتباط از طریق یک کابل USB به سریال برقرار میشود.
- JTAG Debugger: این ابزار دیباگ مبتنی بر JTAG را انجام میدهد. JTAG یک استاندارد صنعتی برای اتصال و اشکالزدایی مدارهای الکترونیکی است.
- برد NUCLEO-F030R8: شرکت STMicroelectronics یک برد به نام NUCLEO-F030R8 ارائه داده است که تمام ابزارهای لازم برای برنامهنویسی و اشکالزدایی یک تراشه ARM را فراهم میکند. این برد شامل اتصالات و امکانات لازم برای توسعه برنامههای امبدد است.
با تهیه این ابزارها و تجهیزات، میتوانید برنامهنویسی و دیباگ بر روی تراشه ARM خود را آغاز کنید.
در صورتی که میکروکنترلر مورد استفاده از نوع STM است، میتوانید از ابزار دیگری به نام STLink استفاده کنید که بهطور خاص برای برنامهنویسی و دیباگ میکروکنترلرهای STM ارائه شده است. همچنین، برخی از بردهای توسعه مانند NUCLEO-F030R8، ابزارهای دیباگ را همراه با خود دارند و نیازی به تهیه جداگانه آنها نیست.
نگاهی کوتاه به دوره برنامهنویسی امبدد
بیایید یک سیستم امبدد ساده را توضیح دهیم. این سیستم یک پردازنده و باتری دارد که به شکل یک گردنبند است و افراد میتوانند آن را به گردن خود آویزان کنند. زمانی که کاربر نیاز به کمک اورژانسی دارد، دکمه روی گردنبند را فشار میدهد و گردنبند یک سیگنال رادیویی به ایستگاه مرکزی ارسال میکند تا تماس با اورژانس برقرار شود.
سیستم باید به طور دورهای وضعیت باتری را بررسی کرده و این اطلاعات را به ایستگاه مرکزی ارسال کند. این کار دو هدف دارد؛ ابتدا، زمانی که باتری خالی میشود، شرکت با ارسال هشدار به مصرفکننده درخواست میکند تا باتری تعویض شود.
دوم، اگر ایستگاه مرکزی سیگنال دورهای دریافت نکند، شرکت متوجه میشود که مشکلی برای سیستم بهوجود آمده است.
این نوع برنامهنویسی در دنیای سیستمهای امبدد رایج است.
در این دوره، شما با برنامهنویسی C آشنا خواهید شد. همچنین به طور دقیق توضیح میدهیم که کامپایلر C چگونه عمل میکند تا بتوانید دقت بیشتری در کنترل میکروکنترلرها داشته باشید. برای داشتن این کنترل دقیق، باید بدانید که کامپایلر در پشت پرده چه کاری انجام میدهد.
برنامهنویسی سیستمهای امبدد چالشهای خاصی در زمینه دیباگ دارد. خوشبختانه، ابزارهایی مانند رابط دیباگ JTAG کار را آسانتر میکنند، اما هنوز هم دیباگ یک سیستم امبدد ممکن است خیلی دشوار باشد.
یکی از روشهای اشکالزدایی بسیار ابتدایی و متداول، قراردادن printf در کد است. این کار در برنامهنویسی سیستمهای امبدد کمی دشوار است، چرا که جایی برای چاپ خروجی وجود ندارد. ما در اینجا نحوه استفاده از ورودی/خروجی سریال، برای بهدستآوردن دادههای چاپی از سیستم امبدد بهمنظور اشکالزدایی و ثبت را برسی میکنیم.
همچنین، در این دوره، با برنامهنویسی با وقفهها (Interrupt Programming) آشنا خواهیم شد.
برنامهنویسی با وقفهها به یک الگوی برنامهنویسی اطلاق میشود که در آن اجرای نرمافزار ممکن است بهصورت موقت توسط وقفهها بهمنظور پردازش رویدادها یا شرایط خارجی متوقف شود.
این رویکرد بهخصوص در مدیریت عملیات ورودی و خروجی مؤثر است و باعث افزایش کارایی سیستم میشود. از طرفی، در صورت پیادهسازی نادرست، ممکن است با مشکلاتی همچون شرایط رقابتی (Race Conditions) و خطاهای تصادفی دیگر روبرو شویم.
در این راستا، طراحی صحیح بسیار حیاتی است. در برنامهنویسی امبدد که از منابع محدود استفاده میکنیم، طراحی بسیار اهمیت دارد؛ زیرا مشکلات وقفهای ممکن است بهشدت مقاوم در برابر اشکالیابی و دیباگ باشند.
به دنیای برنامهنویسی امبدد خوش آمدید.