| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #include "os/os_type.h"
- #include "bsp/bsp.h"
- void co_task_tick_init(int ticks){
- /* setup systick timer for 1000Hz interrupts */
- SysTick_Config(SystemCoreClock / ticks);
- }
- u32 arch_stack_init(u32 *stack_base, u16 stack_size, void *fptr, void *p_arg) {
- u32 *p_stk = &stack_base[stack_size];
- u32 u_stk = (u32) p_stk;
- u_stk = u_stk & 0xFFFFFFFF8;
- p_stk = (u32 *)u_stk;
- *(--p_stk) = (u32)fptr; //r14
- //r12 - r1
- p_stk -= 12;
- *(--p_stk) = (u32)p_arg; //r0
-
- return (u32)p_stk;
- }
- __asm void arch_start_first_task(void) {
- extern current_tcb;
- PRESERVE8
- ldr r0, =current_tcb
- ldr r0, [r0]
- ldr r0, [r0] //load tcb->sp to psp
- msr psp, r0
-
- mrs r0, CONTROL //thread mode use psp stack pointer
- orr r0, r0, #2
- msr CONTROL, r0
- isb
- pop {r0-r12, pc}
- nop
- }
- __asm int arch_save_context(void){
- PRESERVE8
- STMFD sp!, {r0-r12,r14}
- ldr r0, =current_tcb
- ldr r0, [r0]
- str sp, [r0] //save sp to tcb->sp
- bx lr
- nop
- }
- __asm void arch_restore_context(void){
- PRESERVE8
- ldr r0, =current_tcb
- ldr r0, [r0]
- ldr sp, [r0] //load tcb->sp to r0
- LDMFD sp!, {r0-r12, pc}
- }
- extern u64 g_task_ticks64;
- extern u32 g_task_ticks;
- void SysTick_Handler(void) {
- g_task_ticks ++;
- g_task_ticks64 ++;
- }
|