ICARUS OS (Intelligent Cooperative Architecture for Real-time Unified Systems) 0.1.0
Preemptive Real-Time Operating System for ARM Cortex-M7
Loading...
Searching...
No Matches
scheduler.c
Go to the documentation of this file.
1
16#include "icarus/scheduler.h"
17#include "icarus/kernel.h"
18#include "bsp/config.h"
19
20#include <stddef.h>
21#ifndef HOST_TEST
22#include "stm32h7xx.h"
23#else
24#include "cmsis_gcc.h"
25#endif
26
27/* ============================================================================
28 * SECTION PLACEMENT MACROS
29 * ========================================================================= */
30
31/* Defined centrally in icarus/config.h — included via icarus/kernel.h */
32
33/* ============================================================================
34 * TASK INFORMATION
35 * ========================================================================= */
36
37/* Task name buffer in RAM_D1 for unprivileged access (DTCM protection) */
38#ifndef HOST_TEST
39static char task_name_buffer[ICARUS_MAX_TASK_NAME_LEN] __attribute__((section(".ram_d1")));
40#else
42#endif
43
49 return os_tick_count;
50}
51
59
67 (task_list[current_task_index] != NULL)) {
68 /* Copy name from DTCM to RAM_D1 buffer so unprivileged code can read it */
69 const char *src = task_list[current_task_index]->name;
70 char *dst = task_name_buffer;
71 const uint8_t name_max = (uint8_t)ICARUS_MAX_TASK_NAME_LEN - 1u;
72 uint8_t i = 0u;
73 while ((i < name_max) && (src[i] != '\0')) {
74 dst[i] = src[i];
75 i++;
76 }
77 dst[i] = '\0';
78 return task_name_buffer;
79 }
80 return "unknown";
81}
82
90
91/* ============================================================================
92 * TASK SCHEDULING
93 * ========================================================================= */
94
101 SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
102}
103
115
121ITCM_FUNC uint32_t __task_blocking_sleep(uint32_t ticks) {
123 uint32_t delta = task_busy_wait(ticks);
125 return delta;
126}
127
133ITCM_FUNC uint32_t __task_busy_wait(uint32_t ticks) {
134 uint32_t st = os_get_tick_count();
135 uint32_t delta;
136
137 while (1) {
138#ifdef HOST_TEST
140#endif
141 delta = os_get_tick_count() - st;
142 if (delta >= ticks) {
143 break;
144 }
145 }
146 return delta;
147}
#define ICARUS_MAX_TASK_NAME_LEN
Maximum length of task name string (including null terminator)
Definition config.h:102
#define ITCM_FUNC
Definition config.h:155
ICARUS Kernel Core - State and Initialization.
uint8_t num_created_tasks
Total number of created tasks.
Definition kernel.c:65
volatile uint32_t current_task_ticks_remaining
Ticks remaining in current task's time slice.
Definition kernel.c:66
uint8_t running_task_count
Count of tasks in active states.
Definition kernel.c:64
uint8_t current_task_index
Index of currently executing task.
Definition kernel.c:63
void exit_critical(void)
Exit critical section (re-enable scheduler if outermost)
Definition svc.c:489
icarus_task_t * task_list[128]
Array of pointers to all task control blocks.
Definition kernel.c:50
void enter_critical(void)
Enter critical section (disable scheduler)
Definition svc.c:478
volatile uint32_t os_tick_count
System tick counter.
Definition kernel.c:69
volatile uint32_t ticks_per_task
Configured ticks per time slice.
Definition kernel.c:67
uint32_t __os_get_tick_count(void)
Privileged implementation of os_get_tick_count.
Definition scheduler.c:48
uint32_t __task_blocking_sleep(uint32_t ticks)
Privileged implementation of task_blocking_sleep.
Definition scheduler.c:121
uint8_t __os_get_running_task_count(void)
Privileged implementation of os_get_running_task_count.
Definition scheduler.c:56
const char * __os_get_current_task_name(void)
Privileged implementation of os_get_current_task_name.
Definition scheduler.c:65
uint32_t __task_busy_wait(uint32_t ticks)
Privileged implementation of task_busy_wait.
Definition scheduler.c:133
uint32_t __task_active_sleep(uint32_t ticks)
Privileged implementation of task_active_sleep.
Definition scheduler.c:108
void __os_yield(void)
Privileged implementation of os_yield.
Definition scheduler.c:99
uint32_t __os_get_task_ticks_remaining(void)
Privileged implementation of os_get_task_ticks_remaining.
Definition scheduler.c:87
static char task_name_buffer[32]
Definition scheduler.c:39
ICARUS Scheduler - Task Scheduling and Timing.
uint32_t os_get_tick_count(void)
Get current system tick count.
Definition svc.c:556
uint32_t task_busy_wait(uint32_t ticks)
Busy-wait for specified ticks.
Definition svc.c:549
uint32_t global_tick_paused
Tick count when blocked (offset 20)
Definition types.h:124
char name[32]
Human-readable task name.
Definition types.h:131
icarus_task_state_t task_state
Current task state (offset 16)
Definition types.h:123
uint32_t ticks_to_pause
Ticks to remain blocked (offset 24)
Definition types.h:125
@ TASK_STATE_BLOCKED
Task waiting for timeout or event.
Definition types.h:79