امروزه سیستم عاملهای بلادرنگ[1] کاربرد گسترده و روز افزونی در سیستمهای Embedded دارند. سیستم عامل با مدیریت کارامد سخت افزار باعث افزایش کارایی و قابلیت اطمینان سیستم میشود. همچینین با فراهم نمودن لایهای بین سخت افزار موجب سادگی فرآیند توسعه نرم افزار میشود.
سیستم عامل مبحث بسیار گستردهای است. لذا در اینجا فقط به بیان مفاهیمی از آن که در سیستم های Embedded و به ویژه سیستمهای میکروکنترلی نیاز است پرداخته شده است.
فهرست مطالب
سیستم عامل بلادرنگ
سیستم عامل بلادرنگ از ادغام دو عبارت سیستم عامل و سیستم بلادرنگ تشکیل شده است. سیستم عامل به نرم افزاری گفته می شود که سخت افزار را مدیریت کرده و بستری را فراهم می کند تا نرم افزار های کاربر در آن اجرا شوند. بعنوان مثال سیستم عامل ویندوز یکی از نمونههای شناخته شده است که محیطی فراهم می آورد که برنامههای کاربر نظیرGoogle Chrome، Microsoft Word و … در آن به بدون درگیر شدن با جزئیات سخت افزار براحتی اجرا شوند. امروزه حتی تصور استفاده از کامپیوترهای شخصی بدون سیستم عامل غیر ممکن است. سیستم عاملها معمولا سرویسهایی نظیر مالتی تسکینگ، همزمان سازی، کنترل وقفه و ایونت، ارتباط بین تسک ها و تایمر و مدیریت حافظه و … فراهم می کنند. سیستم های بلادرنگ نیز به سیستم های گفته می شود که در آنها درستی پاسخ علاوه بر نتیجه منطقی، به زمان تولید آن نیز وابسته باشد. لذا سیستم عامل بلادرنگ به سیستم عاملی گفته می شود که علاوه بر فراهم نمودن نتیجه منطقی صحیح در مدت زمان معین پاسخ را فراهم آورد. ساختار پایه سیستم عامل بلادرنگ شبیه سیستم عامل های معمولی است که علاوه بر آن، امکان مدیریت زمانی تسک ها را فراهم میکند. سسیتم عامل بلادرنگ همیشه باعث افزایش سرعت سیستم نمی شود ولی مشخصه های زمانی دقیق تری ارایه می دهد. در واقع سرعت سیستم را سخت افزار سیستم مشخص میکند.
امروزه سیستم عامل های بلادرنگ کاربرد گسترده ای در سیستم Embedded دارد. همه سیستم های Embedded با استفاده از سیستم عامل طراحی نمیشوند. در مواردی که نرم افزار سیستم ساده و کوچک باشد نیازی به استفاده از سیستم عامل نیست ولی هنگامی که نرم افزار بزرگ و پیچیده باشد، استفاده از سیستم عامل ضروری است.
تفاوت سیستم عامل های بلادرنگ با سیستم عامل های عمومی
در این بخش تفاوت سیستم عاملهای بلادرنگ با سیستم عاملهای عمومی بیان شده است. منظور از سیستم عاملهای عمومی سیستم عاملهایی نظیر ویندوز است. در این قسمت سیستم عاملا بلادرنگ را در سه مشخصه زیر با سیستم عامل عمومی مقایسه شده است.
- Determinism
تفاوت اصلی سیستم عامل های بلادرنگ با سیستم عاملهای عمومی ویژگی Determinism آنها است. در این مبحث Determinism به معنای مشخص بودن دقیق مدت زمان اجرای هر تسک است. در سیستم عامل های بلادرنگ همواره بیشترین مدت زمان اجرای هر تسک مشخص است. ولی در سیستم عامل های عمومی مدت زمان اجرای هر تسک مهم نیست.
- مدیریت تسکها
سیستم عاملهای عمومی طوری طراحی میشوند تا چندین تسک مختلف بصورت همزمان اجرا شوند. لذا کلیه تسکها بدون توجه به اولویت آنها اجرا میشوند. لذا ممکن است تسکی با اولویت پایین به تسک با اولویت بالاتر مقدم شود. ولی در سیستم عامل های بلادرنگ هر گاه یک تسک با اولویت بالاتر نیاز به سخت افزار داشته باشد، تسک در حال اجرا متوقف شده و تسک با اولویت بالاتر کنترل سخت افزار بعهده میگیرد. هر تسک در سیستم عامل های بلادرنگ دارای مشخصه اولویت است. Scheduler از این تسکهایی که در حالت کاری Ready قرار دارند.
- کرنل Preemptive
سیستم عامل های بلادرنگ بصورت Preemptive هستند بطوریکه وقتی یک تسک با اولویت بالاتر نیاز به اجرا داشته باشد، تسک با اولویت پایین متوقف شده و تسک با اولویت بالاتر اجرا میشود. این امر موجب میشود که سیستم به رویدادهای مهم، سریع پاسخ دهد.
- کاربرد
سیستم عامل های بلادرنگ غالبا در سیستمهای Embedded استفاده میشوند ولی سیستم عاملهای عمومی در کامپیوترهای شخصی و دیگر کامپیوترهایی که استفاده همه منظوره دارند، استفاده میشوند
انواع سیستم عامل های بلادرنگ
سیستم عامل های بلادرنگ نسبت به درجه تحمل از دست دادن Deadline به سه دسته زیر تقسیم می شوند.
- سیستم عامل های Hard Real-Time
در این نوع سیستم عامل درجه تحمل از دست دادن Deadline بسیار ناچیز است و از دست دادن Deadline موجب شکست کل سیستم می شود.
- سیستم عامل های Firm Real-Time
در این سیستم عامل ها از دست دادن Deadlineموجب افت کیفیت سیستم میشود ولی موجب شکست کل سیستم نمی شود.
- سیستم عامل های Soft Real-Time
در این سیستم عامل ها ممکن است Deadline ها از دست بروند و موجب شکست کل سیستم نمی شود و سیستم نیز کیفیت قابل قبولی دارد.
در کاربردهایی نظیر باز شدن کیسه هوای خودرو اندکی تاخیر میتواند تلفات جبران ناپذیری داشته باشد. لذا در این گونه کاربردها سیستم حتما باید Hard Real-Time باشد. در صورتیکه در سیستم هایی نظیر پخش زنده تلویزیون اندکی تاخیر قابل پذیرش است و می توان از سیستم عامل های Soft Real-Time استفاده نمود.
ساختار سیستم عامل های بلادرنگ
سیستم عاملهای بلادرنگ های ساده تنها از کرنل تشکیل شدهاند. هر چه به پیچیدگی سیستم افزوه شود بلوکهایی نظیر فایل سیستم، پروتکلهای شبکه و … به آن اضافه میشود. ساختار کلی سیستم عاملهای بلادرنگ در شکل 1 نشان داده شده است. در ادامه کرنل که مهمترین بخش سیستم عامل است بررسی شده است.
کرنل
کرنل در واقع هسته مرکزی سیستم عامل است و بعنوان لایه بین سخت افزار و نرم افزار کاربر عمل می کند. در حالت کلی کرنل ها به سه دسته Monolithic Kernel ، Microkernel و Hybrid Kernel تقسیم می شوند.
- Monolithic Kernel
در این نوع کرنل یک برنامه مسئول اجرای کلیه تسک های مرتبط با کرنل است. کرنل کلیه سرویس موردنیاز نظیر مدیریت حافظه، مدیریت وقفه و … را بر عهده دارد. در این نوع کرنل نسبت به سایر کرنلهای دیگر تعداد Context Switching و Messaging بسیار کمتر است لذا نسبتا سریعتر است. سیستم عامل های Linux و FreeBSD و … در این گروه قرار دارند.
- Microkernel
این نوع کرنل حداقل سرویسهای لازم نظیر مدیریت حافظه، ارتباط بین تسکها و مدیریت تسکها را فراهم میکند و سایر سرویسها مستقیما توسط کرنل انجام نمیشود. Microkernel نسبت به کرنل Monolithic پایدارتر است چرا که با در صورتیکه هر یک از سرویس دهنده (مانند فایل سیستم) دچار مشکل شود، موجب شکست کرنل نمیشود. کرنلهایی نظیر QNX و MINIX در گروه قرار دارند.
- Hybrid Kernel
کرنل Hybrid در واقع ترکیبی از کرنلMonolithic و Microkernel است. کرنل Hybrid سرعت و سادگی طراحی کرنل Monolithic و ساختار ماژولار کرنل Microkernel را داراست.
کرنل مسئول مدیریت سخت افزار و ارائه سرویس به سایر نرم افزارها است. در شکل 2 سرویسهایی که اکثر کرنلها ارائه میدهد، نشان داده شده است.
Task Management
در سیستم عامل های Embedded نرم افزار سیستم به بخش های کوچک و قابل اجرا به نام تسک تجزیه می شوند. هر تسک با سه مشخصه زمانی Release Time و Deadline و Execution Time مدیریت می شوند. Release Time به زمانی اشاره میکند که تسک می تواند آغاز شود. Deadline زمان اتمام تسک را مشخص می کند و در نهایت Execution Time مدت زمانی که طول می کشد تا تسک اجرا شود را مشخص می کند.
هر تسک در می تواند در هر یک از حالتهای زیر باشد.
- Dormant: در این حالت کاری تسک نیازی به زمان پردازش و سخت افزار ندارد.
- Ready: در این حالت کاری تسک منتظر دریافت نوبت است تا به حالت کاری Activeبرود.
- Active: در این حالت کاری تسک در حال اجرا است و پردازنده را در اختیار دارد.
- Suspend: در این حالت کاری تسک موقتا غیر فعال است.
- Pending: تسک منتظر منابع است.
زمانی که نرم افزار کاربر در حال اجراست هر یک از تسک ها دایما در حال رفتن از یک حالت کاری به حالت کاری دیگر هستند. ولی نکته مهم اینجاست که در هر لحظه تنها یک تسک در حالت کاری Active است.
به فرآیندی که در آن مدیریت پردازنده از یک تسک به تسک دیگر انتقال می یابد و داده ها و وضعیت تسک در حال اجرا در حافظه ذخیره شده و داده ها و وضعیت تسک بعدی از حافظه بازیابی میشود، Context Switching گفته میشود. Scheduler وضعیت کلیه تسک ها را نگه میدارد و از بین تسک هایی که در حالت کاری Readyقرار دارند با توجه به الگوریتم مشخصی انتخاب کرده و مدیریت سخت افزار را به آن واگذار می کند.
البته لازم به ذکر است که هر سیستم عامل ماشین حالت کاری خود را دارد. بعنوان مثال در سیستم عامل FreeRTOS ماشین حالت بصورت شکل 3 است.
الگوریتم های Scheduling
در هر سیستم عامل Scheduler به روشهای مختلفی تسکها را مدیریت میکند. در این قسمت روشهای مختلف Scheduling بررسی شده است.
روش Run To Completion
RTC اولین و ساده ترین روشScheduling است. در این روش تسک در حال اجرا تا زمانیکه به اتمام نرسیدهاند، سخت افزار را در اختیار دارند. تسکها به ترتیب اجرا میشوند و بعد از اجرای آخرین تسک مجددا تسک اول اجرا میشود. در شکل 5 چگونگی اجرای تسکها نشان داده شده است.
مزیت این روش به سایر روشهای دیگر سادگی آن است. مهمترین اشکال این روش وابسته بودن زمان شروع تسک به تسکهای دیگر است. لذا سیستم اصلا Deterministic نیست.
روش Round Robin
روش RR بسیار شبیه روش RTC است با این تفاوت که تسکها میتوانند قبل از به پایان رسیدن میتوانند متوقف شوند و کنترل پردازنده را به تسک دیگری واگذار کنند. در شکل 6 چگونگی اجرای تسکها نشان داده شده است.
این روش نسبت به روش RTC انعطاف پذیری بالاتری دارد ولی در عوض پیچیدگیهای بیشتری به سیستم تحمیل میکند. چرا که هنگامی که تسک قبل از به اتمام رسیدن متوقف میشود نیازمند Context Switching است.
روش Time Slicing
در این روش زمان به واحدهای کوچکتری به نام Slot تقسیم میشود. در هر Slot یک تسک اجرا میشود. پس از پایان Slot تسک متوقف شده و تسک بعدی شروع میشود. این روش نسبت به روشهای قبل مشخصههای زمانی دقیقتری دارد. در شکل 7 چگونگی اجرای تسکها نشان داده شده است.
روش Time slice with background task
روش TS هر چند مشخصههای زمانی دقیقی دارد ولی در صورتیکه تسک نیازی به پردازش نداشته باشد باید تا زمان شروع تسک بعدی در یک حلقه خالی منتظر بماند که موجب اتلاف زمان پردازنده میشود. یک روش برای جلوگیری از اتلاف زمان پردازنده شروع تسک بعدی بلافاصله پس ازاتمام تسک در حال اجرا است. این روش در شکل 7 نشان داده شده است.
هر چند در این روش از اتلاف زمان پردازنده جلوگیری میشود ولی رفتار Deterministic سیستم از بین میرود. برای حل این مشکل روش TSBG پیشنهاد شده است. در این روش تسکها در زمانهای مشخصی شروع میشوند و هر تسک میتواند زودتر از پایان زمان Slot به اتمام برسند. ولی به جای شروع تسک بعدی، تسک Background اجرا میشود. در تسک Background اقداماتی نظیر مدیریت حافظه و … انجام میشود. لازم به ذکر است که تسک Background نمیتواند Suspend شود.
روش Priority
روش PRI روشی متداول و کارا برای Scheduling است که در اکثر سیستم عاملهای بلادرنگ استفاده میشود. در این روش هر تسک دارای اولویتی مشخصی است. Scheduler از بین تسکهایی که در حالت ready قرار دارند، تسک با بالاترین اولویت انتخاب میکند. هنگامی که وقفهای روی دهد ممکن است تسک با اولویت بالا را به حالت Ready ببرد. در این حالت Scheduler سریعا تسک با اولویت بالا را اجرا میکند. لذا سیستم میتواند به رخدادهای سیستم سریع پاسخ دهد.
Synchronization and Communication
Synchronization و Communicationاین امکان را فراهم میکند که تسکها بطور همزمان از منابعی مانند بافر و … استفاده کنند. بعنوان مثال تسک 1 به نتایج تسک 2 نیازمند است بنابراین تسک 2 هنگامی می تواند اجرا شود که تسک 2 نتایج موردنظر را فراهم کند.
همزمانی بین تسک ها با استفاده از مکانیزم زیر انجام می شود.
Event Object
از Event Object هنگامی استفاده می شود که همزمان سازی بین تسکها بدون اشتراک داده مورد نیاز باشد. Event Object به یک یا چند تسک اجازه می دهند تا منتظر رخداد بمانند.
Semaphore
سمافور دارای منابع خاصی برای شمارش منابع وQueue انتظار است. شمارنده تعداد منابع موجود را مشخص میکند.
سمافور همانند یک کلید که دسترسی تسک به منبع مورد نظر را مشخص میکند، عمل میکند. یک تسک تنها زمانی میتوانند به منبع مشترک دسترسی داشته باشد که سمافور را بدست آورده باشند. سه نوع سمافور وجود دارد.
- Binary Semaphore
- Counting Semaphore
- Mutually Exclusion (Mutex) Semaphore
در شکل زیر چگونگی عملکرد سمافور نشان داده است.
Intertask communication
ارتباط بین تسک ها شامل اشتراک داده و منابع و همچنین ارسال داده بین تسک ها میشود. ارتباط بین تسک ها با استفاده از مکانیزم زیر انجام میشود.
Message Queue
Message Queue ابزاری است که برای به منظور تبادل داده بین تسک ها است که تسک داده را با آن ارسال و یا از آن دریافت میکند. Queue میتواند بصورت First In First Out (FIFO) ، Last In First Out (LIFO) و یا Priority (PRI) sequence باشد. معمولا یک Message Queue از یک بلوک کنترلی Queue، نام، ID منحصر بفرد، طول Queue، بیشترین طول Message و یک یا چند لیست تسکهای منتظر تشکیل میشوند.
Pipe
Pipe ها ابزاری است کانل ساده ارتباطی برای دادههای بدون ساختار بین تسک ها فراهم می کنند.
Remote Procedure Call
این مکانیزم برای ارتباط بین تسک ها در سیستم عاملهای distributed بر روی پردازنده های دیگر فراهم میآورد.
Memory Management
در حالت کلی دو نوع مدیریت حافظه در سیستم عاملهای بلادرنگ وجود دارد: Heap و Stack
هنگام Context Switching از حافظه Stack استفاده میشود. هر تسک Stack خاص خود را دارد. حافظه Heap برای اختصاص دینامیکی حافظه استفاده می شود.
Timer Management
برای اینکه تسکها، بطور دقیقی برنامه ریزی شوند و یا جهت انجام Delay های نرم افزاری و … سیستم عامل دارای API مختلف Timer است.
Interrupt and event handling
سیستم عامل های بلادرنگ توابع متعددی برای مدیریت interrupt و event فراهم می کنند. از جمله این توابع می توان به تعریف handler وقفه، تعریف یا حذف ISR و … فراهم میکنند.
evice I/O Management
سیستم عاملهای بلادرنگ معمولا دارای API های متعددی برای پشتیبانی از درایورهای ادوات مختلف هستند.