📄 os_sched.h
字号:
//进行任务调度 这只是个轮询的调度方法,不是很好,但是也不算太糟。
void OSSched(void)
{
// 根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况
// __asm__ __volatile__("fisrt_last_OSSched: \n\t");
__asm__ __volatile__("PUSH __zero_reg__ \n\t"); //R1
__asm__ __volatile__("PUSH __tmp_reg__ \n\t"); //R0
__asm__ __volatile__("IN __tmp_reg__,__SREG__ \n\t"); //保存状态寄存器SREG
__asm__ __volatile__("PUSH __tmp_reg__ \n\t"); //保存状态寄存器SREG
__asm__ __volatile__("CLR __zero_reg__ \n\t"); //R1重新清零
__asm__ __volatile__("PUSH R2 \n\t");
__asm__ __volatile__("PUSH R3 \n\t");
__asm__ __volatile__("PUSH R4 \n\t");
__asm__ __volatile__("PUSH R5 \n\t");
__asm__ __volatile__("PUSH R6 \n\t");
__asm__ __volatile__("PUSH R7 \n\t");
__asm__ __volatile__("PUSH R8 \n\t");
__asm__ __volatile__("PUSH R9 \n\t");
__asm__ __volatile__("PUSH R10 \n\t");
__asm__ __volatile__("PUSH R11 \n\t");
__asm__ __volatile__("PUSH R12 \n\t");
__asm__ __volatile__("PUSH R13 \n\t");
__asm__ __volatile__("PUSH R14 \n\t");
__asm__ __volatile__("PUSH R15 \n\t");
__asm__ __volatile__("PUSH R16 \n\t");
__asm__ __volatile__("PUSH R17 \n\t");
__asm__ __volatile__("PUSH R18 \n\t");
__asm__ __volatile__("PUSH R19 \n\t");
__asm__ __volatile__("PUSH R20 \n\t");
__asm__ __volatile__("PUSH R21 \n\t");
__asm__ __volatile__("PUSH R22 \n\t");
__asm__ __volatile__("PUSH R23 \n\t");
__asm__ __volatile__("PUSH R24 \n\t");
__asm__ __volatile__("PUSH R25 \n\t");
__asm__ __volatile__("PUSH R26 \n\t");
__asm__ __volatile__("PUSH R27 \n\t");
//__asm__ __volatile__("PUSH R28 \n\t");
//__asm__ __volatile__("PUSH R29 \n\t");
__asm__ __volatile__("PUSH R30 \n\t");
__asm__ __volatile__("PUSH R31 \n\t");
__asm__ __volatile__("PUSH R28 \n\t"); //R28与R29用于建立在堆栈上的指针
__asm__ __volatile__("PUSH R29 \n\t"); //入栈完成
//===========================================
__asm__ __volatile__("Interrupt_OSSched: \n\t");
TCB[OSTaskRunningPrio].OSTaskStackTop=SP; //将正在运行的任务的堆栈底保存
//=============================================
unsigned char OSNextTaskPrio,j=0;
OSNextTaskPrio=OSTaskRunningPrio;
OSRdyTbl &= ~(0x01<<idle_id);//挂起os_idle task
//******
next_task_id: if(++OSNextTaskPrio>=OS_TASKS) //轮流运行各个任务,没有优先级
OSNextTaskPrio=0;
if(++j>OS_TASKS) OSRdyTbl |= (0x01<<idle_id); //如果所有的任务都是挂起的,那么就进入idle
if(! (OSRdyTbl & (0x01<<OSNextTaskPrio))) goto next_task_id;
//*****
OSTaskRunningPrio=OSNextTaskPrio;
//***********************
cli(); //保护堆栈转换
SP=TCB[OSTaskRunningPrio].OSTaskStackTop;
sei();
//===========================================
//根据中断时的出栈次序
__asm__ __volatile__("POP R29 \n\t");
__asm__ __volatile__("POP R28 \n\t");
//===============================
__asm__ __volatile__("POP R31 \n\t");
__asm__ __volatile__("POP R30 \n\t");
__asm__ __volatile__("POP R27 \n\t");
__asm__ __volatile__("POP R26 \n\t");
__asm__ __volatile__("POP R25 \n\t");
__asm__ __volatile__("POP R24 \n\t");
__asm__ __volatile__("POP R23 \n\t");
__asm__ __volatile__("POP R22 \n\t");
__asm__ __volatile__("POP R21 \n\t");
__asm__ __volatile__("POP R20 \n\t");
__asm__ __volatile__("POP R19 \n\t");
__asm__ __volatile__("POP R18 \n\t");
__asm__ __volatile__("POP R17 \n\t");
__asm__ __volatile__("POP R16 \n\t");
__asm__ __volatile__("POP R15 \n\t");
__asm__ __volatile__("POP R14 \n\t");
__asm__ __volatile__("POP R13 \n\t");
__asm__ __volatile__("POP R12 \n\t");
__asm__ __volatile__("POP R11 \n\t");
__asm__ __volatile__("POP R10 \n\t");
__asm__ __volatile__("POP R9 \n\t");
__asm__ __volatile__("POP R8 \n\t");
__asm__ __volatile__("POP R7 \n\t");
__asm__ __volatile__("POP R6 \n\t");
__asm__ __volatile__("POP R5 \n\t");
__asm__ __volatile__("POP R4 \n\t");
__asm__ __volatile__("POP R3 \n\t");
__asm__ __volatile__("POP R2 \n\t");
__asm__ __volatile__("POP __tmp_reg__ \n\t"); //SERG 出栈并恢复
__asm__ __volatile__("OUT __SREG__,__tmp_reg__ \n\t"); //
__asm__ __volatile__("POP __tmp_reg__ \n\t"); //R0 出栈
__asm__ __volatile__("POP __zero_reg__ \n\t"); //R1 出栈
__asm__ __volatile__("RETI \n\t"); //返回并开中断
//中断时出栈完成
}
//开始任务调度
void OSStartTask(uint8 id)
{
OSTaskRunningPrio=id;
SP=TCB[id].OSTaskStackTop;
__asm__ __volatile__("RJMP Interrupt_OSSched \n\t"); //重新调度
//调用子函数时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -