OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [io/] [serial/] [current/] [tests/] [timeout.inl] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
#ifndef CYGONCE_IO_SERIAL_MISC_TIMEOUT_INL
2
#define CYGONCE_IO_SERIAL_MISC_TIMEOUT_INL
3
//==========================================================================
4
//
5
//        timeout.inl
6
//
7
//        Simple timeout support for serial I/O testing.
8
//
9
//==========================================================================
10
// ####ECOSGPLCOPYRIGHTBEGIN####
11
// -------------------------------------------
12
// This file is part of eCos, the Embedded Configurable Operating System.
13
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
14
//
15
// eCos is free software; you can redistribute it and/or modify it under
16
// the terms of the GNU General Public License as published by the Free
17
// Software Foundation; either version 2 or (at your option) any later
18
// version.
19
//
20
// eCos is distributed in the hope that it will be useful, but WITHOUT
21
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23
// for more details.
24
//
25
// You should have received a copy of the GNU General Public License
26
// along with eCos; if not, write to the Free Software Foundation, Inc.,
27
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
28
//
29
// As a special exception, if other files instantiate templates or use
30
// macros or inline functions from this file, or you compile this file
31
// and link it with other works to produce a work based on this file,
32
// this file does not by itself cause the resulting work to be covered by
33
// the GNU General Public License. However the source code for this file
34
// must still be made available in accordance with section (3) of the GNU
35
// General Public License v2.
36
//
37
// This exception does not invalidate any other reasons why a work based
38
// on this file might be covered by the GNU General Public License.
39
// -------------------------------------------
40
// ####ECOSGPLCOPYRIGHTEND####
41
//==========================================================================
42
//#####DESCRIPTIONBEGIN####
43
//
44
// Author(s):     gthomas
45
// Contributors:  gthomas
46
// Date:          1999-02-05
47
// Description:   Simple timeout functions
48
//####DESCRIPTIONEND####
49
 
50
// Timeout support
51
 
52
typedef void (timeout_fun)(void *);
53
#ifndef NTIMEOUTS
54
#define NTIMEOUTS 8
55
#endif
56
typedef struct {
57
    cyg_int32     delta;  // Number of "ticks" in the future for this timeout
58
    timeout_fun  *fun;    // Function to execute when it expires
59
    void         *arg;    // Argument to pass when it does
60
} timeout_entry;
61
static timeout_entry timeouts[NTIMEOUTS];
62
static cyg_handle_t timeout_alarm_handle;
63
static cyg_alarm timeout_alarm;
64
static cyg_int32 last_delta;
65
 
66
static void
67
do_timeout(cyg_handle_t alarm, cyg_addrword_t data)
68
{
69
    int i;
70
    cyg_int32 min_delta;
71
    timeout_entry *e = timeouts;
72
    min_delta = 0x7FFFFFFF;  // Maxint
73
    for (i = 0;  i < NTIMEOUTS;  i++, e++) {
74
        if (e->delta) {
75
            e->delta -= last_delta;
76
            if (e->delta == 0) {
77
                // Time for this item to 'fire'
78
                (e->fun)(e->arg);
79
            } else {
80
                if (e->delta < min_delta) min_delta = e->delta;
81
            }
82
        }
83
    }
84
    if (min_delta != 0x7FFFFFFF) {
85
        // Still something to do, schedule it
86
        cyg_alarm_initialize(timeout_alarm_handle, cyg_current_time()+min_delta, 0);
87
        last_delta = min_delta;
88
    }
89
}
90
 
91
static cyg_uint32
92
timeout(cyg_int32 delta, timeout_fun *fun, void *arg)
93
{
94
    int i;
95
    cyg_int32 min_delta;
96
    static bool init = false;
97
    timeout_entry *e = timeouts;
98
    cyg_uint32 stamp;
99
    if (!init) {
100
        cyg_handle_t h;
101
        cyg_clock_to_counter(cyg_real_time_clock(), &h);
102
        cyg_alarm_create(h, do_timeout, 0, &timeout_alarm_handle, &timeout_alarm);
103
        init = true;
104
    }
105
    stamp = 0;  // Assume no slots available
106
    for (i = 0;  i < NTIMEOUTS;  i++, e++) {
107
        if ((e->delta == 0) && (e->fun == 0)) {
108
            // Free entry
109
            e->delta = delta;
110
            e->fun = fun;
111
            e->arg = arg;
112
            stamp = (cyg_uint32)e;
113
            break;
114
        }
115
    }
116
    e = timeouts;
117
    min_delta = 0x7FFFFFFF;
118
    for (i = 0;  i < NTIMEOUTS;  i++, e++) {
119
        if (e->delta && (e->delta < min_delta)) min_delta = e->delta;
120
    }
121
    if (min_delta != 0x7FFFFFFF) {
122
        // Still something to do, schedule it
123
        cyg_alarm_initialize(timeout_alarm_handle, cyg_current_time()+min_delta, 0);
124
        last_delta = min_delta;
125
    }
126
    return stamp;
127
}
128
 
129
static void
130
untimeout(cyg_uint32 stamp)
131
{
132
    if (stamp != 0) {
133
        timeout_entry *e = (timeout_entry *)stamp;
134
        if (e->fun != 0) {
135
            e->delta = 0;
136
            e->fun = 0;
137
            e->arg = 0;
138
        }
139
    }
140
}
141
 
142
#endif // CYGONCE_IO_SERIAL_MISC_TIMEOUT_INL

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.