A comprehensive Real-Time Operating System (RTOS) priority scheduler implementation with completely separated synchronization mechanisms including semaphores, events, signals, and message queues.
Scheduler/
¦§¦¡¦¡ include/ # Header files
¦¢ ¦§¦¡¦¡ scheduler.h # Priority scheduler (task management only)
¦¢ ¦§¦¡¦¡ task.h # Task definition and management
¦¢ ¦§¦¡¦¡ semaphore.h # Independent Semaphore + SemaphoreManager
¦¢ ¦§¦¡¦¡ event.h # Independent Event + EventManager
¦¢ ¦§¦¡¦¡ signal.h # Independent Signal + SignalManager
¦¢ ¦¦¦¡¦¡ message_queue.h # Independent MessageQueue + MessageQueueManager
¦§¦¡¦¡ source/ # Implementation files
¦¢ ¦§¦¡¦¡ scheduler.cpp
¦¢ ¦§¦¡¦¡ task.cpp
¦¢ ¦§¦¡¦¡ semaphore.cpp
¦¢ ¦§¦¡¦¡ event.cpp
¦¢ ¦§¦¡¦¡ signal.cpp
¦¢ ¦¦¦¡¦¡ message_queue.cpp
¦§¦¡¦¡ test/ # Test files
¦¢ ¦§¦¡¦¡ test_*.cpp # Individual component tests
¦¢ ¦¦¦¡¦¡ main_*.cpp # Test main functions
¦§¦¡¦¡ main.cpp # Complete example with all components
¦§¦¡¦¡ CMakeLists.txt # Build configuration
¦¦¦¡¦¡ README.md # This file
# Clone or navigate to the project directory
cd Scheduler
# Create build directory
mkdir build
cd build
# Configure with CMake
cmake ..
# Build the project
cmake --build .
# On Windows with Visual Studio
cmake --build . --config Debug
main: Complete example demonstrating all componentstest_scheduler: All tests combinedtest_basic: Basic scheduler functionality teststest_semaphore: Semaphore functionality teststest_event: Event functionality teststest_signal: Signal functionality teststest_message_queue: Message queue functionality teststest_sync_management: Synchronization object management testsEach component can be used completely independently:
#include "scheduler.h"
#include "semaphore.h"
#include "event.h"
#include "signal.h"
#include "message_queue.h"
using namespace RTOS;
int main() {
// 1. Scheduler (independent)
PriorityScheduler scheduler;
uint32_t task_id = scheduler.create_task(5); // Priority 5
// 2. Semaphore Manager (independent)
SemaphoreManager sem_manager;
uint32_t sem_id = sem_manager.create_semaphore(2); // Initial count: 2
sem_manager.semaphore_post(sem_id);
// 3. Event Manager (independent)
EventManager event_manager;
uint32_t event_id = event_manager.create_event();
event_manager.event_set(event_id, 0x0F); // Set bits 0-3
// 4. Signal Manager (independent)
SignalManager signal_manager;
uint32_t signal_id = signal_manager.create_signal();
signal_manager.signal_send(signal_id);
// 5. Message Queue Manager (independent)
MessageQueueManager mq_manager;
uint32_t mq_id = mq_manager.create_message_queue(10);
mq_manager.message_queue_send(mq_id, 1, "Hello World");
return 0;
}
Components can also be used together for complex RTOS applications:
// Create scheduler and synchronization managers
PriorityScheduler scheduler;
SemaphoreManager sem_manager;
EventManager event_manager;
// Create tasks
uint32_t task1 = scheduler.create_task(1);
uint32_t task2 = scheduler.create_task(2);
// Create synchronization objects
uint32_t resource_sem = sem_manager.create_semaphore(1);
uint32_t comm_event = event_manager.create_event();
// Task 1: Acquire resource and signal completion
scheduler.set_current_task(scheduler.get_next_task());
sem_manager.semaphore_wait(resource_sem, 1000);
// ... do work ...
sem_manager.semaphore_post(resource_sem);
event_manager.event_set(comm_event, 0x01);
// Task 2: Wait for completion signal
scheduler.set_current_task(scheduler.get_next_task());
event_manager.event_wait(comm_event, 0x01, true, 1000);
// ... process completion ...
Run individual component tests:
# Run all tests
./Debug/test_scheduler.exe
# Run specific component tests
./Debug/test_semaphore.exe
./Debug/test_event.exe
./Debug/test_signal.exe
./Debug/test_message_queue.exe
./Debug/test_sync_management.exe
# Run complete example
./Debug/main.exe
create_task(priority, data): Create a new taskget_next_task(): Get highest priority ready taskset_current_task(task): Set currently executing taskget_total_task_count(): Get total number of tasksget_highest_ready_priority(): Get highest priority with ready taskscreate_semaphore(initial_count): Create semaphoredelete_semaphore(sem_id): Delete semaphoresemaphore_wait(sem_id, timeout_ms): Wait for semaphoresemaphore_post(sem_id): Release semaphoresemaphore_get_count(sem_id): Get current countcreate_event(): Create event objectdelete_event(event_id): Delete eventevent_set(event_id, bits): Set event bitsevent_clear(event_id, bits): Clear event bitsevent_wait(event_id, mask, clear_on_exit, timeout_ms): Wait for eventevent_get_bits(event_id): Get current event bitscreate_signal(): Create signaldelete_signal(signal_id): Delete signalsignal_send(signal_id): Send signalsignal_reset(signal_id): Reset signalsignal_wait(signal_id, timeout_ms): Wait for signalsignal_is_set(signal_id): Check if signal is setcreate_message_queue(max_size): Create message queuedelete_message_queue(mq_id): Delete message queuemessage_queue_send(mq_id, type, data, timeout_ms): Send messagemessage_queue_receive(mq_id, type, data, timeout_ms): Receive messagemessage_queue_get_count(mq_id): Get message countmessage_queue_is_empty(mq_id): Check if queue is emptymessage_queue_is_full(mq_id): Check if queue is fullThis project is part of the TestSimulator suite for firmware testing and simulation.
This is a simulation and testing framework. Contributions for enhanced functionality, additional synchronization primitives, or improved performance are welcome.
Note: This implementation is designed for educational purposes and firmware simulation. For production embedded systems, consider additional safety and reliability features.
HTML
33.4%
JavaScript
25.3%
C#
19.5%
TypeScript
9.6%
C
4.3%
CSS
2.8%
Python
1.1%
C++
1.0%
A comprehensive Real-Time Operating System (RTOS) priority scheduler implementation with completely separated synchronization mechanisms including semaphores, events, signals, and message queues.
Scheduler/
¦§¦¡¦¡ include/ # Header files
¦¢ ¦§¦¡¦¡ scheduler.h # Priority scheduler (task management only)
¦¢ ¦§¦¡¦¡ task.h # Task definition and management
¦¢ ¦§¦¡¦¡ semaphore.h # Independent Semaphore + SemaphoreManager
¦¢ ¦§¦¡¦¡ event.h # Independent Event + EventManager
¦¢ ¦§¦¡¦¡ signal.h # Independent Signal + SignalManager
¦¢ ¦¦¦¡¦¡ message_queue.h # Independent MessageQueue + MessageQueueManager
¦§¦¡¦¡ source/ # Implementation files
¦¢ ¦§¦¡¦¡ scheduler.cpp
¦¢ ¦§¦¡¦¡ task.cpp
¦¢ ¦§¦¡¦¡ semaphore.cpp
¦¢ ¦§¦¡¦¡ event.cpp
¦¢ ¦§¦¡¦¡ signal.cpp
¦¢ ¦¦¦¡¦¡ message_queue.cpp
¦§¦¡¦¡ test/ # Test files
¦¢ ¦§¦¡¦¡ test_*.cpp # Individual component tests
¦¢ ¦¦¦¡¦¡ main_*.cpp # Test main functions
¦§¦¡¦¡ main.cpp # Complete example with all components
¦§¦¡¦¡ CMakeLists.txt # Build configuration
¦¦¦¡¦¡ README.md # This file
# Clone or navigate to the project directory
cd Scheduler
# Create build directory
mkdir build
cd build
# Configure with CMake
cmake ..
# Build the project
cmake --build .
# On Windows with Visual Studio
cmake --build . --config Debug
main: Complete example demonstrating all componentstest_scheduler: All tests combinedtest_basic: Basic scheduler functionality teststest_semaphore: Semaphore functionality teststest_event: Event functionality teststest_signal: Signal functionality teststest_message_queue: Message queue functionality teststest_sync_management: Synchronization object management testsEach component can be used completely independently:
#include "scheduler.h"
#include "semaphore.h"
#include "event.h"
#include "signal.h"
#include "message_queue.h"
using namespace RTOS;
int main() {
// 1. Scheduler (independent)
PriorityScheduler scheduler;
uint32_t task_id = scheduler.create_task(5); // Priority 5
// 2. Semaphore Manager (independent)
SemaphoreManager sem_manager;
uint32_t sem_id = sem_manager.create_semaphore(2); // Initial count: 2
sem_manager.semaphore_post(sem_id);
// 3. Event Manager (independent)
EventManager event_manager;
uint32_t event_id = event_manager.create_event();
event_manager.event_set(event_id, 0x0F); // Set bits 0-3
// 4. Signal Manager (independent)
SignalManager signal_manager;
uint32_t signal_id = signal_manager.create_signal();
signal_manager.signal_send(signal_id);
// 5. Message Queue Manager (independent)
MessageQueueManager mq_manager;
uint32_t mq_id = mq_manager.create_message_queue(10);
mq_manager.message_queue_send(mq_id, 1, "Hello World");
return 0;
}
Components can also be used together for complex RTOS applications:
// Create scheduler and synchronization managers
PriorityScheduler scheduler;
SemaphoreManager sem_manager;
EventManager event_manager;
// Create tasks
uint32_t task1 = scheduler.create_task(1);
uint32_t task2 = scheduler.create_task(2);
// Create synchronization objects
uint32_t resource_sem = sem_manager.create_semaphore(1);
uint32_t comm_event = event_manager.create_event();
// Task 1: Acquire resource and signal completion
scheduler.set_current_task(scheduler.get_next_task());
sem_manager.semaphore_wait(resource_sem, 1000);
// ... do work ...
sem_manager.semaphore_post(resource_sem);
event_manager.event_set(comm_event, 0x01);
// Task 2: Wait for completion signal
scheduler.set_current_task(scheduler.get_next_task());
event_manager.event_wait(comm_event, 0x01, true, 1000);
// ... process completion ...
Run individual component tests:
# Run all tests
./Debug/test_scheduler.exe
# Run specific component tests
./Debug/test_semaphore.exe
./Debug/test_event.exe
./Debug/test_signal.exe
./Debug/test_message_queue.exe
./Debug/test_sync_management.exe
# Run complete example
./Debug/main.exe
create_task(priority, data): Create a new taskget_next_task(): Get highest priority ready taskset_current_task(task): Set currently executing taskget_total_task_count(): Get total number of tasksget_highest_ready_priority(): Get highest priority with ready taskscreate_semaphore(initial_count): Create semaphoredelete_semaphore(sem_id): Delete semaphoresemaphore_wait(sem_id, timeout_ms): Wait for semaphoresemaphore_post(sem_id): Release semaphoresemaphore_get_count(sem_id): Get current countcreate_event(): Create event objectdelete_event(event_id): Delete eventevent_set(event_id, bits): Set event bitsevent_clear(event_id, bits): Clear event bitsevent_wait(event_id, mask, clear_on_exit, timeout_ms): Wait for eventevent_get_bits(event_id): Get current event bitscreate_signal(): Create signaldelete_signal(signal_id): Delete signalsignal_send(signal_id): Send signalsignal_reset(signal_id): Reset signalsignal_wait(signal_id, timeout_ms): Wait for signalsignal_is_set(signal_id): Check if signal is setcreate_message_queue(max_size): Create message queuedelete_message_queue(mq_id): Delete message queuemessage_queue_send(mq_id, type, data, timeout_ms): Send messagemessage_queue_receive(mq_id, type, data, timeout_ms): Receive messagemessage_queue_get_count(mq_id): Get message countmessage_queue_is_empty(mq_id): Check if queue is emptymessage_queue_is_full(mq_id): Check if queue is fullThis project is part of the TestSimulator suite for firmware testing and simulation.
This is a simulation and testing framework. Contributions for enhanced functionality, additional synchronization primitives, or improved performance are welcome.
Note: This implementation is designed for educational purposes and firmware simulation. For production embedded systems, consider additional safety and reliability features.
HTML
33.4%
JavaScript
25.3%
C#
19.5%
TypeScript
9.6%
C
4.3%
CSS
2.8%
Python
1.1%
C++
1.0%