تایمرها در سیستم های Embedded نقش بسیار مهمی دارند. تایمرها معمولا برای انجام توابعی متناوب و یا برای انجام کاری بعد از مدت زمان مشخصی استفاده میشوند. در این بخش سعی شده است که تایمرهای نرم افزاری بطور کامل معرفی شوند. این تایمرها مستقل از تایمرهای سختافزاری پردازنده هستند.
فهرست مطالب
سخت افزار مورد نیاز
هر یک از میکروکنترلرهای 32 بیتی شرکت ST. در این پروژه از بورد STM32F4DISCOVERY استفاده شده است.
نرم افزار مورد نیاز
stm32cubemx
یک نرم افزار برای کامپایل و پروگرم کردن میکروکنترلر. در این پروژه از بورد IAR استفاده شده است.
مشخصه های تایمر نرم افزاری
در سیستم عامل FreeRTOS دو نوع تایمر معرفی شده است. نوع اول آن One-shot است که فقط یکبار تابع Callback متناظر خود را اجرا میکند. برای استفاده مجدد آن باید تایمر بصورت دستی مجددا تنظیم شود. نوع دوم تایمرهای Auto-reload هستند. این نوع تایمر بر خلاف تایمرهای One-shot بصورت خودکار ریست میشود و تابع Callback آن بصورت متناوب اجرا میشود.
در شکل 1 نحوه عملکرد هر دو نوع تایمر نشان داده شده است.تایمریک که با رنگ قرمز نشان داده شده است یک تایمر One-shot و تایمر دوم که با رنگ آبی نشان داده شده است، یک تایمر Auto-reload است. همانطور که ملاحظه میکنید تایمر اول فقط یک بار اجرا شده ولی تایمر دوم بصورت متناوب تکرار میشود.
هر تایمر میتواند در یکی از دو حالت کاری Running و Dormant باشد. هنگامیکه تایمر در حالت کاری Dormant قرار دارد شمارنده آن در ثابت است و شمارشی صورت نمی گیرد. ولی هنگامی که تایمر در حالت کاری Running قرار دارد، شمارنده تایمر در حال شمارش است.
در شکل 2 و شکل 3 نمودار حالت تایمرهای Auto-reload و One-shot نشان داده شده است. همانطور که ملاحظه میکنید تایمر Auto-reload پس از هر بار که شمارنده ان سرریز میکند ریست شده و تابع Callback متناظر را اجرا نموده و در حالت کاری Running باقی میماند ولی تایمر پس از سرریز شمارنده و اجرای تابع Dormant به حالت کاری Dormant میرود
تسک Daemon
تسکهای daemon به تسکهایی گفته میشود که در Background اجرا میشوند و با کاربر بصورت مستقیم با کاربر تعاملی ندارد. بعنوان مثال در سیستم عامل Unix تسک sshd مسئول سرویس دهی به ارتباطات ssh است.
در سیستم عامل FreeRTOS کلیه تابع Callback تایمرها در یک تسک Daemon تایمر اجرا میشود. در صورتیکه در داخل توابع Callback از توابعی که تسک را به حالت کاری Block میبرد استفاده شود منجر به اختلال در عملکرد کلیه تایمرهای نرم افزاری میشود. چگونگی عملکرد تسک Daemon تایمر در شکل 4 نشان داده شده است. همانطور که ملاحظه میکنید، در سیستم عامل FreeRTOS یک Queue برای مدیریت تایمرهای نرم افزاری قرار داده شده است. هنگامی که هریک از تایمرها سرریز شوند، فلگ متناظر با آن در Queue قرار داده میشود و در تسک Daemon
دائما Queue بررسی میشود و در صورتیکه دادهای در Queue باشد، داده از Queue خوانده شده و پردازش موردنیاز آن انجام میشود.
لازم به ذکر است که اولویت این تسک را در فایل FreeRTOSConfig.h و یا در نرم افزار STM32CubeMX در سربرگ Config parameters تنظیم کرد.
تایمرهای نرم افزاری در نرم افزار STM32CubeMX
برای تعریف تایمر در سیستم عامل FreeRTOS ابتدا باید در سربرگ Config parameters فیلد USE_TIMERS را بر روی گزینه Enabled تنظیم نمود (شکل 5). سپس طول Queue و اولویت تسک Daemon که در قسمت قبل شرح داده شد، تنظیم شود.
سپس در سربرگ Timers and Semaphores قسمت Timers بر روی دکمه Add کلیک کنید تا پنجره New Timer باز شود. در این پنجره مشخصههای تایمر را تنظیم میشود. فیلدهای مهم آن عبارتند از نام تایمر و تابع Callback متناظر با آن و نوع تایمر که میتواند osTimePeriodic و osTimeOnce باشد.
مثال عملی
در این قسمت با استفاده از یک تایمر نرم افزاری یک LED را چشمک زن راه اندازی شده است. هدف از این مثال نحوه استفاده از راه اندازی و استفاده از تایمر نرم افزاری است. در اینجا یک تایمر از نوع Auto-reload بنام Prodic_Timer تعریف شده است. چگونگی تنظیم این تایمر در شکل 6 نشان داده شده است. نحوه تنظیم سایر بخشهای FreeRTOS در قسمتهای قبل بیان شده است. لذا از تکرار مجدد خودداری شده است.
نرم افزار برنامه
کد تابع main در بصورت زیر است. در این تابع پس از انجام تنظیمات اولیه سخت افزار یک تایمر به نام Periodic_Timer تعریف شده است. سپس با استفاده از تابع xTimerChangePeriod دوره تناوب آن تنظیم شده است.
تابع Callback تایمر
بدنه تابع Callback تایمر بصورت زیر است. در این LED که با پایه PD.13 متصل شده است Toggle میشود
Pipe ها ابزاری است کانل ساده ارتباطی برای دادههای بدون ساختار بین تسک ها فراهم می کنند.