تایمرهای نرم افزاری در سیستم عامل FreeRTOS در میکروکنترلرهای STM32

0

تایمرهای نرم افزاری در سیستم عامل FreeRTOS در میکروکنترلرهای STM32

تایمرها در سیستم های Embedded نقش بسیار مهمی دارند. تایمرها معمولا برای انجام توابعی متناوب و یا برای انجام کاری بعد از مدت زمان مشخصی استفاده می­شوند. در این بخش سعی شده است که تایمرهای نرم افزاری بطور کامل معرفی شوند. این تایمرها مستقل از تایمرهای سخت­افزاری پردازنده هستند.

سخت افزار مورد نیاز

  • هر یک از میکروکنترلرهای 32 بیتی شرکت ST. در این پروژه از بورد STM32F4DISCOVERY استفاده شده است.

نرم افزار مورد نیاز

  • stm32cubemx
  • یک نرم افزار برای کامپایل و پروگرم کردن میکروکنترلر. در این پروژه از بورد IAR استفاده شده است.

مشخصه های تایمر نرم افزاری

در سیستم عامل FreeRTOS دو نوع تایمر معرفی شده است. نوع اول آن One-shot است که فقط یکبار تابع Callback متناظر خود را اجرا می­کند. برای استفاده مجدد آن باید تایمر بصورت دستی مجددا تنظیم شود. نوع دوم تایمرهای Auto-reload هستند. این نوع تایمر بر خلاف تایمرهای One-shot  بصورت خودکار ریست می­شود و تابع Callback آن بصورت متناوب اجرا می­شود.

در شکل 1 نحوه عملکرد هر دو نوع تایمر نشان داده شده است.تایمریک که با رنگ قرمز نشان داده شده است یک تایمر One-shot و تایمر دوم که با رنگ آبی نشان داده شده است، یک تایمر Auto-reload است. همانطور که ملاحظه می­کنید تایمر اول فقط یک بار اجرا شده ولی تایمر دوم بصورت متناوب تکرار می­شود.

نمایش تایمر نرم افزاری One-shot و Auto-reload در سیستم عامل freeRTOS
نمایش تایمر نرم افزاری One-shot و Auto-reload در سیستم عامل freeRTOS

هر تایمر می­تواند در یکی از دو حالت کاری Running و Dormant باشد. هنگامی­که تایمر در حالت کاری Dormant قرار دارد شمارنده آن در ثابت است و شمارشی صورت نمی گیرد. ولی هنگامی که تایمر در حالت کاری Running قرار دارد، شمارنده تایمر در حال شمارش است.

در شکل 2 و شکل 3 نمودار حالت تایمرهای Auto-reload و One-shot نشان داده شده است. همانطور که ملاحظه می­کنید تایمر Auto-reload پس از هر بار که شمارنده ان سرریز می­کند ریست شده و تابع Callback متناظر را اجرا نموده و در حالت کاری Running باقی می­ماند ولی تایمر پس از سرریز شمارنده و اجرای تابع Dormant به حالت کاری Dormant می­رود

نمودار حالت کاری تایمرهای نرم افزاری One-shot
نمودار حالت کاری تایمرهای نرم افزاری One-shot
نمودار حالت کاری تایمرهای نرم افزاری Auto-reload
نمودار حالت کاری تایمرهای نرم افزاری Auto-reload

تسک Daemon

تسک­های daemon به تسک­هایی گفته می­شود که در Background اجرا می­شوند و با کاربر بصورت مستقیم با کاربر تعاملی ندارد. بعنوان مثال در سیستم عامل Unix تسک sshd مسئول سرویس دهی به ارتباطات ssh است.

