رضا شکری
رضا شکری
خواندن ۱۰ دقیقه·۲ روز پیش

توسعه نرم افزار بلادرنگ (Real Time)

همه ما روزانه از سیستم‌هایی استفاده می‌کنیم که نسبت به پارامتر زمان حساس هستند. از تلفن همراه‌ که در لحظه و با تاخیر اندکی تماس ورودی را به ما اطلاع می‌دهد تا مشاهده ویدئو از سرویس‌های پخش آنلاین که تمایل داریم با کمترین تاخیر ممکن و بیشترین کیفیت ممکن، ویدئو را مشاهده کنیم. به اینگونه سرویس‌ها که نسبت به پارامتر زمان حساس‌اند، سیستم‌های بلادرنگ گفته می‌شود.

سیستم‌های بلادرنگ علاوه بر کاربرد وسیع در صنایع مختلف، با کاهش خطای عامل انسانی در محاسبات دقیق و پیچیده، باعث افزایش دقت، اطمینان پذیری و پیش بینی پذیری نیز می‌شوند؛ اما به همان اندازه که کاربرد بسیاری دارند، معمولا هزینه‌ حفظ و نگهداری اینگونه سیستم‌ها بالاست. علاوه بر این، پیچیدگی‌های بسیاری در طراحی و پیاده‌سازی نیز دارند. سیستم‌ باید به گونه‌ای طراحی شود که کمترین خطای ممکن را در مهلت تعیین شده داشته باشند. یعنی می‌بایست علاوه بر صحت پاسخ، در زمان نسبتا کوتاهی این پاسخ را تولید کرده باشند. مانند پخش ویدئو آنلاین. به همین علت در این مقاله به نحوه طراحی و توسعه سیستم‌های بلادرنگ و مراحل آن پرداخته‌ایم.

همانگونه که بیان شد، سیستم‌های بلادرنگ یا سیستم‌های Real Time به سیستم‌های پردازش اطلاعاتی گفته می‌شود که به پارامتر زمان حساس‌اند. یعنی پاسخ سیستم‌ به رویدادها یا انجام وظایف محول شده به سیستم، باید در یک محدویت زمانی مشخصی صورت بپذیرد؛ که معمولا این بازه زمانی بسیار کوتاه است و عدم پاسخ سیستم در بازه معین شده، می‌تواند منجر به شکست سیستم یا بروز اختلال در سیستم شود. سیستم‌های بلادرنگ به‌طور گسترده‌ای در حوزه‌هایی مانند پزشکی، حمل‌ونقل، نظامی و صنایع خودکار استفاده می‌شوند.

اجزای اصلی یک سیستم بلادرنگ
اجزای اصلی یک سیستم بلادرنگ


ویژگی‌های مهمی که در ارزیابی یک سیستم بلادرنگ مورد استفاده قرار می‌گیرد عبارتند از:
پاسخ در زمان مناسب:‌ سیستم بلادرنگ باید توانایی تولید نتیجه مورد انتظار و صحیح در یک مهلت زمانی مشخص را دارا باشد. در سیستم‌های بلادرنگ، برای هر وظیفه یا رویدادی که باید انجام شود، یک زمان دقیق به عنوان "مهلت" (deadline) تعیین می‌شود که سیستم موظف به انجام وظایف در این مهلت تعیین شده است.

هماهنگی زمانی بین اجزای مختلف سیستم: از آنجایی که سیستم‌ها معمولا از اجزای مختلفی مانند چندین پردازنده یا چندین سرویس دیگر و ... استفاده می‌کند، هماهنگی موقعیت زمانی بین اجزای سیستم برای انجام فعالیت‌ها به طور هماهنگ و هم‌زمان، ضرورت پیدا می‌کند.

