examples/rtai/rtai_sample.c
changeset 2024 96e2ae6cce95
parent 1935 8ea1033bd4c2
child 2589 2b9c78543663
equal deleted inserted replaced
2023:da133ec36c3a 2024:96e2ae6cce95
   232         // write process data
   232         // write process data
   233         EC_WRITE_U8(domain1_pd + off_dig_out, blink ? 0x06 : 0x09);
   233         EC_WRITE_U8(domain1_pd + off_dig_out, blink ? 0x06 : 0x09);
   234 
   234 
   235         rt_sem_wait(&master_sem);
   235         rt_sem_wait(&master_sem);
   236         ecrt_domain_queue(domain1);
   236         ecrt_domain_queue(domain1);
       
   237         rt_sem_signal(&master_sem);
   237         ecrt_master_send(master);
   238         ecrt_master_send(master);
   238         rt_sem_signal(&master_sem);
       
   239 
   239 
   240         rt_task_wait_period();
   240         rt_task_wait_period();
   241     }
   241     }
   242 }
   242 }
   243 
   243 
   244 /*****************************************************************************/
   244 /*****************************************************************************/
   245 
   245 
   246 void send_callback(void *cb_data)
   246 void request_lock_callback(void *cb_data)
   247 {
   247 {
   248     ec_master_t *m = (ec_master_t *) cb_data;
   248     ec_master_t *m = (ec_master_t *) cb_data;
   249 
   249     rt_sem_wait(&master_sem);
   250     // too close to the next real time cycle: deny access...
   250 }
   251     if (get_cycles() - t_last_cycle <= t_critical) {
   251 
   252         rt_sem_wait(&master_sem);
   252 /*****************************************************************************/
   253         ecrt_master_send_ext(m);
   253 
   254         rt_sem_signal(&master_sem);
   254 void release_lock_callback(void *cb_data)
   255     }
       
   256 }
       
   257 
       
   258 /*****************************************************************************/
       
   259 
       
   260 void receive_callback(void *cb_data)
       
   261 {
   255 {
   262     ec_master_t *m = (ec_master_t *) cb_data;
   256     ec_master_t *m = (ec_master_t *) cb_data;
   263 
   257     rt_sem_signal(&master_sem);
   264     // too close to the next real time cycle: deny access...
       
   265     if (get_cycles() - t_last_cycle <= t_critical) {
       
   266         rt_sem_wait(&master_sem);
       
   267         ecrt_master_receive(m);
       
   268         rt_sem_signal(&master_sem);
       
   269     }
       
   270 }
   258 }
   271 
   259 
   272 /*****************************************************************************/
   260 /*****************************************************************************/
   273 
   261 
   274 int __init init_mod(void)
   262 int __init init_mod(void)
   290         ret = -EBUSY; 
   278         ret = -EBUSY; 
   291         printk(KERN_ERR PFX "Requesting master 0 failed!\n");
   279         printk(KERN_ERR PFX "Requesting master 0 failed!\n");
   292         goto out_return;
   280         goto out_return;
   293     }
   281     }
   294 
   282 
   295     ecrt_master_callbacks(master, send_callback, receive_callback, master);
   283     ecrt_master_callbacks(master, request_lock_callback, release_lock_callback, master);
   296 
   284 
   297     printk(KERN_INFO PFX "Registering domain...\n");
   285     printk(KERN_INFO PFX "Registering domain...\n");
   298     if (!(domain1 = ecrt_master_create_domain(master))) {
   286     if (!(domain1 = ecrt_master_create_domain(master))) {
   299         printk(KERN_ERR PFX "Domain creation failed!\n");
   287         printk(KERN_ERR PFX "Domain creation failed!\n");
   300         goto out_release_master;
   288         goto out_release_master;