扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
以下是引用片段: #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 ; |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者