Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:48

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2011 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
0026  */
0027 
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031 
0032 #include <tmacros.h>
0033 
0034 const char rtems_test_name[] = "SPNSEXT 1";
0035 
0036 static rtems_task Init(rtems_task_argument argument)
0037 {
0038   rtems_status_code sc = RTEMS_SUCCESSFUL;
0039   RTEMS_INTERRUPT_LOCK_DECLARE(, lock)
0040   rtems_interrupt_lock_context lock_context;
0041   rtems_interval t0 = 0;
0042   rtems_interval t1 = 0;
0043   int i = 0;
0044   int n = 0;
0045   struct timespec uptime;
0046   struct timespec new_uptime;
0047 
0048   TEST_BEGIN();
0049 
0050   /* Align with clock tick */
0051   t0 = rtems_clock_get_ticks_since_boot();
0052   while ((t1 = rtems_clock_get_ticks_since_boot()) == t0) {
0053     /* Do nothing */
0054   }
0055 
0056   t0 = t1;
0057   sc = rtems_clock_get_uptime(&uptime);
0058   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0059   while ((t1 = rtems_clock_get_ticks_since_boot()) == t0) {
0060     ++n;
0061     sc = rtems_clock_get_uptime(&new_uptime);
0062     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0063     rtems_test_assert(!_Timespec_Less_than(&new_uptime, &uptime));
0064     uptime = new_uptime;
0065   }
0066 
0067   n = (3 * n) / 2;
0068 
0069   rtems_interrupt_lock_initialize(&lock, "test");
0070   rtems_interrupt_lock_acquire(&lock, &lock_context);
0071   sc = rtems_clock_get_uptime(&uptime);
0072   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0073   for (i = 0; i < n; ++i) {
0074     /* Preserve execution time of previous loop */
0075     rtems_clock_get_ticks_since_boot();
0076 
0077     sc = rtems_clock_get_uptime(&new_uptime);
0078     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0079     rtems_test_assert(!_Timespec_Less_than(&new_uptime, &uptime));
0080     uptime = new_uptime;
0081   }
0082   rtems_interrupt_lock_release(&lock, &lock_context);
0083   rtems_interrupt_lock_destroy(&lock);
0084 
0085   TEST_END();
0086 
0087   rtems_test_exit(0);
0088 }
0089 
0090 #define CONFIGURE_INIT
0091 
0092 #define CONFIGURE_MICROSECONDS_PER_TICK 100000
0093 
0094 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0095 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0096 
0097 #define CONFIGURE_MAXIMUM_TASKS 1
0098 
0099 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0100 
0101 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0102 
0103 #include <rtems/confdefs.h>