ARM, RTOS, آموزش های متنی

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

مقایسه برنامه نویسی به روش 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 داشته باشید.

دانلود کتاب شروع کار با RTOS

همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.


لینک های مفید

آموزش نصب و راه اندازی FreeRTOS با STM32 و cubeMX

آموزش نحوه تعریف Task در FreeRTOS

برنامه نویسی به سبک سیستم عامل امروز یک ضرورت است

RTOS یا سیستم عامل بلادرنگ چیست؟


اگر سوال، پیشنهاد، نظر و یا … داری، از قسمت نظرات در پایین همین صفحه، می تونید با ما و بقیه ی خوانندگان درمیان بگذارید.

author-avatar

درباره مرتضی زندی

خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

This site uses Akismet to reduce spam. Learn how your comment data is processed.