diff --git a/examples/blinky/CMakeLists.txt b/examples/blinky/CMakeLists.txt index 8bd4e4c..cdd8386 100644 --- a/examples/blinky/CMakeLists.txt +++ b/examples/blinky/CMakeLists.txt @@ -2,6 +2,7 @@ add_executable(blinky main.c ${CMAKE_SOURCE_DIR}/src/startup/startup_stm32f401.c target_link_libraries(blinky hal_stm32f401 + kernel ) target_link_options(blinky PRIVATE diff --git a/examples/blinky/main.c b/examples/blinky/main.c index 7ca982b..cb853fe 100644 --- a/examples/blinky/main.c +++ b/examples/blinky/main.c @@ -1,13 +1,14 @@ -#include "hal.h" -#include "stdint.h" +#include "fpu.h" +#include "rcc.h" +#include "gpio.h" #include "fault_indicator.h" +#include int main(void) { fpu_init(); rcc_init(); rcc_enable_gpioc(); gpio_init_pc13(); - nvic_init(); while (1) { gpio_toggle_pc13(); diff --git a/examples/rtos_demo/CMakeLists.txt b/examples/rtos_demo/CMakeLists.txt index 4628794..f69f9a0 100644 --- a/examples/rtos_demo/CMakeLists.txt +++ b/examples/rtos_demo/CMakeLists.txt @@ -2,6 +2,7 @@ add_executable(rtos_demo main.c ${CMAKE_SOURCE_DIR}/src/startup/startup_stm32f40 target_link_libraries(rtos_demo hal_stm32f401 + kernel ) target_link_options(rtos_demo PRIVATE diff --git a/examples/rtos_demo/main.c b/examples/rtos_demo/main.c index 345b5b7..140432d 100644 --- a/examples/rtos_demo/main.c +++ b/examples/rtos_demo/main.c @@ -1,6 +1,6 @@ #include "gpio.h" -#include "hal.h" -#include "task.h" +#include "rcc.h" +#include "fpu.h" #include "scheduler.h" #include "fault_indicator.h" #include diff --git a/include/task_types.h b/include/task_types.h new file mode 100644 index 0000000..fe9a1c1 --- /dev/null +++ b/include/task_types.h @@ -0,0 +1,30 @@ +#ifndef TASK_TYPES_H +#define TASK_TYPES_H + +#include +#include "rtos_config.h" + +/* More Granular States for Debugging*/ +typedef enum { + UNINITIALIZED, + READY, + RUNNING, + BLOCKED, + SUSPENDED +} Task_State; + + +typedef struct { + uint32_t *stack_ptr; + uint32_t *stack_base; + uint32_t stack_size; + uint32_t delay_until; + Task_State state; + uint8_t priority; + const char *name; +} Task; + +extern Task task_pool[MAX_TASKS]; +extern uint32_t stack_pool[MAX_TASKS][TASK_STACK_SIZE]; + +#endif \ No newline at end of file diff --git a/src/hal/stm32f401/CMakeLists.txt b/src/hal/stm32f401/CMakeLists.txt index c16c0a4..dd70f2d 100644 --- a/src/hal/stm32f401/CMakeLists.txt +++ b/src/hal/stm32f401/CMakeLists.txt @@ -15,8 +15,4 @@ add_library(hal_stm32f401 STATIC target_include_directories(hal_stm32f401 PUBLIC include ${CMAKE_SOURCE_DIR}/config -) - -target_link_libraries(hal_stm32f401 PUBLIC - port_cortex_m4 ) \ No newline at end of file diff --git a/src/hal/stm32f401/include/fault_indicator.h b/src/hal/stm32f401/include/fault_indicator.h index f701a78..5ba062e 100644 --- a/src/hal/stm32f401/include/fault_indicator.h +++ b/src/hal/stm32f401/include/fault_indicator.h @@ -4,7 +4,7 @@ #include void delay(volatile uint32_t count); -void warning_light_init(void); +void warning_light(void); void warning_light_scheduler(void); #endif \ No newline at end of file diff --git a/src/hal/stm32f401/include/hal.h b/src/hal/stm32f401/include/hal.h deleted file mode 100644 index b9bf0ee..0000000 --- a/src/hal/stm32f401/include/hal.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef HAL_H -#define HAL_H - -#include "rcc.h" -#include "gpio.h" -#include "fpu.h" -#include "nvic.h" - -#endif \ No newline at end of file diff --git a/src/hal/stm32f401/src/fault_indicator.c b/src/hal/stm32f401/src/fault_indicator.c index 516c12d..d1baa4c 100644 --- a/src/hal/stm32f401/src/fault_indicator.c +++ b/src/hal/stm32f401/src/fault_indicator.c @@ -5,46 +5,17 @@ void delay(volatile uint32_t count) { while (count--); } -void warning_light_init(void) { +void warning_light(void) { while (1) { - for (int i = 0; i < 6; i++) { - gpio_toggle_pc13(); - - delay(1000000); - } - - gpio_toggle_pc13(); + gpio_set_pc13(); delay(10000000); - for (int i = 0; i < 4; i++) { - gpio_toggle_pc13(); - - delay(1000000); - } + gpio_clear_pc13(); delay(10000000); - } -} - - -void warning_light_scheduler(void) { - while (1) { - for (int i = 0; i < 6; i++) { - gpio_toggle_pc13(); - - delay(1000000); - } - - gpio_toggle_pc13(); - - delay(10000000); - - for (int i = 0; i < 8; i++) { - gpio_toggle_pc13(); - delay(1000000); - } + gpio_set_pc13(); delay(10000000); } diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index aff8a6f..4a52b26 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -7,10 +7,11 @@ add_library(kernel STATIC ) target_link_libraries(kernel PUBLIC - hal_stm32f401 + port_cortex_m4 ) target_include_directories(kernel PUBLIC include ${CMAKE_SOURCE_DIR}/config + ${CMAKE_SOURCE_DIR}/include ) \ No newline at end of file diff --git a/src/kernel/include/queue.h b/src/kernel/include/queue.h index 5e921d0..306a892 100644 --- a/src/kernel/include/queue.h +++ b/src/kernel/include/queue.h @@ -1,8 +1,8 @@ #ifndef QUEUE_H #define QUEUE_H -#include "stdint.h" #include "task.h" +#include typedef struct { Task *enqueue_waiting; Task *dequeue_waiting; diff --git a/src/kernel/include/task.h b/src/kernel/include/task.h index eb6c056..60feb80 100644 --- a/src/kernel/include/task.h +++ b/src/kernel/include/task.h @@ -1,28 +1,10 @@ #ifndef TASK_H #define TASK_H +#include "rtos_config.h" +#include "task_types.h" #include #include -#include "rtos_config.h" - -/* More Granular States for Debugging*/ -typedef enum { - UNINITIALIZED, - READY, - RUNNING, - BLOCKED, - SUSPENDED -} Task_State; - -typedef struct { - uint32_t *stack_ptr; - uint32_t *stack_base; - uint32_t stack_size; - uint32_t delay_until; - Task_State state; - uint8_t priority; - const char *name; -} Task; Task *task_create(void (*function)(void), uint8_t priority, const char *name); bool task_state_overflow(Task task); diff --git a/src/kernel/src/mutex.c b/src/kernel/src/mutex.c index e9f8481..ecbe3aa 100644 --- a/src/kernel/src/mutex.c +++ b/src/kernel/src/mutex.c @@ -1,7 +1,6 @@ #include "mutex.h" #include "scheduler.h" #include "port.h" -#include "fault_indicator.h" #include void mutex_init(Mutex *mutex) { @@ -13,7 +12,7 @@ void mutex_init(Mutex *mutex) { void mutex_lock(Mutex *mutex) { while (mutex->is_locked) { if (mutex->waiting != NULL) { - warning_light_scheduler(); + port_fault(); } mutex->waiting = current_task; current_task->state = BLOCKED; diff --git a/src/kernel/src/queue.c b/src/kernel/src/queue.c index 2123160..d3b1b64 100644 --- a/src/kernel/src/queue.c +++ b/src/kernel/src/queue.c @@ -1,7 +1,6 @@ #include "queue.h" #include "scheduler.h" #include "port.h" -#include "fault_indicator.h" #include #include @@ -43,7 +42,7 @@ void enqueue(Queue *queue, void *item) { check queue is not full */ while (queue->count == queue->depth) { if (queue->enqueue_waiting != NULL) { - warning_light_scheduler(); + port_fault(); } queue->enqueue_waiting = current_task; current_task->state = BLOCKED; @@ -68,7 +67,7 @@ void enqueue(Queue *queue, void *item) { void dequeue(Queue *queue, void *out) { while (queue->count == 0) { if (queue->dequeue_waiting != NULL) { - warning_light_scheduler(); + port_fault(); } queue->dequeue_waiting = current_task; current_task->state = BLOCKED; diff --git a/src/kernel/src/scheduler.c b/src/kernel/src/scheduler.c index 864a4dc..601e6ab 100644 --- a/src/kernel/src/scheduler.c +++ b/src/kernel/src/scheduler.c @@ -1,9 +1,7 @@ #include "scheduler.h" #include "systick.h" -#include "fault_indicator.h" #include "port.h" #include "nvic.h" -#include "stm32f401xc.h" #include /* Only scheduler.c needs tick count */ @@ -16,12 +14,8 @@ void scheduler_start(void) { } void idle_task(void) { - while (1) { - /* Special ARM Instr - to put CPU to sleep until - next interrupt fires */ - __WFI(); - } + /* This taks just sleeps */ + port_idle(); } void scheduler_init(void) { @@ -43,7 +37,7 @@ void scheduler_tick(void) { Task *cur_task = &task_pool[i]; if (cur_task->state != UNINITIALIZED && task_state_overflow(*cur_task)) { - warning_light_init(); + port_fault(); } if (cur_task->state == BLOCKED && tick_count >= cur_task->delay_until) { diff --git a/src/kernel/src/task.c b/src/kernel/src/task.c index 4f5a6b6..5c27ef7 100644 --- a/src/kernel/src/task.c +++ b/src/kernel/src/task.c @@ -1,6 +1,5 @@ #include "task.h" #include "port.h" -#include "fault_indicator.h" #include "scheduler.h" Task task_pool[MAX_TASKS]; @@ -17,7 +16,7 @@ Task *task_create(void (*function)(void), uint8_t priority, const char *name) { /* Fail if not enough task slots available */ if (new_task_slot == -1) { - warning_light_init(); + port_fault(); } Task *new_task = &task_pool[new_task_slot]; diff --git a/src/port/cortex_m4/CMakeLists.txt b/src/port/cortex_m4/CMakeLists.txt index a57a3d1..fc03633 100644 --- a/src/port/cortex_m4/CMakeLists.txt +++ b/src/port/cortex_m4/CMakeLists.txt @@ -6,10 +6,10 @@ add_library(port_cortex_m4 STATIC ) target_link_libraries(port_cortex_m4 PUBLIC - kernel -) + hal_stm32f401) target_include_directories(port_cortex_m4 PUBLIC include ${CMAKE_SOURCE_DIR}/config + ${CMAKE_SOURCE_DIR}/include ) \ No newline at end of file diff --git a/src/port/cortex_m4/include/port.h b/src/port/cortex_m4/include/port.h index 256ad42..cbca164 100644 --- a/src/port/cortex_m4/include/port.h +++ b/src/port/cortex_m4/include/port.h @@ -1,8 +1,9 @@ #ifndef PORT_H #define PORT_H +#include "task_types.h" +#include "fault_indicator.h" #include -#include "task.h" #define PENDSVSET (1U << 28) @@ -14,5 +15,7 @@ void port_trigger_context_switch(void); /* In port.s */ void PendSV_Handler(void); void port_start_first_task(void); +void port_fault(void); +void port_idle(void); #endif \ No newline at end of file diff --git a/src/port/cortex_m4/include/systick.h b/src/port/cortex_m4/include/systick.h index 50e218d..5b4d491 100644 --- a/src/port/cortex_m4/include/systick.h +++ b/src/port/cortex_m4/include/systick.h @@ -2,6 +2,6 @@ #define SYSTICK_H void systick_init(void); -void SysTick_Handler(void); +void SysTick_Handler(void (*tick_callback)(void)); #endif \ No newline at end of file diff --git a/src/port/cortex_m4/src/port.c b/src/port/cortex_m4/src/port.c index e5b6aa8..18f6361 100644 --- a/src/port/cortex_m4/src/port.c +++ b/src/port/cortex_m4/src/port.c @@ -80,4 +80,14 @@ void port_init_task_stack(Task *task, void (*function)(void)) { context to memory */ void port_trigger_context_switch(void) { SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; +} + +void port_fault(void) { + warning_light(); +} + +void port_idle(void) { + while (1) { + __WFI(); + } } \ No newline at end of file diff --git a/src/port/cortex_m4/src/systick.c b/src/port/cortex_m4/src/systick.c index a957273..a1a289a 100644 --- a/src/port/cortex_m4/src/systick.c +++ b/src/port/cortex_m4/src/systick.c @@ -1,5 +1,4 @@ #include "systick.h" -#include "scheduler.h" #include "stm32f401xc.h" void systick_init(void) { @@ -28,6 +27,6 @@ void systick_init(void) { SysTick->VAL = 0x00; } -void SysTick_Handler(void) { - scheduler_tick(); +void SysTick_Handler(void (*tick_callback)(void)) { + tick_callback(); } \ No newline at end of file diff --git a/src/startup/startup_stm32f401.c b/src/startup/startup_stm32f401.c index 3ee7405..2043e67 100644 --- a/src/startup/startup_stm32f401.c +++ b/src/startup/startup_stm32f401.c @@ -176,7 +176,7 @@ void (* const vector_table[])(void) = { /* Function definitions */ void Default_Handler(void) { - warning_light_init(); + warning_light(); } void Reset_Handler(void) { @@ -197,41 +197,41 @@ void Reset_Handler(void) { main(); - warning_light_init(); + warning_light(); } void NMI_Handler(void) { - warning_light_init(); + warning_light(); } void HardFault_Handler(void) { - warning_light_init(); + warning_light(); } void MemManage_Handler(void) { - warning_light_init(); + warning_light(); } void BusFault_Handler(void) { - warning_light_init(); + warning_light(); } void UsageFault_Handler(void) { - warning_light_init(); + warning_light(); } void SVC_Handler(void) { - warning_light_init(); + warning_light(); } void DebugMon_Handler(void) { - warning_light_init(); + warning_light(); } void PendSV_Handler(void) { - warning_light_init(); + warning_light(); } void SysTick_Handler(void) { - warning_light_init(); + warning_light(); }