مقایسه برنامه نویسی به روش RTOS و Super Loop

مقایسه برنامه نویسی به روش RTOS و Super Loop
در این مقاله با مشاهده نتیجه حاصل از دو سبک کد زنی سیستم عامل بلادرنگ (RTOS) و ابر حلقه (Super Loop) قصد داریم به یک درک شهودی از برنامه نویسی به روش RTOS برسیم. درباره سبک کد زنی مطالبی در وبسایت منتشر شده است. اگر اطلاعاتی در زمینه RTOS ندارید پیشنهاد می کنم مقالات زیر رو از دست ندید.
استفاده از RTOS در میکروکنترلرها
تعریف پروژه
یک پروژه ساده پیاده سازی می کنیم، به این صورت که 2 عدد LED را از طریق برد مینی STM32 کنترل می کنیم. LED اول با فاصله زمانی 300 میلی ثانیه و LED دوم با فاصله زمانی 350 میلی ثانیه چشمک می زند.
پیاده سازی با روش ابر حلقه
البته که این میزان تاخیرها روی زمان چشمک زدن هر دو LED اثر می گذارد، چرا که دستورات پشت سر همدیگر در یک Super Loop نوشته می شوند، طبیعتا وضعیت این دو LED در این روش نمی تواند از یکدیگر مستقل باشد. لطفا دقت کنید که در این تست صرفا قصد داریم به یک درک شهودی از روش RTOS برسیم.
کد زیر نحوه ی کارکرد پروژه در این حالت را نشان می دهد.
//------------------------------------ //--> Macro Defenition //------------------------------------ #define LED1_SET(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, x) #define LED2_SET(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, x) #define DELAY_LOW (300) #define DELAY_HIGH (350) //--------------------------------------- //--> Super Loop method //--------------------------------------- int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while(1) { { //LED1 LED1_SET(1); HAL_Delay(DELAY_LOW); LED1_SET(0); HAL_Delay(DELAY_LOW); } { //LED2 LED2_SET(1); HAL_Delay(DELAY_HIGH); LED2_SET(0); HAL_Delay(DELAY_HIGH); } } }
ویدئوی خروجی پروژه در هر دو حالت Super Loop و RTOS
پیاده سازی با روش RTOS
در این روش از سیستم عامل FreeRTOS استفاده می کنیم و دو تسک مجزا تعریف می کنیم. در تسک اول، LED شماره 1 را با تاخیر 300 میلی ثانیه به حالت چشمک زن در می آوریم. در تسک دوم، LED شماره 2 را با تاخیر 350 میلی ثانیه به حالت چشمک زن در می آوریم. البته که در روش RTOS ، تسک ها به صورت پیشفرض کاملا از یکدیگر مستقل هستند، و وضعیت عملکرد LED شماره 1 در این حالت روی LED شماره 2 تاثیر نمی ذارد و بلعکس.
از define های روش قبلی مستقیم در این مرحله نیز استفاده می کنیم.
#define LED1_SET(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, x) #define LED2_SET(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, x) #define DELAY_LOW (300) #define DELAY_HIGH (350)
هر تسک نیاز به یک handle دارد، برای این منظور از کدهای ذیل استفاده می کنیم.
//--> tasks handle definitions osThreadId led1TaskHandle; osThreadId led2TaskHandle;
روتین هر تسک بالای تابع main باید تعریف شود
//--> tasks routine definitions void led1Task(void const * arg); void led2Task(void const * arg);
کد زیر تعریف تسک ها در حلقه ی main را نشان می دهد.
int main(void) { //--> Init System HAL_Init(); SystemClock_Config(); //--> Config peripherals MX_GPIO_Init(); //--> Task1 Definition osThreadDef(task1, led1Task, osPriorityNormal, 0, 128); led1TaskHandle = osThreadCreate(osThread(task1), NULL); //--> Task2 Definition osThreadDef(task2, led2Task, osPriorityNormal, 0, 128); led2Taskhandle = osThreadCreate(osThread(task2), NULL); //--> Start Scheduler osKernelStart(); while (1); }
پیاده سازی تسک 1 مربوط به LED شماره 1
//--> task1 routine void led1Task(void const * arg) { while(1) { LED1_SET(1); osDelay(DELAY_LOW); LED1_SET(0); osDelay(DELAY_LOW); } }
پیاده سازی تسک 2 مربوط به LED شماره 2
//--> task2 routine void led2Task(void const * arg) { while(1) { LED2_SET(1); osDelay(DELAY_HIGH); LED2_SET(0); osDelay(DELAY_HIGH); } }
همینطور که مشخص است در این روش برنامه درون تسک ها در حال اجرا می باشد و نه درون تابع main
ویدئوی خروجی پروژه در هر دو حالت Super Loop و RTOS
لطفا یک بار دیگر خروجی دو روش را با دقت بیشتری بررسی کنید.
ممکن است که بگویید، در روش اول با استفاده از وقفه ی تایمر می توانستیم حالتی مشابه با روش RTOS پیاده سازی کنیم. در جواب باید بگم، که بله در چنین مثال ساده ای قطعا همینطور است، اما جنگ ما این مثال ساده نیست! وقتی صحبت از عملکردهای همزمان متعدد در پروژه های واقعی می شود که تنها یکی از آنها مثلا تبادل اطلاعات با استفاده از استک TCP/IP می تواند باشد و … ، مطمئنن شما هم با من همنظر می شوید!
سخن پایانی
امیدوارم که در قالب این مثال ساده توانسته باشم یک دید خوب و درک شهودی در زمینه کارکرد روش RTOS به شما داده باشم. البته که مطالب بسیار خوبی به مرور با شما به اشتراک خواهم گذاشت.
بنظر شما برنامه نویسی به سبک RTOS امروزه یک نیاز ضروری برای برنامه نویسان امبدد سیستم است؟ در مقاله ی زیر به این موضوع پرداختیم و با جزئیات بیشتری از مزایا و معایب این روش ها صحبت کردیم.
برنامه نویسی به روش RTOS امروز یک ضرورت است؟
منابع پیشنهادی جهت یادگیری FreeRTOS
در لینک زیر می توانید کتاب الکترونیکی را دانلود کرده و یک شروع سریع با سیستم عامل FreeRTOS برای میکروکنترلر STM32 داشته باشید.
همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.
لینک های مفید
آموزش نصب و راه اندازی FreeRTOS با STM32 و cubeMX
آموزش نحوه تعریف Task در FreeRTOS
برنامه نویسی به سبک سیستم عامل امروز یک ضرورت است
RTOS یا سیستم عامل بلادرنگ چیست؟
اگر سوال، پیشنهاد، نظر و یا … داری، از قسمت نظرات در پایین همین صفحه، می تونید با ما و بقیه ی خوانندگان درمیان بگذارید.
جهت مطلع شدن از آموزش های جدید به خبرنامه ی EasyMCU بپیوندید.
درباره مرتضی زندی
خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.
نوشته های بیشتر از مرتضی زندیمطالب زیر را حتما مطالعه کنید
آموزش نصب و راه اندازی سیستم عامل Free RTOS برای آردوینو Arduino
آموزش نصب و راه اندازی سیستم عامل Free RTOS روی STM32
آموزش FreeRTOS نحوه استفاده از میوتکس Mutex
آموزش Free RTOS نحوه استفاده از سمافور Semaphore
آموزش STM32 راه اندازی وقفه خارجی EXTI
معرفی کتاب ARM
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید