From 8fe88366312bd07e80eba418b6d2542b9629f608 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Mon, 8 Jan 2007 08:32:10 +0000
Subject: [PATCH] Shorter critical sections in examples.

---
 examples/mini/mini.c        | 36 ++++++++++++++++++------------------
 examples/msr/msr_sample.c   | 12 ++++++------
 examples/rtai/rtai_sample.c | 24 +++++++++++-------------
 3 files changed, 35 insertions(+), 37 deletions(-)

diff --git a/examples/mini/mini.c b/examples/mini/mini.c
index 7fb49434..aca2a641 100644
--- a/examples/mini/mini.c
+++ b/examples/mini/mini.c
@@ -32,7 +32,6 @@
  *****************************************************************************/
 
 #include <linux/module.h>
-#include <linux/delay.h>
 #include <linux/timer.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
@@ -73,35 +72,36 @@ ec_pdo_reg_t domain1_pdos[] = {
 void run(unsigned long data)
 {
     static unsigned int counter = 0;
-    static unsigned int einaus = 0;
-
-    spin_lock(&master_lock);
+    static unsigned int blink = 0;
 
     // receive
+    spin_lock(&master_lock);
     ecrt_master_receive(master);
     ecrt_domain_process(domain1);
+    spin_unlock(&master_lock);
 
     // process data
-    //k_pos = EC_READ_U32(r_ssi);
-#ifdef KBUS
-    EC_WRITE_U8(r_outputs + 2, einaus ? 0xFF : 0x00);
-#endif
-
-    // send
-    ecrt_domain_queue(domain1);
-    ecrt_master_run(master);
-    ecrt_master_send(master);
-
-    spin_unlock(&master_lock);
+    // k_pos = EC_READ_U32(r_ssi);
 
     if (counter) {
         counter--;
     }
     else {
         counter = FREQUENCY;
-        einaus = !einaus;
+        blink = !blink;
     }
 
+#ifdef KBUS
+    EC_WRITE_U8(r_outputs + 2, blink ? 0xFF : 0x00);
+#endif
+    
+    // send
+    spin_lock(&master_lock);
+    ecrt_domain_queue(domain1);
+    ecrt_master_run(master);
+    ecrt_master_send(master);
+    spin_unlock(&master_lock);
+
     // restart timer
     timer.expires += HZ / FREQUENCY;
     add_timer(&timer);
@@ -211,8 +211,8 @@ void __exit cleanup_mini_module(void)
 /*****************************************************************************/
 
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR ("Florian Pose <fp@igh-essen.com>");
-MODULE_DESCRIPTION ("EtherCAT minimal test environment");
+MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
+MODULE_DESCRIPTION("EtherCAT minimal test environment");
 
 module_init(init_mini_module);
 module_exit(cleanup_mini_module);
diff --git a/examples/msr/msr_sample.c b/examples/msr/msr_sample.c
index 44b0c0bb..b2506e52 100644
--- a/examples/msr/msr_sample.c
+++ b/examples/msr/msr_sample.c
@@ -66,7 +66,7 @@ ec_domain_t *domain1 = NULL;
 // raw process data
 void *r_ana_out;
 
-// Channels
+// channels
 double k_ana_out;
 
 ec_pdo_reg_t domain1_pdos[] = {
@@ -78,20 +78,20 @@ ec_pdo_reg_t domain1_pdos[] = {
 
 void msr_controller_run(void)
 {
-    rt_sem_wait(&master_sem);
-
     // receive
+    rt_sem_wait(&master_sem);
     ecrt_master_receive(master);
     ecrt_domain_process(domain1);
+    rt_sem_signal(&master_sem);
 
     // Process data
     EC_WRITE_S16(r_ana_out, k_ana_out / 10.0 * 0x7FFF);
 
     // Send
+    rt_sem_wait(&master_sem);
     ecrt_domain_queue(domain1);
     ecrt_master_run(master);
     ecrt_master_send(master);
-
     rt_sem_signal(&master_sem);
 
     msr_write_kanal_list();
@@ -221,8 +221,8 @@ void __exit cleanup_mod(void)
 /*****************************************************************************/
 
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR ("Florian Pose <fp@igh-essen.com>");
-MODULE_DESCRIPTION ("EtherCAT RTAI MSR sample module");
+MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
+MODULE_DESCRIPTION("EtherCAT RTAI MSR sample module");
 
 module_init(init_mod);
 module_exit(cleanup_mod);
diff --git a/examples/rtai/rtai_sample.c b/examples/rtai/rtai_sample.c
index 76e8ac4f..f6b95f13 100644
--- a/examples/rtai/rtai_sample.c
+++ b/examples/rtai/rtai_sample.c
@@ -46,12 +46,6 @@
 
 /*****************************************************************************/
 
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
-MODULE_DESCRIPTION("EtherCAT RTAI sample module");
-
-/*****************************************************************************/
-
 // RTAI task frequency in Hz
 #define FREQUENCY 10000
 #define INHIBIT_TIME 20
@@ -84,22 +78,23 @@ ec_pdo_reg_t domain1_pdos[] = {
 
 void run(long data)
 {
-    while (1)
-    {
+    while (1) {
         t_last_cycle = get_cycles();
-        rt_sem_wait(&master_sem);
 
+        rt_sem_wait(&master_sem);
         ecrt_master_receive(master);
         ecrt_domain_process(domain1);
+        rt_sem_signal(&master_sem);
 
         // process data
         //k_pos = EC_READ_U32(r_ssi_input);
 
+        rt_sem_wait(&master_sem);
         ecrt_domain_queue(domain1);
         ecrt_master_run(master);
         ecrt_master_send(master);
-
         rt_sem_signal(&master_sem);
+
         rt_task_wait_period();
     }
 }
@@ -108,7 +103,7 @@ void run(long data)
 
 int request_lock(void *data)
 {
-    // too close to the next RT cycle: deny access...
+    // too close to the next real time cycle: deny access...
     if (get_cycles() - t_last_cycle > t_critical) return -1;
 
     // allow access
@@ -142,7 +137,7 @@ int __init init_mod(void)
 
     ecrt_master_callbacks(master, request_lock, release_lock, NULL);
 
-    printk(KERN_INFO "Registering domain...\n");
+    printk(KERN_INFO "Creating domain...\n");
     if (!(domain1 = ecrt_master_create_domain(master))) {
         printk(KERN_ERR "Domain creation failed!\n");
         goto out_release_master;
@@ -207,8 +202,11 @@ void __exit cleanup_mod(void)
 
 /*****************************************************************************/
 
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
+MODULE_DESCRIPTION("EtherCAT RTAI sample module");
+
 module_init(init_mod);
 module_exit(cleanup_mod);
 
 /*****************************************************************************/
-
-- 
GitLab