سیستم‌های بلادرنگ را می‌توان بر اساس محدودیت زمانی به سه دسته تقسیم کرد. سیستم‌های بلادرنگ سخت که عدم رعایت محدودیت زمانی می‌تواند منجر به خسارت فاجعه‌باری شود. مانند سیستم‌های کنترل هواپیما، تجهیزات پزشکی. سیستم‌های بلادرنگ نرم، سیستم‌هایی هستند که تاخیر در پاسخگویی، منجر به فاجعه نمی‌شود اما با گذر زمان از کیفیت سیستم می‌کاهد. به بیان دیگر در سیستم‌های نرم، حدی از تاخیر قابل قبول است. مانند سرویس بازی‌های آنلاین. و دسته سوم، سیستم‌های بلادرنگ زمان ثابت هستند؛ اگر وظیفه‌ای در زمان مشخص خود انجام نشود، نتیجه آن بی‌فایده است، اما خرابی فاجعه‌باری رخ نمی‌دهد.مانند سیستم کنترل کیفیت در خط تولید.

توسعه نرم افزار بلادرنگ

توسعه نرم افزار بلادرنگ، با چالش‌هایی روبروست و نیاز به برنامه‌ریزی دقیق و استفاده از روش‌های خاصی دارد تا بتوان سیستم را با جزئیات دقیق، مانند مهلت‌های زمانی برای پاسخگویی سیستم، نحوه پاسخ سیستم، انواع محرک‌های سیستم و .. مشخص کرد و در مراحل بعدی سیستمی طراحی و پیاده سازی کرد که قابلیت اطمینان پذیری و پیش‌بینی پذیری بالایی داشته باشد. در ادامه مراحل مختلف توسعه را با هم بررسی می‌کنیم.

مهندسی الزامات (Requirement Engineering)

اهمیت مشخص کردن نیازمندی‌های سیستم برای طراحی بهتر و دقیق‌تر پرواضح است، و هر سیستمی که نیازمندی‌های شفافی نداشته باشد، در مراحل طراحی و پیاده سازی با مشکلاتی روبرو می‌شود که حل آن‌ها بسیار هزینه‌بر است. این بخش از توسعه نرم افزار، برای سیستم‌های بلادرنگ اهمیت دوچندانی دارد. زیرا که عدم شفافیت در نیازمندی‌های سیستم، می‌تواند منجر به شکست‌های فاجعه‌باری برای سیستم شود. یک سیستم ترمز خودکار اتوموبیل را در نظر بگیرید؛ اگر نیازمندی "ترمز گرفتن در زمان خیس بودن زمین" در نظر گرفته نشود، می‌تواند منجر به خسارت‌های جبران ناپذیری شود.

۱- تعریف عملکرد و رفتار سیستم

اولین قدم این است که وظایف بلادرنگ سیستم به‌طور واضح تعریف شوند. این وظایف ممکن است شامل دریافت داده‌های ورودی، پردازش آن‌ها، و ارسال خروجی‌ها در زمان‌های مشخص باشد. یکی از موارد کلیدی در این مرحله، تعیین مهلت‌های زمانی دقیق برای هر وظیفه است. این مهلت‌ها باید با نیازهای کاربردی سیستم همخوانی داشته باشند. همچنین باید به تعاملات سیستم با محیط فیزیکی و سایر اجزای بیرونی توجه ویژه‌ای داشت. برای مثال، در سیستم ترمز خودکار اتوموبیل، سیستم باید قادر باشد سنسورها را به‌طور دقیق و آنی بررسی کرده و به تغییرات در زمان واقعی پاسخ دهند.

۲- شناسایی محدودیت‌های منابع

در این بخش، باید منابع موجود مانند پردازنده، حافظه، و پهنای باند ارتباطی مورد ارزیابی قرار گیرند. این محدودیت‌ها بر روی انتخاب الگوریتم‌ها و روش‌های مختلف پردازشی تأثیر می‌گذارند. به‌طور خاص، باید توجه داشت که در سیستم‌های بلادرنگ اغلب منابع محدود هستند، بنابراین انتخاب منابع و مدیریت صحیح آن‌ها از اهمیت بالایی برخوردار است. غالبا در سیستم‌های بلادرنگ، محدودیت منابع، تاثیر مستقیم بر زمان پاسخ سیستم دارند. بنابراین شناسایی آن‌ها، تاثیر مستقیم بر عملکرد کلی سیستم دارد.

