!RTOS In Microcontrollers!
RTOS(Real Time Operating System) یا به عبارت دیگر سیستم عامل بلادرنگ حوزه ای بسیار جذاب و پر از سوال در زمینه برنامه نویسی و کار با انواع میکروکنترلرها است که نیاز به درک عمیقی از چگونگی کارکرد پریفرال های داخلی میکرو از جمله انواع حافظه ها ، تایمرها و …داره. در این مجموعه آموزش قصد داریم شما را با RTOS و قبل تر از آن ، هر آن چیزی که برای یادگیری RTOS به آن نیاز دارید ، آشنا کنیم. تا قبل از این آموزش هم،آموزش های بسیار مفیدی در این باره در سیسوگ گذاشته شده که این سری آموزشی نیز قصد دارد با تمرکز بر روی میکروکنترلر های STM32 و تا حد ممکن به صورت پروژه محور این مبحث را برای شما روشن تر سازد.پس با سیسوگ همراه باشید…
قبل از هر چیز باید به یک سوال مهم جواب بدیم تا تکلیفمون با این مجموعه آموزش روشن بشه و بدونیم تو این آموزش قراره چی بدست بیاریم:
?سوال:یک سیستم عامل اصلا چیکار میکنه و چرا ما به اون نیاز داریم؟
یک سیستم عامل مانند ویندوز ، لینوکس ، Free RTOS یا … وظیفه مدیریت حافظه و مدیریت فرایندها(Process) را برعهده دارد.برخی سیستم عامل ها دارای فایل سیستم هستند که در واقع یک ساختار داده است که داده ها و اطلاعات را روی دستگاه های ذخیره سازی(مانند هارد دیسک، فلاپی دیسک و …) ذخیره می کند.همچنین برخی سیستم عامل ها دارای امکاناتی برای ارسال داده ها بین فرایندها و Thread ها هستند.خب از اونجا که میدونم خیلی از شما گوشتون از این تعریف ها پره اما بدنبال درک از این موضوع میگردید،پس من میخوام با تمرکز بر روی “ایجاد تعامل بین فرایندها(مدیریت فرایندها)” که یکی از مهمترین وظایف سیستم عامل هست،موضوع رو برای شما با چند تا مثال روشن کنم.
شاید برای شما مفید باشد: آموزش STM32
مثال 1:
فرض کنید پروژه ای در رابطه با مانیتورینگ آب یک استخر به ما واگذار شده که قراره با میکروکنترلر انجام بشه. در این پروژه دو فرایند اساسی وجود داره : فرایند اول خوانش مقدار یک سنسور تشخیص سطح آب است که باید هر 5000 میلی ثانیه یک بار اتفاق بیفته و اما فرایند دوم خوانش مقدار یک سنسور دما است که باید هر 1000 میلی ثانیه اتفاق بیفته.خب بریم سراغ برنامه نویسی. یکی از کدهایی که میشه نوشت به صورت زیر هست:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void main(){ int a = 0; while(1){ Read_Thermal_Sensor(); if(a == 0){ Read_Level_Water(); a = 5; } else{ a--; } delay(1000); } } |
تا اینجای کار یک کد ساده داریم که میخوایم تحلیلش کنیم:
ابتدا پس از اجرای حلقه بی نهایت، مقدار دمای آب خونده میشه و سپس بررسی میشه که آیا 5000 میلی ثانیه گذشته یا نه که اگر مقدار متغییر a از5 به 0 برسه،با توجه به تاخیر 1000 میلی ثانیه ، یعنی 5000 میلی ثانیه گذشته و مقدار سطح آب نیز تشخیص داده میشود.این برنامه با فرض این نوشته شده که هر کدام از فرایندها تقریبا 0 میلی ثانیه طول میکشه تا اجرا بشه!
حالا می خوایم یک تغییر کوچیک تو همین کد بدیم یعنی میخوایم فرایند اندازه گیری دما هر 1300 میلی ثانیه انجام بشه ولی فرایند تشخیص سطح آب به همون روال قبل انجام بشه،خب در این صورت میبینیم که همین تغییر خیلی کوچیک ، کد ما رو خیلی زیاد تغییر میده !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | void main(){ int a=50, b=13; while(1){ if(b==0){ Read_Thermal_Sensor(); b=13; } else{ --b; } if(a==0){ Read_Level_Water(); a=50; } else{ --a; } delay(100); } } |
حالا یه سوال : به نظر شما اگه به جای دو فرایند ، 3 یا 4 یا n تا فرایند داشته باشیم،برای مثال:کنترل پمپ آب،کنترل المان های حرارتی گرمکن آب،کنترل میزان کلر آب و … که تاخیر زمانی هر کدوم از اونها هم یه جور باشه، کدی که به روش بالا نوشته بشه،خیلی کد شلوغی نیس . به نظرتون تغییر یا دیباگینگ چنین کدی سخت نیس.(به این روش برنامه نویسی که همه برنامه در یک حلقه(Loop) نوشته بشه روش سوپرلوپ میگن)
مثال 2:
حالا میخوام یه مثال کلی تر بزنم که به ظاهر ساده است!فرض کنید دو پروسه داریم که فرایند شماره 1 باید هر 100 میلی ثانیه اجرا بشه و خود فرایند 50 میلی ثانیه اجراش طول میکشه و فرایند شماره 2 نیز باید هر 100 میلی ثانیه اجرا بشه و زمان اجراش تقریبا صفر میلی ثانیه طول میکشه ولی اجراش هر 100 میلی ثانیه ضروری هست که برنامش به صورت زیر میشه:
1 2 3 4 5 6 7 | void main(){ while(1){ Process1(); Process2(); delay(100); } } |
بریم سراغ تحلیل کد:
> وقتی حلقه شروع میشه، ما فرض رو بر این میزاریم که زمان سپری شده صفره.بنابراین Process1 در t=0ms اجرا میشه و Process2 در t=50ms اجرا میشه.
>> در بار دوم اجرای حلقه Process1 در t=150ms اجرا میشه و Process2 در t=200ms اجرا میشه.
به خوبی در این مثال واضحه که پروسه شماره 2 که انجامش هر 100 میلی ثانیه ضرورری بود، هر صد میلی ثانیه اجرا نمیشه در صورتی که در RTOS به سادگی میتوان این کار را انجام داد.
بنابراین ما به سیستم عامل نیاز داریم زیرا میخوایم بین فرایندهای برنامه مون ارتباط و تعامل وجود داشته باشه و بتونم کدهای بهینه تری بنویسیم.
خب یه همچنین دلیلی میتونه انگیزه خوبی باشه تا ملت برن سراغ کانفیگ یه سیستم عامل کوچیک و جمع و جور برای مدیریت برنامشون روی میکروکنترلر😊😊
شاید برای شما مفید باشد:
تا اینجا کار فهمیدیم چرا میکرو به سیستم عامل نیاز داره اما کجاها میشه که این سیستم عامل باید RealTime یا به عبارت دیگه بلادرنگ باشه؟برای درک بهتر این مطلب میخوام یه مثال دیگه براتون بزنم:
مثال 3:
فرض کنید پروژه ای به ما پیشنهاد شده که به طور کلی میتوان گفت سیستم مانیتورینگ وضعیت یک خودرو میباشد که به قرار زیر است:
- پایش دمای موتور خودرو و هشدار دادن به موقع افزایش بیش ار حد دما
- خوانش سرعت خودرو و نمایش آن
- خوانش بنزین باقی مانده در باک خودرو
خب همین طور که کارفرما داره توضیح میده و ما هم داریم تو ذهنمون تجزیه و تحلیل میکنیم که چه آشی برای این پروژه بپزیم،به یک باره کارفرما با بیانی شیوا و رسا می فرمایند: “میخوام این کارا به صورت همزمان( بخوانیم موازی(Paraller) ) انجام بشه”
به شخصه خودم تا قبل این مفهوم ، همزمان انجام شدن کارها رو فقط صفر و یک میدیدم یعنی یا پروسه ها به صورت همزمان اتفاق میفته یا نه؟ پس به کارفرما پیشنهاد میدادم که بره سراغ یک گزینه خاص به نام FPGA😒
شاید برای شما مفید باشد: آموزش FPGA
اما باید خدمتتون عرض کنم که RTOS به ما یاد میده که اینطور سوال کنیم که “اجرای فرایند ها به چه میزان همزمانی نیاز داره؟” و با پاسخ به این سوال میفهمیم که برای انجام این پروژه STM32 یا میکروکنترلرهای دیگه هم میتونن ایفای نقش کنن اما چطور میشه CPU که در واحد زمان بیشتر از یک کار رو نمیتونه انجا بده،چند تا فرایند رو به صورت همزمان یا تقریبا همزمان پیش ببره؟برای پاسخ به این سوال با ما در قسمت های بعدی همراه باشید.
به طور خلاصه میتوان گفت که مجموع کارهایی که یک سیستم عامل Free RTOS انجام میده به قرار زیر است:
خب حالا که ضرورت RTOS رو فهمیدیم باید در کنارش بگم قطعا برنامه نویس هایی هستند که میتونن با تکنیکهایی که بلدن پروژه های زیادی را بدون مشکلی پیش ببرن اما برای پروژه های بزرگ روش سوپرلوپ که در مثال های یک و دو نمونه کدهاش رو دیدیم اولین گزینه روی میز هست اما بهترین گزینه نیس.
پاسخ به سوالات شما در رابطه با دوره آموزشی RTOS
خب در انتها میخوام به برخی از سوال های احتمالی شما در رابطه با روند این سری آموزشی پاسخ بدم:
سرفصل های آموزش چیا هست و آموزش به چه صورتی پیش میره؟
هر قسمت از این آموزش با یک یا چند سوال و یک یا چند سرنخ شروع میشه و ما تلاش میکنیم تا پاسخ این سوالات رو به کمک سرنخ ها پیدا کنیم. این آموزش به طور کلی به دو بخش تقسیم میشه:
- هر آن چیزی که باید برای شروع RTOS یاد بگیرید؟؟؟!!!
- آموزش نوشتن یک سیستم عامل RTOS به صورت پایه ای
در این آموزش کدوم سری از میکروکنترلرهای stm32 استفاده میشه؟
باید گفت که از تمامی سری های میکروکنترلرهای stm32 تقریبا میشه استفاده کرد اما در برخی از اونها ممکنه یکم کار سخت بشه اما شما میتونید یکی از بردهای رایج در بازار مثل Bluepill که معرف حضور خیلی از دوستان هست رو تهیه کنید.
این آموزش تحت ویندوزه دیگه؟
این آموزش تحت سیستم عامل لینوکس(یکی از توزیع های debian base مانند Ubuntu) انجام میشه اما کسایی که نمیتونن از ویندوز دل بکنن هم نگران نباشن.مایکروسافت قابلیتی به نام WSL(Windows Subsystem for Linux) به ویندوز اضافه کرده که میتونه محیط ترمینال توزیع های مختلف سیستم عامل لینوکس رو در ویندوز شبیه سازی کنه که در ادامه نصب و راه اندازی اون رو میگم.
آموزش نصب و راه اندازی WSL
مرحله 1: در ابتدا باید نسخه ویندوز را اگر در ویندوز 11 هستید بررسی کنید.نسخه ویندوز شما باید از 22000.0 بالاتر باشد.
مرحله 2:خب حالا که از ورژن ویندوز مطمئن شدیم باید ویژگی های Virtual Machine Platform و Windows Hypervisor Platform و Windows Subsystem for linux را از Windows Feature فعال کنیم.برای این کار مراحل زیر را دنبال کنید:
- ابتدا وارد Control Panel می شویم.
- سپس وارد قسمت Program و سپس Program & Feature میشویم.
- حالا از قسمت سمت چپ این صفحه وارد گزینه ی Turn Windows features on or off میشویم.
- حالا با اسکرول کردن به سمت پایین گزینه های گفته شده در بالا رو انتخاب می کنیم و سپس تغییرات رو OK میکنیم.
مرحله 3:حالا باید وارد Microsoft Store شویم و نرم افزار Windows Subsystem for Linux Preview را دانلود و نصب کنیم یا میتونید در منوی استارت ویندوز PowerShell Windows را به صورت Run as Administrator باز کرده و در آن از دستور زیر استفاده کنید:
1 | wsl --install |
مرحله 4:خب حالا با نصب wsl میتونید یکی از نسخه های لینوکسی که در لیست آن وجود دارد را نصب و اجرا کنید.برای دریافت لیست لینوکس های قابل پشتیبانی از دستور زیر استفاده کنید:
1 | wsl -l -o |
مرحله 5:در این مرحله باید از Microsoft Store یکی از توزیع های لینوکس مانند Ubuntu را دانلود و نصب کنید یا در ترمینال یکی از توزیع های نمایش داده شده در لیست دستور مرحله 4 را با دستور زیر استفاده کنید:
1 | wsl --install -d [Name of Distrobiution] |
مرحله 6: حالا پس از نصب میتونید توزیع نصب شده رو از منوی استارت ویندوز باز کنید که در این صورت از شما نام کاربری جدید و رمز عبور میخواد و پس از وارد کردن آنها ترمینال لینوکس شما آماده است😊
سوال 4: این آموزش با چه کامپایلری انجام میشه؟
در این آموزش از کامپایلر GNU GCC استفاده میکنیم و برای ادیت کدهامون هم از یکی از ادیتورهای معروف مانند VScode یا eclipse استفاده میکنیم.حالا چرا ؟ دلیلش رو در اینجا میتونید ببینید که به طور مفصل توضیح داده شده.
در پایان حال و روز خوشی را برای شما آرزومندم و امیدوارم که تا پایان این مجموعه آموزشی همراه ما باشید.
آیا نمیشه wsl رو روی ویندوز 10 نصب کرد؟
سلام. میشه
خیلی عالی. منتظر ادامه هستیم.
سلام
اول از همه تشکر ویژه از مهندس Metech بابط شروع این اموزش عالی و کار بردی
شتکر ویژه تر از سایت و رسانه سیسوگ برای اموزش های عالی و درجه یکشون
به عنوان فردی که عاشق یاد گیری هست و منابع فارسی زیادی رو دنبال می کنه سیسوگ به جرات یک سرو گردن بالاتر از رسانه های دیگر اموزشی تا الان برای بنده بوده .
امیدوارم این اموزش ادامه دار باشید.
سلام
اگه بخواهیم لینوکس نصب کنیم برای این منظور، شما چه توزیعی رو پیشنهاد میدید؟
سلام.اول از همه عذرخواهی میکنم بابت تاخیر در پاسخ.
همونطور که در انتهای آموزش گفتم، یکی از توزیع های دبیان بیس اما هر کدوم از این توزیع ها به یه دلیلی مشهور هستن.برای مثال کسایی که تازه لینوکس رو شروع میکنن، معمولا با توزیع محبوب اوبونتو آشنا میشن. یا لینوکس مینت یکی از توزیع های محبوب برنامه نویس هاست، چرا که تعداد زیادی از ابزارهای برنامه نویسی رو به صورت پیش فرض روی خودش نصب داره.
با این وجود توصیه من نصب خود توزیع دبیان است ، چون سبکه و در طول زمان هم میتونید متناسب با کارتون ابزارهای لازم رو نصب کنید.
موفق باشید.
یا ابر فرض
here comes sisoog!
مرسی
خواهش میکنم.امیدوارم که در قسمت های بعدی هم با نظراتتون ما رو همراهی کنید.
آخ جون!!… چه کیفی بکنیم!
به زودی منتظر قسمت های جدید این آموزش باشید