source: rtems/cpukit/score/src/threaddispatch.c @ 5fa5185

4.104.114.95
Last change on this file since 5fa5185 was 5fa5185, checked in by Joel Sherrill <joel.sherrill@…>, on Jun 6, 2008 at 3:44:11 PM

2008-06-06 Joel Sherrill <joel.sherrill@…>

  • libcsupport/src/times.c, libmisc/cpuuse/cpuusagereport.c, libmisc/cpuuse/cpuusagereset.c, libmisc/monitor/mon-task.c, rtems/include/rtems/rtems/ratemon.h, rtems/src/ratemongetstatus.c, rtems/src/ratemonperiod.c, score/include/rtems/score/thread.h, score/src/threaddispatch.c, score/src/threadinitialize.c, score/src/threadtickletimeslice.c: Add typedefs for cpu usage and period timing statistics. Also renamed related variables and structure members so they are the same whether you are using nanosecond (e.g. struct timespec) or ticks (e.g. uint32_t) granularity. This lays the groundwork for future cleanup.
  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 *  Thread Handler
3 *
4 *
5 *  COPYRIGHT (c) 1989-2007.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in found in the file LICENSE in this distribution or at
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  $Id$
13 */
14
15#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <rtems/system.h>
20#include <rtems/score/apiext.h>
21#include <rtems/score/context.h>
22#include <rtems/score/interr.h>
23#include <rtems/score/isr.h>
24#include <rtems/score/object.h>
25#include <rtems/score/priority.h>
26#include <rtems/score/states.h>
27#include <rtems/score/sysstate.h>
28#include <rtems/score/thread.h>
29#include <rtems/score/threadq.h>
30#include <rtems/score/userext.h>
31#include <rtems/score/wkspace.h>
32
33#ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS
34  #include <rtems/score/timespec.h>
35#endif
36
37/*PAGE
38 *
39 *  _Thread_Enable_dispatch
40 *
41 *  This kernel routine exits a context switch disable critical section.
42 *  This is the NOT INLINED version.
43 *
44 *  Input parameters:  NONE
45 *
46 *  Output parameters:  NONE
47 *
48 *  INTERRUPT LATENCY:
49 *    dispatch thread
50 *    no dispatch thread
51 */
52
53#if ( (CPU_INLINE_ENABLE_DISPATCH == FALSE) || \
54      (__RTEMS_DO_NOT_INLINE_THREAD_ENABLE_DISPATCH__ == 1) )
55void _Thread_Enable_dispatch( void )
56{
57  if ( --_Thread_Dispatch_disable_level )
58    return;
59  _Thread_Dispatch();
60}
61#endif
62
63/*PAGE
64 *
65 *  _Thread_Dispatch
66 *
67 *  This kernel routine determines if a dispatch is needed, and if so
68 *  dispatches to the heir thread.  Once the heir is running an attempt
69 *  is made to dispatch any ASRs.
70 *
71 *  ALTERNATE ENTRY POINTS:
72 *    void _Thread_Enable_dispatch();
73 *
74 *  Input parameters:  NONE
75 *
76 *  Output parameters:  NONE
77 *
78 *  INTERRUPT LATENCY:
79 *    dispatch thread
80 *    no dispatch thread
81 */
82
83void _Thread_Dispatch( void )
84{
85  Thread_Control   *executing;
86  Thread_Control   *heir;
87  ISR_Level         level;
88
89  executing   = _Thread_Executing;
90  _ISR_Disable( level );
91  while ( _Context_Switch_necessary == TRUE ) {
92    heir = _Thread_Heir;
93    _Thread_Dispatch_disable_level = 1;
94    _Context_Switch_necessary = FALSE;
95    _Thread_Executing = heir;
96    executing->rtems_ada_self = rtems_ada_self;
97    rtems_ada_self = heir->rtems_ada_self;
98    if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
99      heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
100    _ISR_Enable( level );
101
102    #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS
103      {
104        struct timespec uptime, ran;
105        _TOD_Get_uptime( &uptime );
106        _Timespec_Subtract(&_Thread_Time_of_last_context_switch, &uptime, &ran);
107        _Timespec_Add_to( &executing->cpu_time_used, &ran );
108        _Thread_Time_of_last_context_switch = uptime;
109      }
110    #else
111      heir->cpu_time_used++;
112    #endif
113
114    /*
115     * Switch libc's task specific data.
116     */
117    if ( _Thread_libc_reent ) {
118      executing->libc_reent = *_Thread_libc_reent;
119      *_Thread_libc_reent = heir->libc_reent;
120    }
121
122    _User_extensions_Thread_switch( executing, heir );
123
124    /*
125     *  If the CPU has hardware floating point, then we must address saving
126     *  and restoring it as part of the context switch.
127     *
128     *  The second conditional compilation section selects the algorithm used
129     *  to context switch between floating point tasks.  The deferred algorithm
130     *  can be significantly better in a system with few floating point tasks
131     *  because it reduces the total number of save and restore FP context
132     *  operations.  However, this algorithm can not be used on all CPUs due
133     *  to unpredictable use of FP registers by some compilers for integer
134     *  operations.
135     */
136
137#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
138#if ( CPU_USE_DEFERRED_FP_SWITCH != TRUE )
139    if ( executing->fp_context != NULL )
140      _Context_Save_fp( &executing->fp_context );
141#endif
142#endif
143
144    _Context_Switch( &executing->Registers, &heir->Registers );
145
146#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
147#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
148    if ( (executing->fp_context != NULL) &&
149         !_Thread_Is_allocated_fp( executing ) ) {
150      if ( _Thread_Allocated_fp != NULL )
151        _Context_Save_fp( &_Thread_Allocated_fp->fp_context );
152      _Context_Restore_fp( &executing->fp_context );
153      _Thread_Allocated_fp = executing;
154    }
155#else
156    if ( executing->fp_context != NULL )
157      _Context_Restore_fp( &executing->fp_context );
158#endif
159#endif
160
161    executing = _Thread_Executing;
162
163    _ISR_Disable( level );
164  }
165
166  _Thread_Dispatch_disable_level = 0;
167
168  _ISR_Enable( level );
169
170  if ( _Thread_Do_post_task_switch_extension ||
171       executing->do_post_task_switch_extension ) {
172    executing->do_post_task_switch_extension = FALSE;
173    _API_extensions_Run_postswitch();
174  }
175
176}
Note: See TracBrowser for help on using the repository browser.