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() {
34 SCB ->ICSR |= 1 << 28;
37 void* RtosPortable::stackInit(
void* stack,
size_t stackSize,
void (*run)(
void*),
void *parameter) {
38 uint32_t* ptr = (uint32_t*) stack;
39 size_t stackSizeWords = stackSize >> 2;
41 for (
size_t i = 0; i < stackSizeWords; i++) {
42 ptr[i] = STACK_FILL_VALUE;
45 ptr = &(((uint32_t*) stack)[stackSizeWords - 1]);
48 *--ptr = (uint32_t) run;
49 *--ptr = (uint32_t) 0;
54 *--ptr = (uint32_t) parameter;
68 bool RtosPortable::isStackOverflow(
void* stack,
size_t stackSize) {
69 return (((uint32_t*) stack)[0] != STACK_FILL_VALUE);
72 size_t RtosPortable::getFreeStackSize(
void* stack,
size_t stackSize) {
73 uint32_t* p = (uint32_t*) stack;
75 for (; size < stackSize; size += 4) {
76 if (*p++ != STACK_FILL_VALUE) {
83 uint32_t RtosPortable::getCyclesCounter() {
84 uint32_t cycles = SysTick ->LOAD - SysTick ->VAL;
86 if (SysTick ->CTRL & SysTick_CTRL_COUNTFLAG_Msk) {
88 cycles = SysTick ->LOAD - SysTick ->VAL;
90 return ((ticks * (RTOS_CFG_CPU_FREQUENCY / RTOS_CFG_TICK_FREQUENCY)) + cycles);
93 void RtosPortable::enterCriticalSection() {
102 void RtosPortable::exitCriticalSection() {
106 " msr basepri, r0 \n"
111 void RtosPortable::disableAllInt() {
115 " msr primask, r0 \n "
120 void RtosPortable::enableAllInt() {
124 " msr primask, r0 \n "
129 __attribute__((naked)) void RtosInterrupt::IRQ_SVCall(
void) {
131 " mov r0, %[currentTask] \n"
132 " ldmia r0!, {r4-r11} \n"
133 " ldmia r0!, {lr} \n"
136 " msr basepri, r0 \n"
141 __attribute__((naked)) void RtosInterrupt::IRQ_SysTick(
void) {
146 " vstmdbeq r0!, {s16-s31} \n"
147 " stmdb r0!, {lr} \n"
148 " stmdb r0!, {r4-r11} \n"
150 " bl _ZN4Rtos6onTickEv \n"
151 #if RTOS_CFG_TRACE_BUFFER_SIZE
152 " movw r0, #0xe010 \n"
153 " movt r0, #0xe000 \n"
157 " bl _ZN4Rtos8scheduleEPv \n"
158 " ldmia r0!, {r4-r11} \n"
159 " ldmia r0!, {lr} \n"
162 " vldmiaeq r0!, {s16-s31} \n"
165 " msr basepri, r0 \n"
170 __attribute__((naked)) void RtosInterrupt::IRQ_PendSV(
void) {
175 " vstmdbeq r0!, {s16-s31} \n"
176 " stmdb r0!, {lr} \n"
177 " stmdb r0!, {r4-r11} \n"
178 " bl _ZN4Rtos8scheduleEPv \n"
179 " ldmia r0!, {r4-r11} \n"
180 " ldmia r0!, {lr} \n"
183 " vldmiaeq r0!, {s16-s31} \n"
186 " msr basepri, r0 \n"