6 #include "RtosPortable.hpp"
7 #include "RtosInterrupt.hpp"
10 #include "RtosTask.hpp"
11 #include "RtosMacros.hpp"
14 void RtosPortable::start() {
15 SCB->SHP[7] = RTOS_INT_PRI;
16 SCB->SHP[10] = RTOS_INT_PRI;
17 SCB->SHP[11] = RTOS_INT_PRI;
19 SysTick->LOAD = (RTOS_CFG_CPU_FREQUENCY / RTOS_CFG_TICK_FREQUENCY) - 1;
20 SysTick->CTRL = 0x00000007;
24 " ldr r0, =0xE000ED08 \n"
32 void RtosPortable::yield() {
36 void* RtosPortable::stackInit(
void* stack,
size_t stackSize,
void(*run)(
void*),
void *parameter) {
37 uint32_t* ptr = (uint32_t*) stack;
38 size_t stackSizeWords = stackSize >> 2;
40 for (
size_t i = 0; i < stackSizeWords; i++) {
41 ptr[i] = STACK_FILL_VALUE;
44 ptr = &(((uint32_t*) stack)[stackSizeWords - 1]);
47 *--ptr = (uint32_t) run;
48 *--ptr = (uint32_t) 0;
53 *--ptr = (uint32_t) parameter;
67 bool RtosPortable::isStackOverflow(
void* stack,
size_t stackSize) {
68 return (((uint32_t*) stack)[0] != STACK_FILL_VALUE);
71 size_t RtosPortable::getFreeStackSize(
void* stack,
size_t stackSize) {
72 uint32_t* p = (uint32_t*) stack;
74 for (; size < stackSize; size += 4) {
75 if (*p++ != STACK_FILL_VALUE) {
82 uint32_t RtosPortable::getCyclesCounter() {
83 uint32_t cycles = SysTick->LOAD - SysTick->VAL;
85 if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) {
87 cycles = SysTick->LOAD - SysTick->VAL;
89 return ((ticks * (RTOS_CFG_CPU_FREQUENCY / RTOS_CFG_TICK_FREQUENCY)) + cycles);
92 void RtosPortable::enterCriticalSection() {
101 void RtosPortable::exitCriticalSection() {
105 " msr basepri, r0 \n"
110 void RtosPortable::disableAllInt() {
114 " msr primask, r0 \n "
119 void RtosPortable::enableAllInt() {
123 " msr primask, r0 \n "
128 __attribute__((naked)) void RtosInterrupt::IRQ_SVCall(
void) {
130 " mov r0, %[currentTask] \n"
131 " ldmia r0!, {r4-r11} \n"
132 " ldmia r0!, {lr} \n"
135 " msr basepri, r0 \n"
140 __attribute__((naked)) void RtosInterrupt::IRQ_SysTick(
void) {
143 " stmdb r0!, {lr} \n"
144 " stmdb r0!, {r4-r11} \n"
146 " bl _ZN4Rtos6onTickEv \n"
147 #if RTOS_CFG_TRACE_BUFFER_SIZE
148 " movw r0, #0xe010 \n"
149 " movt r0, #0xe000 \n"
153 " bl _ZN4Rtos8scheduleEPv \n"
154 " ldmia r0!, {r4-r11} \n"
155 " ldmia r0!, {lr} \n"
158 " msr basepri, r0 \n"
163 __attribute__((naked)) void RtosInterrupt::IRQ_PendSV(
void) {
166 " stmdb r0!, {lr} \n"
167 " stmdb r0!, {r4-r11} \n"
168 " bl _ZN4Rtos8scheduleEPv \n"
169 " ldmia r0!, {r4-r11} \n"
170 " ldmia r0!, {lr} \n"
173 " msr basepri, r0 \n"