آموزش RTX در کیل (تایمرها)

تابع تاخیر در RTX KEIL
آموزش RTX در کیل
جولای 20, 2016
تبدیل فونت های فارسی در emwin
جولای 25, 2016

آموزش RTX در کیل تایمرها

برای راه اندازی تایمر ها در هنگام ساخت پروژه  Keil RTX رو هم بایستی تیک بزنید. در جلسه ی قبل یعنی آموزش RTX در کیل به همراه عکس توضیح داده شد.

 

کار با تایمرها :

برای راه اندازی تایمر ها در کیل با استفاده از RTX دو مرحله ی زیر را بایستی انجام دهیم :

  1. تعریف تایمرها
    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;
  2. معرفی کردن و استارت تایمرها
    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);

 

در تعریف و پیکره بندی تایمر ها دو ماکرو وجود دارد

  1. تعریف مشخصات تایمر
    #define osTimerDef(name, function)
    

    name : نام تایمر
    function: تابعی که پس از رسیدن به تایم، آن تابع را اجرا کند

  2. دسترسی به مشخصات تایمر
    #define osTimer(name) &os_timer_def_##name
    

    name : نام تابعی که قبلا تعریف شده است.

یک نوع شمارشگر نیز وجود دارد که نوع تایمر با آن مشخص می شود.

enum  	os_timer_type { 
  osTimerOnce = 0, 
  osTimerPeriodic = 1 
}

شرح :

علاوه بر توابع تاخیر  CMSIS-RTOS از تایمر های مازی نیز پشتیبانی می کند. که این توابع می توانند اجرای یک تابع را شروع کند.

زمانی که زمان یک تایمر به پایان میرسد ، یک تابع که به تایمر ارتباط دارد اجرا می شود.

تعداد تایمر به عنوان یک پارامتر به تابع منتقل می شود. هر تایمری میتواند به صورت یکبار یا پریودیک پیکره بندی شود.

تایمر پریودیک تا زمانیکه متوقف و یا حذف نشده باشد ، فعالیت خود را تکرار می کند. همه ی تایمر ها میتوانند آغاز شده ، راه اندازی مجدد و یا متوقف شوند.

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

Timerتابع ها:

کلا برای تایمر ها در کیل ۴ تابع وجود دارد که در زیر به تشریح آنها می پردازیم.

۱٫

اولین تابع ، تابع ساخت تایمر می باشد

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 : وضعیت اجرای تابع را کد وضعیت بر می گرداند.

  1. osOK : زمانیکه به درستی تایمر استارت یا ری استارت شد.
  2. osErrorISR : تابع نمیتواند از سرویس روتین اینتراپت فراخوانی شود.
  3. osErrorParameter : شناسه ی تایمر نادرست است.

مثال :

#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 : وضعیت اجرای تابع را کد وضعیت بر می گرداند.

  1. osOK : زمانیکه به درستی تایمر متوقف شد.
  2. osErrorISR : تابع نمیتواند از سرویس روتین اینتراپت فراخوانی شود.
  3. osErrorParameter : شناسه ی تایمر نادرست است.
  4. osErrorResource : تایمر مورد نظر استارت نشده است.

مثال :

#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 : وضعیت اجرای تابع را کد وضعیت بر می گرداند.

  1. osOK : تایمر به درستی حذف شد.
  2. osErrorISR : تابع نمیتواند از سرویس روتین اینتراپت فراخوانی شود.
  3. osErrorParameter : شناسه ی تایمر نادرست است.

مثال :

#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”]

 

 

حسین
حسین
من 28 سال سن دارم و رشته ی تحصیلی ام مهندسی برق قدرت بوده علاوه بر برق علاقمند به دنیای الکترونیک ، برنامه نویسی و طراحی وب هستم . این سایت رو برای آموزش رابط گرافیکی emWin راه اندازی کردم که بدون کمک شما جلو رفتن غیر ممکنه پس اگه آموزش یا مطالب مرتبطی دارید برام ایمیل کنید تا به اسم خودتون توی سایت منتشر بشه. hosseintomari@gmail.com
اشتراک
اطلاع از
guest

0 نظرات
بازخورد داخلی
مشاهده همه نظرات
0
برای بهبود مطالب، لطفاً نظر بدهید.x