1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
4 * 2019/8/14 - ROBIN KRENS
8 * SysTick of Cortex M* MCUs. Have a look at the more complex RTC
9 * in case more accurate timing is needed.
18 #include <sys/robsys.h>
21 #include <lib/regfunc.h>
22 #include <lib/tinyprintf.h>
34 // uint32_t *stack_ptr;
38 //struct proces p1, p2, p3;
44 //uint32_t task0_stack[50];
45 //uint32_t task1_stack[50];
46 //uint32_t task2_stack[50];
47 //uint32_t PSP_array[3];
49 struct interrupt_frame {
61 //__attribute__ ((interrupt))
62 void * systick_handler(/* struct interrupt_frame * frame */) {
64 //printf("Ticking...\n");
65 //printf("Current task: %d", curr_task);
72 // case(0): next_task = 1; break;
73 // case(1): next_task = 2; break;
74 // case(2): next_task = 0; break;
75 // default: next_task = 0; break;
78 //if (curr_task != next_task) {
87 __attribute__ ((naked))
88 void * pendsv_handler_c(void) {
90 // asm volatile ("push {r0-r11, lr}");
91 // asm volatile ("mrs %0, psp" : "=r" (oldpsp));
92 // asm volatile ("push {lr}");
94 // //asm volatile ("push {lr}");
96 // //printf("FROM MSP %x", oldpsp);
97 // //PSP_array[curr_task] = oldpsp;
98 // //curr_task = next_task;
99 // //newpsp = PSP_array[next_task];
101 // asm volatile ("msr psp, %0" : : "r" (newpsp));
103 // asm volatile("pop {lr}");
104 // //asm volatile ("pop {r0-r12}");
105 // asm volatile("bx lr"); // return
108 uint32_t set_psp(uint32_t) __attribute__( ( naked ) );
109 uint32_t set_psp(uint32_t stackie) {
111 asm volatile ("msr psp, r0" "\n\t"
115 void systick_init() {
121 /* Every time the counter counts down to zero
122 * a systick exception is invoked. Systick has
123 * exception number 15. in the vector table */
124 ivt_set_gate(15, systick_handler, 0);
126 /* Get calibration and set this to 1 sec
127 * !Most boards have a 1 ms or 10 ms
128 * calibration value */
129 int calib = (*STK_CALIB << 0) * 200;
131 /* The counter reload registers counts down to zero
132 * and then it is restores the value */
133 rwrite(STK_RELOAD, calib);
135 /* Enable the counter and enable the interrupt
136 * associated with it */
137 rsetbit(STK_CTRL, 0);
138 rsetbit(STK_CTRL, 1);
140 // extern void task0(void), task1(void), task2(void);
142 // int size_stack = sizeof(task0_stack);
144 // p1.stack_ptr = ((unsigned int) task0_stack) + size_stack - 0x1C;
145 // p1.stack_ptr[6] = (uint32_t) task0;
146 // p1.stack_ptr[7] = 0x01000000;
147 // p2.stack_ptr = ((unsigned int) task0_stack) + size_stack - 0x1C;
148 // p2.stack_ptr[6] = (uint32_t) task1;
149 // p2.stack_ptr[7] = 0x01000000;
150 // p3.stack_ptr = ((unsigned int) task0_stack) + size_stack - 0x1C;
151 // p3.stack_ptr[6] = (uint32_t) task2;
152 // p3.stack_ptr[7] = 0x01000000;
154 // set_psp(p1.stack_ptr[-7]);
158 /* Initialize processes */
159 //PSP_array[0] = ((unsigned int) task0_stack) + sizeof(task0_stack) - 32*4;
160 //HW_ADDR(PSP_array[0] + 0x18) = (unsigned long) task0;
161 //HW_ADDR(PSP_array[0] + 0x1C) = 0x01000000;
162 //PSP_array[1] = ((unsigned int) task1_stack) + sizeof(task1_stack) - 32*4;
163 //HW_ADDR(PSP_array[1] + 0x18) = (unsigned long) task1;
164 //HW_ADDR(PSP_array[1] + 0x1C) = 0x01000000;
165 //PSP_array[2] = ((unsigned int) task2_stack) + sizeof(task2_stack) - 32*4;
166 //HW_ADDR(PSP_array[2] + 0x18) = (unsigned long) task2;
167 //HW_ADDR(PSP_array[2] + 0x1C) = 0x01000000;
169 //extern void pendsv_handler;
171 ivt_set_gate(14, pendsv_handler_c, 0);
173 //set_psp((PSP_array[curr_task] + 32*4 ));
175 //int startpsp = PSP_array[curr_task] + 16*4;
177 //asm volatile ("msr psp, %0" : : "r" (startpsp));
180 //asm volatile ("mov r0, 0x3" "\n\t"
181 //"msr control, r0" "\n\t"
187 //printf("0: %x\n", PSP_array[0]);
188 //printf("1: %x", PSP_array[0]);