#ifndef TASK01_NOTIFICATIONS_H #define TASK01_NOTIFICATIONS_H #include #include "FreeRTOS.h" #include "task.h" #include "task01_notifications_model.h" #define FC10_BITS_A 0x04U #define FC10_BITS_B 0x20U #define FC10_BITS_ALL ( FC10_BITS_A | FC10_BITS_B ) #define FC10_TASK_STACK_WORDS 256U #define FC10_SENDER_PRIORITY 3U #define FC10_RECEIVER_PRIORITY 2U #define FC10_VERIFIER_PRIORITY 0U #define FC10_TIMEOUT_TICKS 20U #define FC10_EVENT_CAPACITY 14U typedef struct NotificationExperiment { TaskHandle_t sender_handle; TaskHandle_t receiver_handle; TaskHandle_t verifier_handle; eTaskState receiver_state_before_count; eTaskState receiver_state_before_overwrite; eTaskState receiver_state_before_bits; uint32_t count_result; uint32_t overwrite_result; uint32_t bits_result; uint32_t clear_after_count; uint32_t clear_after_overwrite; uint32_t clear_after_bits; volatile uint32_t receiver_phase; uintptr_t sender_sp; uintptr_t receiver_sp; uint32_t sender_done; uint32_t receiver_done; uint32_t pass; uint32_t evidence_digest; } NotificationExperiment; extern NotificationExperiment g_fc10; extern NotificationEvidence g_fc10_events[ FC10_EVENT_CAPACITY ]; extern volatile uint32_t g_fc10_event_count; extern volatile uint32_t g_fc10_last_checkpoint; extern volatile uint32_t g_fc10_pass; void fc10_checkpoint_committed( uint32_t point, const void * subject ); void fc10_sender_entry( void * context ); void fc10_receiver_entry( void * context ); void fc10_verifier_entry( void * context ); #endif