۳- تعیین ویژگی‌های کیفی

در این بخش باید ویژگی‌های کیفی مختلفی نظیر قابلیت اطمینان، میزان تحمل خطا، امنیت و عملکرد سیستم تعیین شوند. به‌عنوان مثال در سیستم ترمز خودکار، اطمینان از عملکرد صحیح و بدون خطا بسیار حیاتی است، به‌طوری که حتی یک خطای کوچک می‌تواند جان انسان‌ها را به خطر بیندازد.اما در یک سیستم پخش بازی‌های ویدیویی آنلاین، درصدی از تاخیر قابل قبول است.

۴- استفاده از ابزارهای مدل‌سازی بلادرنگ

ابزارهای مدل‌سازی مانند UML (Unified Modeling Language) یا MARTE (Modeling and Analysis of Real-Time Embedded Systems) می‌توانند کمک کنند تا رفتار سیستم و محدودیت‌های زمانی به‌طور تصویری نمایش داده شوند. بصری‌سازی سیستم به همراه محدودیت‌های سیستم، هم موجب تعامل آسان‌تر با مشتری سرویس می‌شود، هم به طراحان و معماران سیستم کمک می‌کند تا طراحی و معماری دقیق‌تری داشته باشند.

فریم ورک MARTE یک فریم‌ورک استاندارد است که توسط OMG (Object Management Group) برای مدل‌سازی، تحلیل و طراحی سیستم‌های بلادرنگ ایجاد شده است. این فریم‌ورک به‌طور خاص برای طراحی سیستم‌هایی دارای منابع محدودیت سخت افزاری (مانند پردازش، حافظه، و پهنای باند) و مهلت‌های زمانی دقیق، توسعه یافته است. MARTEبه مهندسان و طراحان سیستم این امکان را می‌دهد تا رفتار، زمان‌بندی، و نیازمندی‌های منابع سیستم‌های بلادرنگ را مدل‌سازی کرده و آن‌ها را تحلیل کنند.
نمای فریم ورک MARTE
نمای فریم ورک MARTE

طراحی و معماری

دومین مرحله بعد از مشخص شدن نیازمندی‌ها، طراحی و معماری سیستم است. طراحی و معماری سیستم، گام قبل از آغاز توسعه و پیاده سازی است، بنابراین باید با دقت انجام شود زیرا رفع مشکلات در این قسمت، بسیار کم هزینه‌تر است رفع مشکل در هنگام توسعه و تکامل نرم افزار است.

۱- تقسیم وظایف و اولویت‌بندی مهلت‌ها

در این مرحله، وظایف سیستم باید به‌طور مؤثر تقسیم و اولویت‌بندی شوند. برخی از وظایف ممکن است بحرانی‌تر از بقیه باشند و نیاز به مهلت‌های زمانی دقیق‌تری داشته باشند. از این رو، تقسیم مناسب وظایف و تخصیص مهلت‌ها بر اساس اولویت‌ها و از سویی محدودیت منابع، از اهمیت زیادی برخوردار است. برای مثال، در یک سیستم بلادرنگ که مسئول کنترل یک ربات است، وظیفه تشخیص برخورد باید در اولویت باشد، زیرا تأخیر در آن ممکن است باعث آسیب به ربات شود.

۲- انتخاب سیستم عامل بلادرنگ (RTOS)

وظیفه اصلی یک سیستم عامل مدیریت کردن منابع و فعالیت‌های سخت افزاری در سیستم می باشد. سیستم عاملی که توانایی مدیریت همزمان چندین رویداد را دارد تا اطمینان حاصل کند که سیستم به آن رویدادها در محدوده زمانی قابل پیش بینی پاسخ دهد، سیستم عامل بلادرنگ نامیده می شود.

