123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #include "all-headers.h"
- #define ENABLE_XTR_ASSERTIONS
- #ifdef ENABLE_XTR_ASSERTIONS
- #define XTR_ASSERT_NON_NULL_POINTER(ptr) assertNonNullPointer (ptr, __FILE__, __LINE__) ;
- #else
- #define XTR_ASSERT_NON_NULL_POINTER(ptr)
- #endif
- #ifdef ENABLE_XTR_ASSERTIONS
- #define XTR_ASSERT(condition,value) assertion (condition, value, __FILE__, __LINE__) ;
- #else
- #define XTR_ASSERT(condition,value)
- #endif
- typedef struct {
- uint32_t mR0 ;
- uint32_t mR1 ;
- uint32_t mR2 ;
- uint32_t mR3 ;
- uint32_t mR12 ;
- uint32_t mLR ;
- uint32_t mPC ;
- uint32_t mXPSR ;
- } ExceptionFrame_without_floatingPointStorage ;
- typedef struct {
- uint32_t mR4 ;
- uint32_t mR5 ;
- uint32_t mR6 ;
- uint32_t mR7 ;
- uint32_t mR8 ;
- uint32_t mR9 ;
- uint32_t mR10 ;
- uint32_t mR11 ;
- ExceptionFrame_without_floatingPointStorage * mPSP ;
- uint32_t mLR_RETURN_CODE ;
- } TaskContext ;
- static void kernel_set_task_context (INIT_MODE_
- TaskContext & ioTaskContext,
- const uint32_t inStackBufferAddress,
- const uint32_t inStackBufferSize,
- RoutineTaskType inTaskRoutine) {
-
- ioTaskContext.mLR_RETURN_CODE = 0xFFFFFFFD ;
-
- uint32_t initialTopOfStack = inStackBufferAddress + inStackBufferSize ;
- initialTopOfStack -= sizeof (ExceptionFrame_without_floatingPointStorage) ;
-
- auto ptr = (ExceptionFrame_without_floatingPointStorage *) initialTopOfStack ;
- ioTaskContext.mPSP = ptr ;
-
- ptr->mPC = (uint32_t) inTaskRoutine ;
-
- ptr->mXPSR = 1 << 24 ;
- }
- typedef struct TaskControlBlock {
-
- TaskContext mTaskContext ;
-
- uint8_t mTaskIndex ;
- } TaskControlBlock ;
- static TaskControlBlock gTaskDescriptorArray [TASK_COUNT] ;
- TaskControlBlock * descriptorPointerForTaskIndex (const uint8_t inTaskIndex) {
- XTR_ASSERT (inTaskIndex < TASK_COUNT, inTaskIndex) ;
- return & gTaskDescriptorArray [inTaskIndex] ;
- }
- uint8_t indexForDescriptorTask (const TaskControlBlock * inTaskPtr) {
- XTR_ASSERT_NON_NULL_POINTER (inTaskPtr) ;
- return inTaskPtr->mTaskIndex ;
- }
- TaskControlBlock * gRunningTaskControlBlockPtr asm ("var.running.task.control.block.ptr") ;
- static TaskList gReadyTaskList ;
- static void kernel_makeTaskReady (IRQ_MODE_ TaskControlBlock * inTaskPtr) {
- XTR_ASSERT_NON_NULL_POINTER (inTaskPtr) ;
- gReadyTaskList.enterTask (MODE_ inTaskPtr) ;
- }
- void kernelSelectTaskToRun (IRQ_MODE) asm ("kernel.select.task.to.run") ;
- void kernelSelectTaskToRun (IRQ_MODE) {
- if (gRunningTaskControlBlockPtr != nullptr) {
- gReadyTaskList.enterTask (MODE_ gRunningTaskControlBlockPtr) ;
- }
- gRunningTaskControlBlockPtr = gReadyTaskList.removeFirstTask (MODE) ;
- }
- static uint8_t gTaskIndex ;
- void kernel_createTask (INIT_MODE_
- uint64_t * inStackBufferAddress,
- uint32_t inStackBufferSize,
- RoutineTaskType inTaskRoutine) {
- XTR_ASSERT (gTaskIndex < TASK_COUNT, gTaskIndex) ;
- TaskControlBlock * taskControlBlockPtr = & gTaskDescriptorArray [gTaskIndex] ;
- taskControlBlockPtr->mTaskIndex = gTaskIndex ;
-
-
-
-
-
-
-
- kernel_set_task_context (MODE_
- taskControlBlockPtr->mTaskContext,
- (uint32_t) inStackBufferAddress,
- inStackBufferSize,
- inTaskRoutine) ;
-
- kernel_makeTaskReady (MODE_ taskControlBlockPtr) ;
- gTaskIndex += 1 ;
- }
- static void kernel_makeNoTaskRunning(KERNEL_MODE) {
- gRunningTaskControlBlockPtr = nullptr;
- }
- void service_taskSelfTerminates(KERNEL_MODE) {
- kernel_makeNoTaskRunning(MODE);
- }
|