cortex-m4.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "libs/os.h"
  2. #include "bsp/bsp.h"
  3. u32 arch_stack_init(u32 *stack_base, u16 stack_size, void *fptr, void *p_arg) {
  4. u32 *p_stk = &stack_base[stack_size];
  5. u32 u_stk = (u32) p_stk;
  6. u_stk = u_stk & 0xFFFFFFFF8;
  7. p_stk = (u32 *)u_stk;
  8. *(--p_stk) = (u32)fptr; //r14
  9. //r12 - r1
  10. p_stk -= 12;
  11. *(--p_stk) = (u32)p_arg; //r0
  12. return (u32)p_stk;
  13. }
  14. __asm void arch_start_first_task(void) {
  15. extern current_tcb;
  16. PRESERVE8
  17. ldr r0, =current_tcb
  18. ldr r0, [r0]
  19. ldr r0, [r0] //load tcb->sp to psp
  20. msr psp, r0
  21. mrs r0, CONTROL //thread mode use psp stack pointer
  22. orr r0, r0, #2
  23. msr CONTROL, r0
  24. isb
  25. pop {r0-r12, pc}
  26. nop
  27. }
  28. __asm int arch_save_context(void){
  29. PRESERVE8
  30. STMFD sp!, {r0-r12,r14}
  31. ldr r0, =current_tcb
  32. ldr r0, [r0]
  33. str sp, [r0] //save sp to tcb->sp
  34. bx lr
  35. nop
  36. }
  37. __asm void arch_restore_context(void){
  38. PRESERVE8
  39. ldr r0, =current_tcb
  40. ldr r0, [r0]
  41. ldr sp, [r0] //load tcb->sp to r0
  42. LDMFD sp!, {r0-r12, pc}
  43. }