انتخاب صحیح سیستم عامل بلادرنگ نقشی حیاتی در زمان‌بندی وظایف و مدیریت منابع دارد. در انتخاب یک RTOS، باید نیازهای خاص سیستم از جمله قدرت پردازشی، میزان حافظه و نیاز به زمان‌بندی دقیق در نظر گرفته شوند. برای مثال، سیستم‌های RTOS مانند FreeRTOS یا VxWorks برای سیستم‌های با منابع محدود و نیاز به عملکرد بالا مناسب هستند.

۳- طراحی پروتکل‌های ارتباطی

در سیستم‌های بلادرنگ، پروتکل‌های ارتباطی باید به‌طور خاص طراحی شوند تا بتوانند داده‌ها را به‌طور مؤثر و بدون تأخیر در بین وظایف یا با دستگاه‌های خارجی منتقل کنند. این ارتباطات ممکن است شامل ارسال سیگنال‌های اضطراری یا داده‌های حسگری از محیط باشد.به طور کلی ارتباط بین اجزای مختلف سیستم باید در کمترین زمان ممکن رخ دهد.

۴- پیاده‌سازی مکانیزم‌های مدیریت خطا

این بخش بیان می‌کند که سیستم در صورت بروز خطا باید چه عملیاتی را انجام دهد. این عملیات‌ها می‌توانند شامل کاهش تدریجی عملکرد یا خاموش شدن ایمن سیستم باشند. در بعضی از سیستم‌ها هنگام بروز خطا سرویس نباید متوقف شود، مانند قطع شدن لحظه‌ای هنگام پخش ویدئو آنلاین. در بعضی از سیستم‌ها، هنگام بروز خطا سیستم باید از فعالیت متوقف شود. همچنین مشخص کردن میزان مدیریت خطا نیز حائز اهمیت است که تا چه میزانی از خطا برای سیستم قابل تحمل است. مکانیزم‌های مدیریت خطا و تحمل خطا باید به‌گونه‌ای طراحی شوند که سیستم بتواند در صورت بروز خطا به‌طور صحیح عمل کند.

پیاده‌سازی و کدنویسی

در این مرحله، توسعه‌دهندگان نرم‌افزار باید کدهای لازم برای پیاده‌سازی سیستم بلادرنگ را بنویسند. این مرحله بسیار حساس است زیرا هرگونه اشتباه در کدنویسی می‌تواند منجر به از دست دادن عملکرد صحیح سیستم شود.

۱- استفاده از زبان‌های برنامه‌نویسی بلادرنگ

زبان‌های برنامه‌نویسی مانند ++Ada، C/C یا Java می‌توانند برای توسعه نرم‌افزارهای بلادرنگ استفاده شوند. این زبان‌ها به دلیل ویژگی‌هایی نظیر زمان‌بندی پیش‌بینی‌پذیر و رفتار تعیین‌شده و نزدیک به زبان ماشین، برای سیستم‌های بلادرنگ مناسب هستند. به‌ویژه زبان Ada به‌طور خاص برای توسعه سیستم‌های بلادرنگ طراحی شده است.

۲- استفاده از شیوه‌های کدنویسی بلادرنگ

در این مرحله باید از شیوه‌های خاص کدنویسی برای سیستم‌های بلادرنگ پیروی کرد. این شیوه‌ها شامل اجتناب از تخصیص حافظه پویا، به حداقل رساندن تعویض زمینه‌ها، و استفاده از الگوریتم‌های بهینه می‌شود. همچنین باید از روش‌های خاص برای مدیریت خطا و جلوگیری از بروز مشکلات استفاده کرد.

۳- ماژولار کردن کد و اعمال استانداردهای کدنویسی

کد باید به‌طور ماژولار نوشته شود تا نگهداری و تست آن آسان‌تر باشد. استفاده از استانداردهای کدنویسی دقیق به کاهش احتمال بروز خطا کمک می‌کند و کیفیت نرم‌افزار را افزایش می‌دهد.

۴- انجام تست‌های واحد به‌طور زودهنگام و مکرر

