cortex-m4.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "os/os_type.h"
  2. #include "bsp/bsp.h"
  3. void co_task_tick_init(int ticks){
  4. /* setup systick timer for 1000Hz interrupts */
  5. SysTick_Config(SystemCoreClock / ticks);
  6. }
  7. u32 arch_stack_init(u32 *stack_base, u16 stack_size, void *fptr, void *p_arg) {
  8. u32 *p_stk = &stack_base[stack_size];
  9. u32 u_stk = (u32) p_stk;
  10. u_stk = u_stk & 0xFFFFFFFF8;
  11. p_stk = (u32 *)u_stk;
  12. *(--p_stk) = (u32)fptr; //r14
  13. //r12 - r1
  14. p_stk -= 12;
  15. *(--p_stk) = (u32)p_arg; //r0
  16. return (u32)p_stk;
  17. }
  18. __asm void arch_start_first_task(void) {
  19. extern current_tcb;
  20. PRESERVE8
  21. ldr r0, =current_tcb
  22. ldr r0, [r0]
  23. ldr r0, [r0] //load tcb->sp to psp
  24. msr psp, r0
  25. mrs r0, CONTROL //thread mode use psp stack pointer
  26. orr r0, r0, #2
  27. msr CONTROL, r0
  28. isb
  29. pop {r0-r12, pc}
  30. nop
  31. }
  32. __asm int arch_save_context(void){
  33. PRESERVE8
  34. STMFD sp!, {r0-r12,r14}
  35. ldr r0, =current_tcb
  36. ldr r0, [r0]
  37. str sp, [r0] //save sp to tcb->sp
  38. bx lr
  39. nop
  40. }
  41. __asm void arch_restore_context(void){
  42. PRESERVE8
  43. ldr r0, =current_tcb
  44. ldr r0, [r0]
  45. ldr sp, [r0] //load tcb->sp to r0
  46. LDMFD sp!, {r0-r12, pc}
  47. }
  48. extern u64 g_task_ticks64;
  49. extern u32 g_task_ticks;
  50. void SysTick_Handler(void) {
  51. g_task_ticks ++;
  52. g_task_ticks64 ++;
  53. }