drivers/timers_xeno/timers_xeno.c
changeset 0 4472ee7c6c3e
child 32 8afa33692372
equal deleted inserted replaced
-1:000000000000 0:4472ee7c6c3e
       
     1 #include <stdlib.h>
       
     2 #include <unistd.h> 
       
     3 
       
     4 #include <native/task.h>
       
     5 #include <native/timer.h>
       
     6 #include <native/mutex.h>
       
     7 #include <native/alarm.h>
       
     8 
       
     9 #include "applicfg.h"
       
    10 #include "can_driver.h"
       
    11 #include "timer.h"
       
    12 
       
    13 #define TIMERLOOP_TASK_CREATED        1
       
    14 
       
    15 RT_MUTEX CanFestival_mutex;
       
    16 RT_TASK timerloop_task;
       
    17 RT_ALARM timerloop_alarm;
       
    18 RTIME last_time_read;
       
    19 RTIME last_occured_alarm;
       
    20 RTIME last_alarm_set;
       
    21 
       
    22 char stop_timer=0;
       
    23 
       
    24 void cleanup_all(void)
       
    25 {
       
    26 	rt_task_delete(&timerloop_task);
       
    27 	rt_alarm_delete(&timerloop_alarm);
       
    28 }
       
    29 void stopTimer(void)
       
    30 {
       
    31 	stop_timer = 1;
       
    32 	rt_task_unblock(&timerloop_task);
       
    33 }
       
    34 
       
    35 
       
    36 void EnterMutex(void)
       
    37 {
       
    38 	rt_mutex_lock(&CanFestival_mutex, TM_INFINITE); 
       
    39 }
       
    40 
       
    41 void LeaveMutex(void)
       
    42 {
       
    43 	rt_mutex_unlock(&CanFestival_mutex);
       
    44 }
       
    45 
       
    46 void timerloop_task_proc(void *arg)
       
    47 {
       
    48 	int ret;
       
    49 	do{
       
    50 		do{
       
    51 			last_occured_alarm = last_alarm_set;
       
    52 			EnterMutex();
       
    53 			TimeDispatch();
       
    54 			LeaveMutex();
       
    55 		}while ((ret =  rt_task_sleep_until(last_alarm_set)) == 0);
       
    56 	}while (ret == -EINTR && !stop_timer );
       
    57 	printf("End of TimerLoop, code %d\n",ret);
       
    58 }
       
    59 
       
    60 void TimerLoop(TimerCallback_t init_callback)
       
    61 {
       
    62 	int ret;
       
    63 	stop_timer = 0;
       
    64 
       
    65 	ret = rt_alarm_create( &timerloop_alarm, NULL);
       
    66 	if (ret) {
       
    67 		printf("Failed to create timerloop_alarm, code %d\n",errno);
       
    68 		goto error;
       
    69 	}
       
    70 	
       
    71 	//create timerloop_task
       
    72 	ret = rt_task_create(&timerloop_task,"timerloop",0,50,0);
       
    73 	if (ret) {
       
    74 		printf("Failed to create timerloop_task, code %d\n",errno);
       
    75 		return;
       
    76 	}
       
    77  	
       
    78 	getElapsedTime();
       
    79 	last_alarm_set = last_time_read;
       
    80 	last_occured_alarm = last_alarm_set;
       
    81 	SetAlarm(NULL, 0, init_callback, 0, 0);
       
    82 	// start timerloop_task
       
    83 	ret = rt_task_start(&timerloop_task,&timerloop_task_proc,NULL);
       
    84 	if (ret) {
       
    85 		printf("Failed to start timerloop_task, code %d\n",errno);
       
    86 		goto error;
       
    87 	}
       
    88 	
       
    89 	// At first, TimeDispatch will call init_callback.
       
    90 	pause();
       
    91 
       
    92 error:
       
    93 	cleanup_all();
       
    94 }
       
    95 
       
    96 void ReceiveLoop_task_proc(void* arg)
       
    97 {
       
    98 	canReceiveLoop((CAN_HANDLE)arg);
       
    99 }
       
   100 
       
   101 void CreateReceiveTask(CAN_HANDLE fd0, TASK_HANDLE *ReceiveLoop_task)
       
   102 {
       
   103 	int ret;
       
   104 	static int id = 0;
       
   105 	char taskname[64];
       
   106 	sprintf(taskname,"canloop%d",id);
       
   107 	id++;
       
   108 
       
   109 	//create timerloop_task
       
   110 	ret = rt_task_create(ReceiveLoop_task,taskname,0,50,0);
       
   111 	if (ret) {
       
   112 		printf("Failed to create ReceiveLoop_task number %d, code %d\n", id, errno);
       
   113 		return;
       
   114 	}
       
   115 	// start timerloop_task
       
   116 	ret = rt_task_start(ReceiveLoop_task,&ReceiveLoop_task_proc,(void*)fd0);
       
   117 	if (ret) {
       
   118 		printf("Failed to start ReceiveLoop_task number %d, code %d\n", id, errno);
       
   119 		return;
       
   120 	}
       
   121 }
       
   122 
       
   123 void WaitReceiveTaskEnd(TASK_HANDLE Thread)
       
   124 {
       
   125 	rt_task_delete(&Thread);
       
   126 }
       
   127 #define max(a,b) a>b?a:b
       
   128 void setTimer(TIMEVAL value)
       
   129 {	
       
   130 	last_alarm_set = last_time_read + value;
       
   131 	rt_task_unblock(&timerloop_task);
       
   132 }
       
   133 
       
   134 TIMEVAL getElapsedTime(void)
       
   135 {
       
   136 	last_time_read = rt_timer_ticks2ns(rt_timer_read());
       
   137 	return last_time_read - last_occured_alarm;
       
   138 }