تست‌های واحد به‌طور مکرر باید انجام شوند تا اطمینان حاصل شود که هر ماژول به‌درستی عمل می‌کند و الزامات زمانی را رعایت می‌کند. این تست‌ها به شناسایی مشکلات پیش از رسیدن به مراحل بعدی توسعه کمک می‌کنند. لازم است تا تست‌های بررسی الزامات زمانی، به طور دقیق و با بررسی تمام نقاط گوشه‌ای (Corner States) نوشته شود تا در هنگام توسعه و تکامل نرم افزار، از حفظ صحت عملکرد هر بخش از کد اطمینان داشته باشیم.

یکپارچه‌سازی و آزمایش

در این مرحله، اجزای مختلف سیستم با یکدیگر یکپارچه شده و آزمایش‌های مختلفی برای ارزیابی عملکرد کلی سیستم انجام می‌شود. پس از پیاده‌سازی کدها، زمان آن رسیده است که اجزای مختلف سیستم به‌طور یکپارچه تست شوند. تعاملات بین وظایف مختلف و همچنین ارتباط با محیط باید به‌طور دقیق بررسی شوند تا از عملکرد صحیح سیستم اطمینان حاصل شود. این اطمینان همانگونه بیان شد، باید هم رعایت محدودیت‌های زمانی و هم تولید پاسخ صحیح باشد.

۱- انجام تست‌های عملکردی

تست‌های عملکرد به‌منظور ارزیابی استفاده از منابع سیستم و بررسی اینکه آیا سیستم می‌تواند مهلت‌های خود را رعایت کند یا خیر، انجام می‌شوند. این تست‌ها به شناسایی مشکلات بالقوه مانند مصرف زیاد منابع یا گلوگاه‌های عملکرد (Performance Bottleneck) کمک می‌کنند.

۲- انجام تست‌های استرس و تزریق خطا

تست‌های استرس و تزریق خطا به‌منظور شبیه‌سازی سناریوهای بحرانی و بررسی استحکام سیستم تحت شرایط فشار انجام می‌شوند. این تست‌ها اطمینان می‌دهند که سیستم در شرایط غیرمنتظره نیز به‌درستی عمل خواهد کرد. برای انجام اینگونه از تست‌ها، معمولا سیستم را در شرایط خاصی، مانند کاهش منابع، حجم زیاد ورودی و ... قرار می‌دهند. وجود اینگونه تست‌ها برای سیستم‌های بلادرنگ اهمیت بالایی دارد، چون سیستم بلادرنگ باید توانایی انجام فعالیت خود را تحت هر شرایطی داشته باشد. به خصوص اگر سیستم، بلادرنگ سخت باشد.

۳- استقرار و نگهداری

پس از موفقیت‌آمیز بودن آزمایش‌ها، سیستم آماده استقرار بر روی سخت‌افزار هدف باشد. نرم‌افزار باید بر روی سخت‌افزار هدف بارگذاری و پیکربندی شود. این مرحله باید با دقت انجام شود تا اطمینان حاصل شود که سیستم بر روی سخت‌افزار مناسب اجرا خواهد شد. علاوه بر این باید مکانیزم‌های نظارت و ثبت وقایع توسعه یابند تا عملکرد سیستم به‌طور مداوم پیگیری شود. این مکانیزم‌ها می‌توانند مشکلات پیش‌آمده را شناسایی کرده و به تیم پشتیبانی اطلاع دهند. و نرم‌افزار باید به‌طور مرتب به‌روز شود و هرگونه اشکال یا آسیب‌پذیری‌ها باید رفع شوند. این کار به حفظ امنیت و عملکرد سیستم در طول زمان کمک می‌کند.

توسعه نرم‌افزار برای سیستم‌های بلادرنگ یک فرآیند پیچیده و چالش‌برانگیز است که نیاز به دقت بالا و رعایت اصول خاص دارد. از مهندسی الزامات گرفته تا طراحی و پیاده‌سازی دقیق، هر مرحله نیاز به توجه ویژه‌ای دارد که شاید در سیستم‌های دیگر اهمیت چندانی نداشته باشد.

توسعه نرم افزارsoftware engineeringنرم افزار
شاید از این پست‌ها خوشتان بیاید