File indexing completed on 2025-05-11 08:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #ifdef HAVE_CONFIG_H
0041 #include "config.h"
0042 #endif
0043
0044 #include <rtems/rtems/ratemonimpl.h>
0045
0046 static void _Rate_monotonic_Renew_deadline(
0047 Rate_monotonic_Control *the_period,
0048 ISR_lock_Context *lock_context
0049 )
0050 {
0051 uint64_t deadline;
0052
0053
0054 if ( the_period->postponed_jobs != UINT32_MAX ) {
0055 ++the_period->postponed_jobs;
0056 }
0057
0058 the_period->state = RATE_MONOTONIC_EXPIRED;
0059
0060 deadline = _Watchdog_Per_CPU_insert_ticks(
0061 &the_period->Timer,
0062 _Per_CPU_Get(),
0063 the_period->next_length
0064 );
0065 the_period->latest_deadline = deadline;
0066
0067 _Rate_monotonic_Release( the_period, lock_context );
0068 }
0069
0070 void _Rate_monotonic_Timeout( Watchdog_Control *the_watchdog )
0071 {
0072 Rate_monotonic_Control *the_period;
0073 Thread_Control *owner;
0074 ISR_lock_Context lock_context;
0075 Thread_Wait_flags wait_flags;
0076
0077 the_period = RTEMS_CONTAINER_OF( the_watchdog, Rate_monotonic_Control, Timer );
0078 owner = the_period->owner;
0079
0080 _ISR_lock_ISR_disable( &lock_context );
0081 _Rate_monotonic_Acquire_critical( the_period, &lock_context );
0082 wait_flags = _Thread_Wait_flags_get( owner );
0083
0084 if (
0085 ( wait_flags & THREAD_WAIT_CLASS_PERIOD ) != 0
0086 && owner->Wait.return_argument == the_period
0087 ) {
0088 bool unblock;
0089 bool success;
0090
0091 owner->Wait.return_argument = NULL;
0092
0093 success = _Thread_Wait_flags_try_change_release(
0094 owner,
0095 RATE_MONOTONIC_INTEND_TO_BLOCK,
0096 THREAD_WAIT_STATE_READY
0097 );
0098 if ( success ) {
0099 unblock = false;
0100 } else {
0101 _Assert( _Thread_Wait_flags_get( owner ) == RATE_MONOTONIC_BLOCKED );
0102 _Thread_Wait_flags_set( owner, THREAD_WAIT_STATE_READY );
0103 unblock = true;
0104 }
0105
0106 _Rate_monotonic_Restart( the_period, owner, &lock_context );
0107
0108 if ( unblock ) {
0109 _Thread_Unblock( owner );
0110 }
0111 } else {
0112 _Rate_monotonic_Renew_deadline( the_period, &lock_context );
0113 }
0114 }