扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
以下是引用片段: #define INT8U unsigned char #define INT16U unsigned short #define INT32U unsighed long #define OS_STK unsigned long #define BOOLEAN int #define OS_CPU_SR unsighed long #define INT8S char extern int INTS_OFF(void); extern void INTS_ON(void); #define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF() } #define OS_EXIT_CRITICAL() { if(cpu_st == 0) INTS_ON(); } #define OS_STK_GROWTH 1 #define STACKSIZE 256 INTS_OFF mrs r0, cpsr ;当前CSR mov r1, r0 ;复制屏蔽 orr r1, r1, #0xC0 ;屏蔽中断位 msr CPSR, r1 ;关中断(IRQ and FIQ) and r0, r0, #0x80 ;从初始CSR返回FIQ位 mov pc, lr ;返回 INTS_ON mrs r0, cpsr ;当前CSR bic r0, r0, #0xC0 ;屏蔽中断 msr CPSR, r0 ;开中断(IRQ and FIQ) mov pc, lr ;返回 |
以下是引用片段: OSTaskStkInit——初始化任务堆栈 OS_STK * OSTaskStkInit(void (*task) (void *pd), void *pdata, OS_STK *ptos, INT16U opt) { unsighed int *stk; stk = (unsighed int *)ptos; /*装载堆栈指针*/ opt++; /*为新任务建立堆栈*/ *--stk = (unsigned int) task; /*pc*/ *--stk = (unsigned int) task; /*lr*/ *--stk = 12; /*r12*/ *--stk = 11; /*r11*/ *--stk = 10; /*r10*/ *--stk = 9; /*r9*/ *--stk = 8; /*r8*/ *--stk = 7; /*r7*/ *--stk = 6; /*r6*/ *--stk = 5; /*r5*/ *--stk = 4; /*r4*/ *--stk = 3; /*r3*/ *--stk = 2; /*r2*/ *--stk = 1; /*r1*/ *--stk = (unsigned int) pdata; /*r0*/ *--stk = (SUPMODE) /*cpsr*/ *--stk = (SUPMODE) /*spsr*/ return ((OS_STK *) stk); } void OSTaskCreateHook(OS_TCB *ptcb) 创建任务 void OSTasdDelHook(OS_TCB *ptcb) 删除任务 void OSTaskSwHook(void) 切换任务 void OSTaskStatHook(void) 任务执行状态 void OSTimeTickHook(void) 时钟节拍 |
1.OSStartHighRdy( ); 运行优先级最高的就绪任务
以下是引用片段: OSStartHighRdy LDR r4, addr_OSTCBCur ;得到当前任务TCB地址 LDR r5, addr_OSTCBHighRdy ;得到最高优先级任务TCB地址 LDR r5, [r5] ;获得堆栈指针 LDR sp, [r5] ;转移到新的堆栈中 STR r5, [r4] ;设置新的当前任务的TCB地址 LDMFD sp!, {r4} ;从栈顶获取新的状态 MSR SPSR, r4 LDMFD sp!, {r4} ;从栈顶获取新的状态 MSR CPSR, r4 ;CPSR处于SVC32Mode模式 LDMFD sp!, {r0-r12, 1r, pc} ;运行新的任务 |
以下是引用片段: OS_TASK_SW STMFD sp!, {pc} ;保存pc STMFD sp!, {1r} ;保存1r STMFD sp!, {r0-r12} ;保存寄存器&返回地址 MRS r4, CPSR STMFD sp!, {r4} ;保存当前的的PSR MRS r4, SPSR STMFD sp!, {r4} ;保存SPSR ; OSRrioCur = OSPrioHighRdy LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, [r5] STRB r6, [r4] ;得到当前任务地址 LDR r4, addr_OSTCBCur LDR r5, [r4] STR sp, [r5] ;保存sp在被占先的任务的TCB ;得到最高优先级任务TCB地址 LDR r6, addr_OSTCBHighRdy LDR r6, [r6] LDR sp, [r6] ;得到新任务堆栈 ; OSTCBCur = OSTCBHighRdy STR r6, [r4] ;保存任务方式寄存器 LDMFD sp!, {r4} MSR SPSR, r4 LDMFD sp!, {r4} MSR CPSR, r4 ;返回到新任务的上下文 LDMFD sp!, {r0-r12, 1r, pc} |
以下是引用片段: OSIntCtxSw Add r7, sp, #16 ;保存寄存器指针 LDR sp, =IRQStack ;FIQ_STACK mrs r1, SPSR ;得到暂停的SPR orr r1, r1, #0xC0 ; |
濠碘€冲€归悘澶愬箖閵娾晜濮滈悽顖涚摃閹烩晠宕氶崶鈺傜暠闁诡垰鍘栫花锛勬喆椤ゅ弧濡澘妫楅悡娆撳嫉閳ь剟寮0渚€鐛撻柛婵呮缁楀矂骞庨埀顒勫嫉椤栨瑤绻嗛柟顓у灲缁辨繈鏌囬敐鍕杽閻犱降鍨藉Σ鍕嚊閹跺鈧﹦绱旈幋鐐参楅柡鍫灦閸嬫牗绂掔捄铏规闁哄嫷鍨遍崑宥夋儍閸曨剚浠樺ù锝嗗▕閳ь剚鏌ㄧ欢鐐寸▕鐎b晝顏遍柕鍡嫹