در سیستم عامل FreeRTOS کلیه تابع Callback تایمرها در یک تسک Daemon تایمر اجرا می­شود. در صورتیکه در داخل توابع Callback از توابعی که تسک را به حالت­ کاری Block می­برد استفاده شود منجر به اختلال در عملکرد کلیه تایمرهای نرم افزاری می­شود. چگونگی عملکرد تسک Daemon تایمر در شکل 4 نشان داده شده است. همانطور که ملاحظه می­کنید، در سیستم عامل FreeRTOS یک Queue برای مدیریت تایمرهای نرم افزاری قرار داده شده است. هنگامی که هریک از تایمرها سرریز شوند، فلگ متناظر با آن در Queue قرار داده می­شود و در تسک Daemon

دائما Queue بررسی می­شود و در صورتیکه داده­ای در Queue باشد، داده از Queue خوانده شده و پردازش موردنیاز آن انجام می­شود.

نحوه کار تسک daemon تایمرهای نرم افزاری
نحوه کار تسک daemon تایمرهای نرم افزاری

لازم به ذکر است که اولویت این تسک را در فایل FreeRTOSConfig.h و یا در نرم افزار STM32CubeMX در سربرگ Config parameters تنظیم کرد.

تایمرهای نرم افزاری در نرم افزار STM32CubeMX

برای تعریف تایمر در سیستم عامل FreeRTOS ابتدا باید در سربرگ Config parameters فیلد USE_TIMERS را بر روی گزینه Enabled تنظیم نمود (شکل 5). سپس طول Queue و اولویت تسک Daemon که در قسمت قبل شرح داده شد، تنظیم شود.

نحوه تعریف تایمر نرم افزاری در STM32CubeMX بخش اول
نحوه تعریف تایمر نرم افزاری در STM32CubeMX بخش اول

سپس در سربرگ Timers and Semaphores قسمت Timers بر روی دکمه Add کلیک کنید تا پنجره New Timer باز شود. در این پنجره مشخصه­های تایمر را تنظیم می­شود. فیلدهای مهم آن عبارتند از نام تایمر و تابع Callback متناظر با آن و نوع تایمر که می­تواند osTimePeriodic و osTimeOnce باشد.

مثال عملی

در این قسمت با استفاده از یک تایمر نرم افزاری یک LED را چشمک زن راه اندازی شده است. هدف از این مثال نحوه استفاده از راه اندازی و استفاده از تایمر نرم افزاری است. در اینجا یک تایمر از نوع Auto-reload بنام Prodic_Timer تعریف شده است. چگونگی تنظیم این تایمر در شکل 6 نشان داده شده است. نحوه تنظیم سایر بخش­های FreeRTOS در قسمت­های قبل بیان شده است. لذا از تکرار مجدد خودداری شده است.

حوه تعریف تایمر نرم افزاری در STM32CubeMX بخش دوم
حوه تعریف تایمر نرم افزاری در STM32CubeMX بخش دوم

نرم افزار برنامه

کد تابع main در بصورت زیر است. در این تابع پس از انجام تنظیمات اولیه سخت افزار یک تایمر به نام Periodic_Timer تعریف شده است. سپس با استفاده از تابع xTimerChangePeriod دوره تناوب آن تنظیم شده است.

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  osTimerDef(Periodic_Timer, Periodic_Timer_Callback);
  Periodic_TimerHandle = osTimerCreate(osTimer(Periodic_Timer), osTimerPeriodic, NULL);


  xTimerChangePeriod(Periodic_TimerHandle, 100, 100);

  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  osKernelStart();
  
  while (1)
  {

  }
}
 

تابع Callback تایمر

بدنه تابع Callback تایمر بصورت زیر است. در این LED که با پایه PD.13 متصل شده است Toggle می­شود

void Periodic_Timer_Callback(void const * argument)
{
  /* USER CODE BEGIN Periodic_Timer_Callback */
  HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);
  /* USER CODE END Periodic_Timer_Callback */
}
 

Pipe ها ابزاری است کانل ساده ارتباطی برای داده­های بدون ساختار بین تسک ها فراهم می کنند.

Choose your Reaction!
دیدگاه خود را بنویسید

آدرس ایمیل شما منتشر نخواهد شد.

redronic.com