summaryrefslogtreecommitdiff
path: root/led/complex1/periodic.c
diff options
context:
space:
mode:
Diffstat (limited to 'led/complex1/periodic.c')
-rw-r--r--led/complex1/periodic.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/led/complex1/periodic.c b/led/complex1/periodic.c
new file mode 100644
index 0000000..b57e0f0
--- /dev/null
+++ b/led/complex1/periodic.c
@@ -0,0 +1,119 @@
+/*
+ * $Id$
+ */
+
+#if defined(__rtems__)
+#include <rtems.h>
+#include <stdio.h>
+#include "periodic.h"
+
+#define MAX_PERIODIC 100
+
+rtems_id PeriodicThreads_Ids[100];
+rtems_id PeriodicThreads_Periods[100];
+
+bool PeriodicThreads_initialized = FALSE;
+bool PeriodicThreads_running = FALSE;
+
+unsigned int PeriodicThreads_Count = 10;
+
+int factorial( int i );
+
+rtems_task PeriodicThreads_Body(
+ rtems_task_argument index
+)
+{
+ /* int i; */
+ int t = index + 1;
+
+ fprintf( stderr, "Periodic task %d starting\n", t );
+ /* this doesn't seem to dirty the stack :( */
+ factorial(t * 100);
+ while (1) {
+ rtems_rate_monotonic_period( PeriodicThreads_Periods[index], t * 2 );
+ /* for (i=0 ; i<(100000 * t) ; i++ ) ; */
+ rtems_task_wake_after( t * 2 );
+ }
+}
+
+/* this doesn't seem to dirty the stack :( */
+int factorial( int i )
+{
+ if ( i == 1 ) {
+ return 1;
+ }
+ return i * (i - 1);
+}
+
+void PeriodicThreads_Initialize(void)
+{
+ int i;
+ rtems_status_code s;
+ rtems_name name;
+ char buf[6];
+
+ if ( PeriodicThreads_initialized )
+ return;
+ PeriodicThreads_running = FALSE;
+
+ for( i=0 ; i<PeriodicThreads_Count ; i++ ) {
+ sprintf( buf, "PE%02x", i );
+ name = rtems_build_name( buf[0], buf[1], buf[2], buf[3] );
+ s = rtems_rate_monotonic_create( name, &PeriodicThreads_Periods[i] );
+ if ( s ) {
+ fprintf( stderr, "PeriodicThreads -- period create failed\n" );
+ return;
+ }
+
+ sprintf( buf, "TA%02x", i );
+ name = rtems_build_name( buf[0], buf[1], buf[2], buf[3] );
+ s = rtems_task_create( name, 2, RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &PeriodicThreads_Ids[i] );
+ if ( s ) {
+ fprintf( stderr, "PeriodicThreads -- task create failed\n" );
+ return;
+ }
+
+ s = rtems_task_start( PeriodicThreads_Ids[i], PeriodicThreads_Body, i );
+ if ( s ) {
+ fprintf( stderr, "PeriodicThreads -- task start failed\n" );
+ return;
+ }
+ }
+
+ PeriodicThreads_running = TRUE;
+ PeriodicThreads_initialized = TRUE;
+}
+
+void PeriodicThreads_Start(void)
+{
+ PeriodicThreads_Initialize();
+}
+
+void PeriodicThreads_Stop(void)
+{
+ rtems_status_code s;
+ int i;
+
+ if ( !PeriodicThreads_initialized )
+ return;
+
+ fprintf( stderr, "Stopping Periodic Threads\n" );
+ for ( i=0 ; i<PeriodicThreads_Count ; i++ ) {
+ s = rtems_rate_monotonic_delete( PeriodicThreads_Periods[i] );
+ if ( s ) {
+ fprintf( stderr, "PeriodicThreads -- period delete failed\n" );
+ return;
+ }
+
+ s = rtems_task_delete( PeriodicThreads_Ids[i] );
+ if ( s ) {
+ fprintf( stderr, "PeriodicThreads -- task delete failed\n" );
+ return;
+ }
+ }
+ PeriodicThreads_running = FALSE;
+ PeriodicThreads_initialized = FALSE;
+}
+
+#endif