diff options
Diffstat (limited to 'bsps/shared/dev/clock/clock-simidle.c')
-rw-r--r-- | bsps/shared/dev/clock/clock-simidle.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/bsps/shared/dev/clock/clock-simidle.c b/bsps/shared/dev/clock/clock-simidle.c new file mode 100644 index 0000000000..def406a1df --- /dev/null +++ b/bsps/shared/dev/clock/clock-simidle.c @@ -0,0 +1,59 @@ +/* + * Instantiate the clock driver shell. + * + * Since there is no clock source on the simulator, we fake + * it with a special IDLE task. + */ + +#include <rtems.h> +#include <rtems/score/percpu.h> +#include <rtems/score/threaddispatch.h> + +#define CLOCK_VECTOR 0 + +volatile bool clock_driver_enabled; + +#define Clock_driver_support_initialize_hardware() \ + do { \ + clock_driver_enabled = true; \ + } while (0) + +#define Clock_driver_support_shutdown_hardware() \ + do { \ + clock_driver_enabled = false; \ + } while (0) + +#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER + +#include "clockimpl.h" + +/* + * If this is defined, then the BSP has defined a delay of some sort so + * time passage appears somewhat correctly. Otherwise, it runs extremely + * fast with no delays. + */ +#ifndef BSP_CLOCK_DRIVER_DELAY +#define BSP_CLOCK_DRIVER_DELAY() +#endif + +/* + * Since there is no interrupt on this simulator, let's just + * fake time passing. This will not let preemption from an + * interrupt work but is enough for many tests. + */ +void *clock_driver_sim_idle_body( + uintptr_t ignored +) +{ + for( ; ; ) { + if ( clock_driver_enabled ) { + Per_CPU_Control *cpu = _Thread_Dispatch_disable(); + _ISR_Nest_level++; + rtems_clock_tick(); + _ISR_Nest_level--; + _Thread_Dispatch_enable( cpu ); + BSP_CLOCK_DRIVER_DELAY(); + } + } + return 0; /* to avoid warning */ +} |