📄 os_core.src
字号:
;
; }
; SOURCE LINE # 85
?C0004:
RET
; END OF OSInit
;
; /*
; 该函数将创建一个系统任务
;
; */
; //#pragma disable //禁止所有中断
; void os_sys_init(pFUN task)//( void (*task)(void) )
RSEG ?PR?_os_sys_init?OS_CORE
_os_sys_init:
USING 0
; SOURCE LINE # 92
MOV task?141,R3
MOV task?141+01H,R2
MOV task?141+02H,R1
; {char xdata *pstack;
; SOURCE LINE # 93
; //char idata *stack_bottom;
; //uint8 IEtemp;
; uint16 addr;
; //( ( (void (*)(void ) ) rst )
; //pFUN pfun;
; //void ( *pfun)(void);
;
; OS_AllIRQ_Unable(); //总中断禁止
; SOURCE LINE # 101
CLR EA
; //IEtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable //禁止所有中断
;
; OSInit();
; SOURCE LINE # 104
LCALL OSInit
;
;
; //系统任务地址
; addr=Read_data(SP--); //读出刚才压入堆栈的函数地址.高地址
; SOURCE LINE # 108
MOV R7,SP
DEC SP
MOV R0,AR7
MOV A,@R0
;---- Variable 'addr?143' assigned to Register 'R6/R7' ----
; addr <<= 8;
; SOURCE LINE # 109
MOV R7,#00H
MOV R6,A
; addr += Read_data(SP) ;//Read_data(SP-1); //读出刚才压入堆栈的函数地址.低地址.有错
; SOURCE LINE # 110
MOV R5,SP
MOV R0,AR5
MOV A,@R0
ADD A,R7
MOV R7,A
CLR A
ADDC A,R6
; SP++;
; SOURCE LINE # 111
INC SP
;
;
; //保存系统任务
; Tasks_TCB[OS_MAX_TASKS-1].pTask = (void code *)addr; // Load Stack pointer in TCB
; SOURCE LINE # 115
MOV R1,AR7
MOV Tasks_TCB+034H,#0FFH
MOV Tasks_TCB+035H,A
MOV Tasks_TCB+036H,R1
; //Tasks_TCB[OS_MAX_TASKS-1].OSTCBPrio = (INT8U)priority; // Load task priority into TCB
; Tasks_TCB[OS_MAX_TASKS-1].OSTCBStat = OS_STAT_RDY; // Task is ready to run
; SOURCE LINE # 117
CLR A
MOV Tasks_TCB+039H,A
; Tasks_TCB[OS_MAX_TASKS-1].OSTCBDly = 0; //Task is not delayed
; SOURCE LINE # 118
MOV Tasks_TCB+037H,A
MOV Tasks_TCB+038H,A
; Tasks_TCB[OS_MAX_TASKS-1].stk = taskMAX_stack;
; SOURCE LINE # 119
MOV Tasks_TCB+03AH,#01H
MOV Tasks_TCB+03BH,#HIGH (taskMAX_stack)
MOV Tasks_TCB+03CH,#LOW (taskMAX_stack)
; Tasks_TCB[OS_MAX_TASKS-1].size = sizeof(taskMAX_stack);
; SOURCE LINE # 120
MOV Tasks_TCB+03DH,A
MOV Tasks_TCB+03EH,#018H
; Tasks_TCB[OS_MAX_TASKS-1].stk_used = (2+13);
; SOURCE LINE # 121
MOV Tasks_TCB+03FH,A
MOV Tasks_TCB+040H,#0FH
;
; pstack=Tasks_TCB[OS_MAX_TASKS-1].stk;
; SOURCE LINE # 123
MOV pstack?142,Tasks_TCB+03BH
MOV pstack?142+01H,Tasks_TCB+03CH
;
; //系统任务就绪
; //OSTaskResume(OS_MAX_TASKS-1);
; OSRdyGrp |= OSMapTbl[(OS_MAX_TASKS-1)>>3]; //prio>>3-->prio/8
; SOURCE LINE # 127
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSRdyGrp,A
; OSRdyTbl[(OS_MAX_TASKS-1)>>3] |= OSMapTbl[(OS_MAX_TASKS-1)&0x07]; //prio&0x07-->prio%8
; SOURCE LINE # 128
MOV DPTR,#OSMapTbl+04H
CLR A
MOVC A,@A+DPTR
ORL OSRdyTbl,A
;
;
; //将task函数地址替换为进入该函数后地址,该函数退出后将执行task函数
; task();//该函数里面会打开中断
; SOURCE LINE # 132
MOV R2,task?141+01H
MOV R1,task?141+02H
LJMP ?C?ICALL
; END OF _os_sys_init
; //addr = (uint16)task;
; //Write_data( ++SP, addr );
; //Write_data( ++SP, addr>>8 );
; //Write_data( ++SP, IEtemp );
;
; }
;
; /*------------------------------------------------------------------*-
; 创建任务
;
; * pFunction--任务地址
; * prio--优先级
;
; task, Task to create
; prio, Task priority (1-254)
; stk, Pointer to the task's stack
; size, Number of bytes in the stack
;
; 任务创建后进入就绪状态
; -*------------------------------------------------------------------*/
; #pragma disable //禁止所有中断
;
; OS_TID os_tsk_create_user( pFUN task, U8 prio, void* stk, U16 size ) SMALL
RSEG ?PR?_os_tsk_create_user?OS_CORE
_os_tsk_create_user:
SETB C
JBC EA,?C0029
CLR C
?C0029:
PUSH PSW
USING 0
; SOURCE LINE # 155
MOV task?244,R3
MOV task?244+01H,R2
MOV task?244+02H,R1
MOV prio?245,R5
; {//OS_TCB *ptcb;
; char xdata *pstack;
; uint16 i;
;
; //OS_ENTER_CRITICAL();
; // IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
;
; //ptcb=&Tasks_TCB[prio];
; if (Tasks_TCB[prio].pTask == NULL)
; SOURCE LINE # 164
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB)
MOV R0,A
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
ORL A,R2
ORL A,R3
JZ $ + 5H
LJMP ?C0006
; {
; SOURCE LINE # 165
; Tasks_TCB[prio].pTask = task; // Load Stack pointer in TCB
; SOURCE LINE # 166
MOV R2,task?244+01H
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB)
MOV R0,A
MOV @R0,task?244
INC R0
MOV @R0,AR2
INC R0
MOV @R0,AR1
; //Tasks_TCB[prio].OSTCBPrio = (INT8U)priority; // Load task priority into TCB
; Tasks_TCB[prio].OSTCBStat = OS_STAT_RDY; // Task is ready to run
; SOURCE LINE # 168
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+05H)
MOV R0,A
CLR A
MOV @R0,A
; Tasks_TCB[prio].OSTCBDly = 0; //Task is not delayed
; SOURCE LINE # 169
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+03H)
MOV R0,A
CLR A
MOV @R0,A
INC R0
MOV @R0,A
; Tasks_TCB[prio].stk = stk;
; SOURCE LINE # 170
MOV R2,stk?246+01H
MOV R1,stk?246+02H
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+06H)
MOV R0,A
MOV @R0,stk?246
INC R0
MOV @R0,AR2
INC R0
MOV @R0,AR1
; Tasks_TCB[prio].size = size;//size必须比2+13大
; SOURCE LINE # 171
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+09H)
MOV R0,A
MOV @R0,size?247
INC R0
MOV @R0,size?247+01H
; Tasks_TCB[prio].stk_used = 2+13;//2个任务地址+13个特殊功能寄存器
; SOURCE LINE # 172
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+0BH)
MOV R0,A
MOV @R0,#00H
INC R0
MOV @R0,#0FH
;
; //设置任务就绪表,让任务就绪
; OSRdyGrp |= OSMapTbl[prio>>3]; //prio>>3-->prio/8
; SOURCE LINE # 175
MOV A,prio?245
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R7,A
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSRdyGrp,A
; OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
; SOURCE LINE # 176
MOV A,#LOW (OSRdyTbl)
ADD A,R7
MOV R0,A
MOV A,@R0
MOV R7,A
MOV A,prio?245
ANL A,#07H
MOVC A,@A+DPTR
ORL A,R7
MOV @R0,A
;
; //堆栈初始化
; //OSTaskStkInit(task, prio);
; pstack=Tasks_TCB[prio].stk;
; SOURCE LINE # 180
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+06H)
MOV R0,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R6,AR2
MOV pstack?248,R6
MOV pstack?248+01H,A
;
; *pstack++ = (uint8)task; //任务低地址进栈
; SOURCE LINE # 182
MOV R1,task?244+02H
MOV R7,AR1
INC pstack?248+01H
MOV A,pstack?248+01H
MOV R4,pstack?248
JNZ ?C0031
INC pstack?248
?C0031:
DEC A
MOV DPL,A
MOV DPH,R4
MOV A,R7
MOVX @DPTR,A
; *pstack++ = (uint16)task>>8; //任务高地址进栈
; SOURCE LINE # 183
MOV A,task?244+01H
MOV R7,A
INC pstack?248+01H
MOV A,pstack?248+01H
MOV R4,pstack?248
JNZ ?C0032
INC pstack?248
?C0032:
DEC A
MOV DPL,A
MOV DPH,R4
MOV A,R7
MOVX @DPTR,A
; for(i=0; i<Tasks_TCB[prio].size; i++)//初始化清空堆栈
; SOURCE LINE # 184
;---- Variable 'i?249' assigned to Register 'R6/R7' ----
CLR A
MOV R7,A
MOV R6,A
?C0007:
MOV A,prio?245
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+09H)
MOV R0,A
MOV A,@R0
MOV R4,A
INC R0
MOV A,@R0
MOV R5,A
CLR C
MOV A,R7
SUBB A,R5
MOV A,R6
SUBB A,R4
JNC ?C0008
; {
; SOURCE LINE # 185
; *pstack++ = 0;
; SOURCE LINE # 186
INC pstack?248+01H
MOV A,pstack?248+01H
MOV R4,pstack?248
JNZ ?C0033
INC pstack?248
?C0033:
DEC A
MOV DPL,A
MOV DPH,R4
CLR A
MOVX @DPTR,A
; }
; SOURCE LINE # 187
INC R7
CJNE R7,#00H,?C0034
INC R6
?C0034:
SJMP ?C0007
?C0008:
; return (prio);
; SOURCE LINE # 188
MOV R7,prio?245
SJMP ?C0010
; }
; SOURCE LINE # 189
?C0006:
; //OS_EXIT_CRITICAL();
; // IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
; return (0);
; SOURCE LINE # 192
MOV R7,#00H
; }
; SOURCE LINE # 193
?C0010:
POP PSW
MOV EA,C
RET
; END OF _os_tsk_create_user
;
; #ifndef OS_TASK_SWITCH
; //功能描述: 系统时钟中断服务函数
; //#pragma disable //禁止所有中断
; void OSTickISR(void) interrupt 1 //OS_TIME_ISR
; {uint8 data IEtemp;
;
; //TH0=T0H_COUNTER;
; //TL0=T0L_COUNTER;
;
; IEtemp=IE;//保存中断
; OS_AllIRQ_Unable(); //总中断禁止
;
; //IE &= B0000_0000; //IE &= B0000_0001; //保留外部中断原来状态,屏蔽掉其他中断
;
;
; //#if EN_TIMER_SHARING > 0
; if(TH0==0)//==0说明是定时器溢出中断,!=0表示是软件设置的定时器中断
; {
; TH0=T0H_COUNTER;
; TL0=T0L_COUNTER;
; OSTimeTick(); //调用系统时钟处理函数
; }//
;
; //#else
; // OSIntSendSignal(TIME_ISR_TASK_ID); // 唤醒ID为TIME_ISR_TASK_ID的任务
; //#endif
;
;
; OSIntExit(); //在完全退出中断时,才进行任务切换
;
; //OS_AllIRQ_Enable(); //总中断允许
; IE=IEtemp; //恢复所有中断状态
; }
; #else
;
; #endif
;
; /*
; 堆栈保存内容:
; 数据堆栈+函数地址+特殊功能积存器
;
; //功能描述: 中断退出处理函数,在此进行中断后的任务切换
; //IRQ_Stack_Bottom任务中断后的堆栈栈顶
; //在退出中断时,不让进栈的数据出栈。在完全退出中断时,才进行任务切换,
; 1.1 保存当前任务堆栈
; 1.2 保存任务特殊功能寄存器
; 1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
; 1.4 切换任务
; 2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
; 2.2 恢复任务特殊功能寄存器
; 2.3 将新任务原来断点地址压入堆栈
; */
; void OSIntExit(void) SMALL
RSEG ?PR?OSIntExit?OS_CORE
OSIntExit:
USING 0
; SOURCE LINE # 247
; {char idata * stack_bottom;
; char xdata * stack_bottom_bak;
; //uint16 addr;
; uint16 old_addr;
; uint8 old_taskid;//
;
; old_taskid=OSCurrentTaskID;
; SOURCE LINE # 254
MOV old_taskid?353,OSCurrentTaskID
; OSFindNextRunningTask(); //查找下一个就绪的任务
; SOURCE LINE # 255
LCALL OSFindNextRunningTask
; if(old_taskid==OSCurrentTaskID) //任务不切换
; SOURCE LINE # 256
MOV A,old_taskid?353
XRL A,OSCurrentTaskID
JNZ $ + 5H
LJMP ?C0012
?C0011:
; return;
;
; //系统不备份调用本函数压入的堆栈
; old_addr=Read_data(SP--); //读出刚才压入堆栈的函数地址.高地址
; SOURCE LINE # 260
MOV R7,SP
DEC SP
MOV R0,AR7
MOV A,@R0
MOV old_addr?352,#00H
MOV old_addr?352+01H,A
; old_addr <<= 8;
; SOURCE LINE # 261
MOV old_addr?352+01H,#00H
MOV old_addr?352,A
; old_addr += Read_data(SP--); //读出刚才压入堆栈的函数地址.低地址
; SOURCE LINE # 262
MOV R7,SP
DEC SP
MOV R0,AR7
MOV A,@R0
ADD A,old_addr?352+01H
MOV old_addr?352+01H,A
CLR A
ADDC A,old_addr?352
MOV old_addr?352,A
;
; stack_bottom=gStack+1;//当前任务堆栈底地址
; SOURCE LINE # 264
MOV A,gStack
INC A
MOV stack_bottom?350,A
; stack_bottom_bak=Tasks_TCB[old_taskid].stk;//当前任务堆栈底备份地址
; SOURCE LINE # 265
MOV A,old_taskid?353
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+06H)
MOV R0,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R6,AR2
MOV R7,A
;---- Variable 'stack_bottom_bak?351' assigned to Register 'R6/R7' ----
;
; //1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
; Tasks_TCB[old_taskid].stk_used=SP-gStack;//任务堆栈已经使用数量
; SOURCE LINE # 268
MOV R5,gStack
MOV R4,#00H
MOV R3,SP
CLR C
MOV A,R3
SUBB A,R5
MOV R3,A
CLR A
SUBB A,R4
MOV R2,A
MOV A,old_taskid?353
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+0BH)
MOV R0,A
MOV @R0,AR2
INC R0
MOV @R0,AR3
; memcpy(stack_bottom_bak, stack_bottom, SP-gStack);
; SOURCE LINE # 269
MOV R3,SP
CLR C
MOV A,R3
SUBB A,R5
MOV DPL,A
CLR A
SUBB A,R4
MOV DPH,A
MOV R1,stack_bottom?350
MOV R2,#00H
MOV R3,#00H
PUSH AR2
PUSH AR1
MOV R2,AR6
MOV R1,AR7
MOV R0,AR1
MOV R4,AR2
MOV R5,#01H
POP AR1
POP AR2
MOV R6,A
MOV R7,DPL
LCALL ?C?COPY
;
; //1.4 切换任务.前面已经执行过
; //OSFindNextRunningTask(); //查找下一个就绪的任务
;
; //2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
; stack_bottom=gStack+1;//当前任务堆栈底地址
; SOURCE LINE # 275
MOV A,gStack
INC A
MOV stack_bottom?350,A
; stack_bottom_bak=Tasks_TCB[OSCurrentTaskID].stk;//当前任务堆栈底备份地址
; SOURCE LINE # 276
MOV A,OSCurrentTaskID
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+06H)
MOV R0,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R7,A
; SP=gStack+Tasks_TCB[OSCurrentTaskID].stk_used;//新任务恢复堆栈后,堆栈指针的位置
; SOURCE LINE # 277
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -