GadgetSeed  0.9.6
cpu.c
[詳解]
1 /** @file
2  @brief Cortex-M3 CPU制御
3 
4  @date 2018.08.11
5  @author Takashi SHUDO
6 */
7 
8 #include "asm-Cortex-M3.h"
9 #include "task/task.h"
10 #include "tkprintf.h"
11 
12 void setup_task(void *sp, int stack_size, void (* process)(void),
13  struct st_tcb *tcb)
14 {
15  union st_regs *regs;
16 
17  // 割り込み処理時のレジスタをスタックに待避した状態
18  tcb->sp = (void *)((unsigned int)sp + stack_size - sizeof(union st_regs));
19  regs = (union st_regs *)tcb->sp;
20 
21  regs->name.r0 = (unsigned int)tcb; /* task() 第1引数 */
22  regs->name.r1 = 1;
23  regs->name.r2 = 2;
24  regs->name.r3 = 3;
25  regs->name.r4 = 4;
26  regs->name.r5 = 5;
27  regs->name.r6 = 6;
28  regs->name.r7 = 7;
29  regs->name.r8 = 8;
30  regs->name.r9 = 9;
31  regs->name.r10 = 10;
32  regs->name.r11 = 11;
33  regs->name.r12 = 12;
34  regs->name.sp = (unsigned int)tcb->sp;
35  regs->name.lr = (unsigned int)process;
36  regs->name.ilr = 0xFFFFFFF9;
37  regs->name.pc = (unsigned int)process;
38  regs->name.xpsr = 0x01000000; // Thumb状態
39 }
40 
41 void disp_regs(void *sp)
42 {
43  union st_regs *regs = (union st_regs *)sp;
44 
45  tkprintf("xPSR= %08lX\n", regs->name.xpsr);
46  tkprintf("R0 = %08lX ", regs->name.r0);
47  tkprintf("R1 = %08lX ", regs->name.r1);
48  tkprintf("R2 = %08lX ", regs->name.r2);
49  tkprintf("R3 = %08lX ", regs->name.r3);
50  tkprintf("\n");
51  tkprintf("R4 = %08lX ", regs->name.r4);
52  tkprintf("R5 = %08lX ", regs->name.r5);
53  tkprintf("R6 = %08lX ", regs->name.r6);
54  tkprintf("R7 = %08lX ", regs->name.r7);
55  tkprintf("\n");
56  tkprintf("R8 = %08lX ", regs->name.r8);
57  tkprintf("R9 = %08lX ", regs->name.r9);
58  tkprintf("R10 = %08lX ", regs->name.r10);
59  tkprintf("R11 = %08lX ", regs->name.r11);
60  tkprintf("\n");
61  tkprintf("R12 = %08lX ", regs->name.r12);
62  tkprintf("SP = %08lX ", regs->name.sp);
63  tkprintf("LR = %08lX ", regs->name.lr);
64  tkprintf("PC = %08lX ", regs->name.pc);
65  tkprintf("\n");
66 }
67 
68 void dispatch(struct st_tcb *otcb, struct st_tcb *tcb)
69 {
70  extern void _dispatch(void *sp);
71 
72  if(((union st_regs *)(tcb->sp))->name.pc >= 0x20000000) {
73  SYSERR_PRINT("Stack Error ?\n");
74  disp_task_info();
75  disp_regs(tcb->sp);
76  disp_debug_info();
77  print_queues();
78  }
79 
80  _dispatch(tcb->sp);
81 }
Cortex-M3 MCU レジスタ定義
Definition: asm-Cortex-M3.h:22
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
Definition: tkprintf.c:100
カーネル用機能限定printf
void * sp
スタックポインタ
Definition: tcb.h:40
タスク制御
Cortex-M3
タスクコンテキスト
Definition: tcb.h:32