آموزش RTX در کیل تایمرها
برای راه اندازی تایمر ها در هنگام ساخت پروژه Keil RTX رو هم بایستی تیک بزنید. در جلسه ی قبل یعنی آموزش RTX در کیل به همراه عکس توضیح داده شد.
کار با تایمرها :
برای راه اندازی تایمر ها در کیل با استفاده از RTX دو مرحله ی زیر را بایستی انجام دهیم :
osTimerDef(one_shot, start_machine); // when the timer expires, the function start_machine is called osTimerDef(periodic, toggle_power); // when the timer expires, the function toggle_power is called osTimerId one_shot_id, periodic_id;
one_shot_id = osTimerCreate(osTimer(one_shot), osTimerOnce, (void *)0); // creates a one-shot timer; // (void*)0 is passed as an argument to the callback function periodic_id = osTimerCreate(osTimer(periodic), osTimerPeriodic, (void *)5); // creates a periodic timer; // (void*)5 is passed as an argument to the callback function osTimerStart(one_shot_id, 500); osTimerStart(periodic, 1500);
در تعریف و پیکره بندی تایمر ها دو ماکرو وجود دارد
#define osTimerDef(name, function)
name : نام تایمر
function: تابعی که پس از رسیدن به تایم، آن تابع را اجرا کند
#define osTimer(name) &os_timer_def_##name
name : نام تابعی که قبلا تعریف شده است.
یک نوع شمارشگر نیز وجود دارد که نوع تایمر با آن مشخص می شود.
enum os_timer_type { osTimerOnce = 0, osTimerPeriodic = 1 }
شرح :
علاوه بر توابع تاخیر CMSIS-RTOS از تایمر های مازی نیز پشتیبانی می کند. که این توابع می توانند اجرای یک تابع را شروع کند.
زمانی که زمان یک تایمر به پایان میرسد ، یک تابع که به تایمر ارتباط دارد اجرا می شود.
تعداد تایمر به عنوان یک پارامتر به تابع منتقل می شود. هر تایمری میتواند به صورت یکبار یا پریودیک پیکره بندی شود.
تایمر پریودیک تا زمانیکه متوقف و یا حذف نشده باشد ، فعالیت خود را تکرار می کند. همه ی تایمر ها میتوانند آغاز شده ، راه اندازی مجدد و یا متوقف شوند.
شکل زیر رفتار یک تایمر پرویدیک را نشان می دهد. برای تایمر یکبار ، تایمر پس از اجرای تابع پاسخ متوقف می شود.
کلا برای تایمر ها در کیل ۴ تابع وجود دارد که در زیر به تشریح آنها می پردازیم.
۱٫
اولین تابع ، تابع ساخت تایمر می باشد
osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument)
timer_def : مراجعه شود به ماکروی osTimer
type : برای یکبار اجرای تایمر osTimerOnce و برای اجرای. پریودیک osTimerPeriodic را استفاده کنید.
argument : شناسه برای تابع تایمر.
نکته ها :
در صورتی که تایمر صحیح ایجاد شود شناسه ی تایمر را برمی گرداند ، در غیر اینصورت NULL برمی گرداند.
در صورتی که تایمر به صورت پریودیک یا یکبار پیکره بندی شد ، متوقف است تا زمانیکه توسط تابع استارت، شروع بکار کند.
این تابع را نمی توان در سرویس روتین های اینتراپت فراخوانی کرد.
مثال :
#include "cmsis_os.h" void Timer1_Callback (void const *arg); // prototypes for timer callback function void Timer2_Callback (void const *arg); osTimerDef (Timer1, Timer1_Callback); // define timers osTimerDef (Timer2, Timer2_Callback); uint32_t exec1; // argument for the timer call back function uint32_t exec2; // argument for the timer call back function void TimerCreate_example (void) { osTimerId id1; // timer id osTimerId id2; // timer id // Create one-shoot timer exec1 = 1; id1 = osTimerCreate (osTimer(Timer1), osTimerOnce, &exec1); if (id1 != NULL) { // One-shoot timer created } // Create periodic timer exec2 = 2; id2 = osTimerCreate (osTimer(Timer2), osTimerPeriodic, &exec2); if (id2 != NULL) { // Periodic timer created } : }
۲٫
osStatus osTimerStart (osTimerId timer_id, uint32_t millisec)
timer_id : شناسه ی تایمر که توسط تابع osTimerCreate تعیین شده است.
millisec : مقدار تایم تاخیر برای تایمر.
osStatus : وضعیت اجرای تابع را کد وضعیت بر می گرداند.
مثال :
#include "cmsis_os.h" void Time_Callback (void const *arg) { // timer callback function // arg contains &exec // called every second after osTimerStart } osTimerDef (Timer, Time_Callback); // define timer uint32_t exec; // argument for the timer call back function void TimerStart_example (void) { osTimerId id; // timer id uint32_t timerDelay; // timer value osStatus status; // function return status // Create periodic timer exec = 1; id = osTimerCreate (osTimer(Timer), osTimerPeriodic, &exec); if (id) { timerDelay = 1000; status = osTimerStart (id, timerDelay); // start timer if (status != osOK) { // Timer could not be started } } : }
۳٫
osStatus osTimerStop (osTimerId timer_id)
timer_id : شناسه ی تایمر که توسط تابع osTimerCreate تعیین شده است.
osStatus : وضعیت اجرای تابع را کد وضعیت بر می گرداند.
مثال :
#include "cmsis_os.h" void Timer_Callback (void const *arg); // prototype for timer callback function osTimerDef (Timer, Timer_Callback); // define timer void TimerStop_example (void) { osTimerId id; // timer id osStatus status; // function return status // Create periodic timer exec = 1; id = osTimerCreate (osTimer(Timer2), osTimerPeriodic, NULL); osTimerStart (id, 1000); // start timer : status = osTimerStop (id); // stop timer if (status != osOK) { // Timer could not be stopped } : osTimerStart (id, 1000); // start timer again : }
۴٫
osStatus osTimerDelete (osTimerId timer_id)
timer_id : شناسه ی تایمر که توسط تابع osTimerCreate تعیین شده است.
osStatus : وضعیت اجرای تابع را کد وضعیت بر می گرداند.
مثال :
#include "cmsis_os.h" void Timer_Callback (void const *arg); // prototype for timer callback function osTimerDef (Timer, Timer_Callback); // define timer void TimerDelete_example (void) { osTimerId id; // timer id osStatus status; // function return status // Create periodic timer exec = 1; id = osTimerCreate (osTimer(Timer2), osTimerPeriodic, NULL); osTimerStart (id, 1000UL); // start timer : status = osTimerDelete (id); // stop and delete timer if (status != osOK) { // Timer could not be deleted } : }
دانلود مثال :
[wpdm_package id=921 template=”link-template-calltoaction3.php”]