1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* SPDX-License-Identifier: MIT
*
* [AMENDMENT] This is the dummy port for FreeRTOS-in-Rust.
* It provides stub implementations that compile but panic at runtime.
* Used during early development to validate kernel translation.
*
* Based on portable/GCC/ARM_CM3/portmacro.h structure.
*/
//! Dummy Port Implementation
//!
//! This port provides stub implementations that allow the kernel to compile
//! without real hardware support. All functions that would perform hardware
//! operations will panic at runtime.
//!
//! **WARNING**: Do not use this port in production! It is only for development
//! and testing of the kernel translation.
use crate*;
use ;
// =============================================================================
// Port Constants
// =============================================================================
/// Stack growth direction: -1 for descending (most common), +1 for ascending
pub const portSTACK_GROWTH: BaseType_t = -1;
/// Byte alignment requirement for stack and heap allocations
pub const portBYTE_ALIGNMENT: usize = 8;
// =============================================================================
// Critical Section Management
// =============================================================================
/// Critical section nesting counter
/// \[AMENDMENT\] Using atomic for thread-safety during host testing
static CRITICAL_NESTING: AtomicUsize = new;
/// Enter a critical section (disable interrupts)
///
/// \[AMENDMENT\] In the dummy port, this just increments a counter.
/// A real port would disable interrupts here.
/// Exit a critical section (potentially re-enable interrupts)
///
/// \[AMENDMENT\] In the dummy port, this decrements the counter.
/// A real port would re-enable interrupts when nesting reaches zero.
/// Disable interrupts
///
/// \[AMENDMENT\] Dummy implementation - no-op.
/// A real port would disable interrupts at the hardware level.
/// Enable interrupts
///
/// \[AMENDMENT\] Dummy implementation - no-op.
/// A real port would enable interrupts at the hardware level.
/// Set interrupt mask from ISR (save and disable)
///
/// Returns the previous interrupt state for restoration.
/// Clear interrupt mask from ISR (restore previous state)
// =============================================================================
// Context Switching / Yield
// =============================================================================
/// Trigger a context switch (yield to scheduler)
///
/// \[AMENDMENT\] Dummy implementation panics - cannot actually context switch.
/// Yield from ISR if needed
/// End switching ISR (same as yield from ISR)
// =============================================================================
// Scheduler Start/Stop
// =============================================================================
/// Start the scheduler
///
/// \[AMENDMENT\] Dummy implementation panics - cannot actually start scheduler.
/// A real port would:
/// 1. Set up the tick timer
/// 2. Initialize the first task's stack
/// 3. Start execution of the first task (never returns)
/// End the scheduler
///
/// \[AMENDMENT\] Most ports don't actually support stopping the scheduler.
// =============================================================================
// Stack Initialization
// =============================================================================
/// Initialize a task's stack
///
/// Sets up the initial stack frame so the task can be started by the scheduler.
///
/// # Arguments
/// * `pxTopOfStack` - Pointer to the top of the allocated stack
/// * `pxCode` - Task entry point function
/// * `pvParameters` - Parameter to pass to the task function
///
/// # Returns
/// Pointer to the new top of stack after initialization
///
/// \[AMENDMENT\] Dummy implementation returns the input pointer unchanged.
/// A real port would set up:
/// - Initial register values
/// - Return address (task function)
/// - Parameter in appropriate register
/// - Status register with interrupts enabled
// =============================================================================
// Tick Timer Setup
// =============================================================================
/// Set up the tick timer interrupt
///
/// \[AMENDMENT\] Dummy implementation - no-op.
/// A real port would configure the SysTick or equivalent timer.
// =============================================================================
// Utility Functions
// =============================================================================
/// Check if currently executing in an interrupt context
///
/// \[AMENDMENT\] Dummy implementation always returns false (not in ISR).
/// No-operation
/// Memory barrier
///
/// \[AMENDMENT\] Using compiler fence as portable memory barrier.
// =============================================================================
// Architecture Name
// =============================================================================
/// Architecture name string for this port
pub const portARCH_NAME: &str = "Dummy";
// =============================================================================
// Run-time Stats Timer Support
// =============================================================================
/// Run-time stats counter value.
/// This counter is incremented to provide a time base for run-time statistics.
static mut ulRunTimeCounterValue: crateconfigRUN_TIME_COUNTER_TYPE = 0;
/// Configure the timer for run-time stats collection.
/// This is called from vTaskStartScheduler() before starting the scheduler.
/// Get the current run-time counter value.
/// This is called from vTaskSwitchContext() to calculate task run times.
/// Increment the run-time counter.
/// This should be called from the tick interrupt to update the counter.
// =============================================================================
// Tickless Idle Support
// =============================================================================
/// Suppress ticks and enter a low-power sleep mode (dummy implementation).
///
/// The dummy port does not support actual low-power sleep.
/// This is a no-op stub for compilation purposes.