⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.src

📁 本RTOS参考 usOS-II, ARM-RTX
💻 SRC
📖 第 1 页 / 共 3 页
字号:
	MOV  	A,OSCurrentTaskID
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+0BH)
	MOV  	R0,A
	INC  	R0
	MOV  	A,@R0
	ADD  	A,gStack
	MOV  	SP,A
;     
;     memcpy(stack_bottom, stack_bottom_bak, Tasks_TCB[OSCurrentTaskID].stk_used);//将保存的堆栈数据拷贝到堆栈区
			; SOURCE LINE # 279
	MOV  	A,OSCurrentTaskID
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+0BH)
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	DPH,A
	INC  	R0
	MOV  	A,@R0
	MOV  	DPL,A
	MOV  	R1,AR7
	MOV  	R3,#01H
	MOV  	R0,stack_bottom?350
	MOV  	R4,#00H
	MOV  	R5,#00H
	MOV  	R6,DPH
	MOV  	R7,A
	LCALL	?C?COPY
;     
; //    //2.2 恢复任务特殊功能寄存器
; //  #ifdef DEBUG
; //    //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
; //    Pop_Reg();
; //    SP -= 13;
; //  #else
; //    #pragma ASM
; //    #pragma ENDASM
; //  #endif
;     //2.3 将新任务原来断点地址压入堆栈
;     //addr = (uint16)Tasks_TCB[OSCurrentTaskID].pTask;//将新任务原来断点地址压入堆栈,在该函数退出后将恢复运行
;     //Write_data( ++SP, addr );
;     //Write_data( ++SP, addr>>8 );
;     //Write_data( ++SP, SPtemp );//恢复中断标志
;     
;     Write_data( ++SP, old_addr );
			; SOURCE LINE # 296
	MOV  	R7,old_addr?352+01H
	INC  	SP
	MOV  	R6,SP
	MOV  	R0,AR6
	MOV  	@R0,AR7
;     Write_data( ++SP, old_addr>>8 );
			; SOURCE LINE # 297
	MOV  	A,old_addr?352
	MOV  	R7,A
	INC  	SP
	MOV  	R6,SP
	MOV  	R0,AR6
	MOV  	@R0,AR7
; }
			; SOURCE LINE # 298
?C0012:
	RET  	
; END OF OSIntExit

; 
; //功能描述: 系统时钟处理函数,处理各个任务的延时
; //任务延时减为0,就进入就绪状态
; //中断中调用, 各任务等待时间-1
; void  OSTimeTick(void)  SMALL

	RSEG  ?PR?OSTimeTick?OS_CORE
OSTimeTick:
	USING	0
			; SOURCE LINE # 303
; {uint8 prio;
;  //OS_TCB    *ptcb;
;     
;     //ptcb=&Tasks_TCB[0];
;     for ( prio = 0; prio < OS_LOWEST_PRIO; prio++)//,ptcb++ )
			; SOURCE LINE # 308
;---- Variable 'prio?454' assigned to Register 'R7' ----
	CLR  	A
	MOV  	R7,A
?C0013:
;     {
			; SOURCE LINE # 309
;       // Check if there is a task at this location
;       //if ( Tasks_TCB[prio].pTask )
;       //{
;         if(Tasks_TCB[prio].OSTCBDly != 0 )
			; SOURCE LINE # 313
	MOV  	A,R7
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+03H)
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R4,A
	INC  	R0
	MOV  	A,@R0
	ORL  	A,R4
	JZ   	?C0015
;         {
			; SOURCE LINE # 314
;           if ( --Tasks_TCB[prio].OSTCBDly == 0 )
			; SOURCE LINE # 315
	MOV  	A,R7
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+03H)
	MOV  	R0,A
	INC  	R0
	MOV  	A,@R0
	DEC  	@R0
	DEC  	R0
	JNZ  	?C0035
	DEC  	@R0
?C0035:
	DEC  	A
	MOV  	AR4,@R0
	ORL  	A,R4
	JNZ  	?C0015
;           {
			; SOURCE LINE # 316
;             //if ((Tasks_TCB[prio].OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY)  // Is task suspended? 
;             //{
;               OSRdyGrp              |= OSMapTbl[prio>>3];   //prio>>3-->prio/8
			; SOURCE LINE # 319
	MOV  	A,R7
	RRC  	A
	RRC  	A
	RRC  	A
	ANL  	A,#01FH
	MOV  	R6,A
	MOV  	DPTR,#OSMapTbl
	MOVC 	A,@A+DPTR
	ORL  	OSRdyGrp,A
;               OSRdyTbl[prio>>3]     |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
			; SOURCE LINE # 320
	MOV  	A,#LOW (OSRdyTbl)
	ADD  	A,R6
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R6,A
	MOV  	A,R7
	ANL  	A,#07H
	MOVC 	A,@A+DPTR
	ORL  	A,R6
	MOV  	@R0,A
;             //}
;             //else 
;             //{
;               // Schedule periodic tasks to run again
;               Tasks_TCB[prio].OSTCBDly = 1;
			; SOURCE LINE # 325
	MOV  	A,R7
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+03H)
	MOV  	R0,A
	MOV  	@R0,#00H
	INC  	R0
	MOV  	@R0,#01H
;             //}
;           }
			; SOURCE LINE # 327
;         }
			; SOURCE LINE # 328
;       //}
;     }
			; SOURCE LINE # 330
?C0015:
	INC  	R7
	CJNE 	R7,#05H,?C0013
; }
			; SOURCE LINE # 331
?C0018:
	RET  	
; END OF OSTimeTick

; 
; 
; //功能描述: 查找下一个优先级最高的就绪任务
; //找到优先级最高的任务立即退出,没找到就绪的任务那么系统就将执行优先级最低
; //的系统默认的任务
; //系统将要执行的任务号:OSNextTaskID
; void OSFindNextRunningTask(void) SMALL

	RSEG  ?PR?OSFindNextRunningTask?OS_CORE
OSFindNextRunningTask:
	USING	0
			; SOURCE LINE # 338
; {//OS_TCB    *ptcb;
;  //void ( code * fun )( void );
;  void ( * fun )( void );
;  uint8 y;
;  uint8 prio; 
;   
;     
;     //while(OSRdyGrp!=0)
;     if(OSRdyGrp!=0)
			; SOURCE LINE # 347
	MOV  	A,OSRdyGrp
	JZ   	?C0021
;     {
			; SOURCE LINE # 348
;       y             = OSUnMapTbl[OSRdyGrp];            //计算优先级,先计算组号
			; SOURCE LINE # 349
	MOV  	DPTR,#OSUnMapTbl
	MOVC 	A,@A+DPTR
	MOV  	R7,A
;---- Variable 'y?556' assigned to Register 'R7' ----
;       prio=(INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
			; SOURCE LINE # 350
	ADD  	A,#LOW (OSRdyTbl)
	MOV  	R0,A
	MOV  	A,@R0
	MOVC 	A,@A+DPTR
	MOV  	R6,A
	MOV  	A,R7
	RLC  	A
	RLC  	A
	RLC  	A
	ANL  	A,#0F8H
	MOV  	R7,A
	MOV  	A,R6
	ADD  	A,R7
	MOV  	R7,A
;---- Variable 'prio?557' assigned to Register 'R7' ----
;       
;       fun=Tasks_TCB[prio].pTask;
			; SOURCE LINE # 352
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB)
	MOV  	R0,A
	INC  	R0
	MOV  	A,@R0
	MOV  	R2,A
	INC  	R0
	MOV  	A,@R0
;---- Variable 'fun?555' assigned to Register 'R1/R2/R3' ----
;       
;       //if((OSRdyTbl[y] &= ~OSMapTbl[prio&0x07])==0)  //任务从就绪表中删除
;       //  OSRdyGrp &=  ~OSMapTbl[y];
;       
;       if(fun!=0)
			; SOURCE LINE # 357
	MOV  	R4,AR2
	ORL  	A,R4
	JZ   	?C0021
;       {
			; SOURCE LINE # 358
;         //fun();
;         OSCurrentTaskID=prio;
			; SOURCE LINE # 360
	MOV  	OSCurrentTaskID,R7
;       }
			; SOURCE LINE # 361
;     }
			; SOURCE LINE # 362
;     
;   // The scheduler enters idle mode at this point 
;   //Sys_Go_To_Sleep();
; }
			; SOURCE LINE # 366
?C0021:
	RET  	
; END OF OSFindNextRunningTask

; 
; /*
; //任务延时
; 1.1 计算当前任务使用堆栈情况
; 1.2 保存任务特殊功能寄存器
; 1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
; 1.4 切换任务
; 2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
; 2.2 恢复任务特殊功能寄存器
; 2.3 将新任务原来断点地址压入堆栈
; */
; 
; //#pragma disable  //禁止所有中断
; void os_dly_wait( U16 delay_time ) SMALL

	RSEG  ?PR?_os_dly_wait?OS_CORE
_os_dly_wait:
	USING	0
			; SOURCE LINE # 380
;---- Variable 'delay_time?658' assigned to Register 'R6/R7' ----
; //void  OSTimeDly (uint16 ticks, uint8 prio) SMALL
; {//uint8 SPtemp;
;  uint8 data IEtemp;
;     
;     //SPtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable  //禁止所有中断
;     IEtemp=IE;//保存中断
			; SOURCE LINE # 386
;---- Variable 'IEtemp?659' assigned to Register 'R5' ----
	MOV  	R5,IE
;     OS_AllIRQ_Unable(); //总中断禁止
			; SOURCE LINE # 387
	CLR  	EA
;     
;     if (delay_time > 0) 
			; SOURCE LINE # 389
	SETB 	C
	MOV  	A,R7
	SUBB 	A,#00H
	MOV  	A,R6
	SUBB 	A,#00H
	JC   	?C0022
;     {                                                      /* 0 means no delay!         */
			; SOURCE LINE # 390
;         //IrqAll_Unable();    //总中断禁止  IrqT0_Unable();  //定时器0中断禁止
;         Tasks_TCB[OSCurrentTaskID].OSTCBStat  |= OS_STAT_SUSPEND;  // 任务被挂起
			; SOURCE LINE # 392
	MOV  	A,OSCurrentTaskID
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+05H)
	MOV  	R0,A
	MOV  	A,@R0
	ORL  	A,#08H
	MOV  	@R0,A
;         if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0)  //任务从就绪表中删除
			; SOURCE LINE # 393
	MOV  	A,OSCurrentTaskID
	RRC  	A
	RRC  	A
	RRC  	A
	ANL  	A,#01FH
	MOV  	R4,A
	ADD  	A,#LOW (OSRdyTbl)
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R3,A
	MOV  	A,OSCurrentTaskID
	ANL  	A,#07H
	MOV  	DPTR,#OSMapTbl
	MOVC 	A,@A+DPTR
	CPL  	A
	ANL  	A,R3
	MOV  	@R0,A
	JNZ  	?C0023
;           OSRdyGrp    &= ~OSMapTbl[OSCurrentTaskID>>3];   // prio>>3-->prio/8, //prio&0x07-->prio%8
			; SOURCE LINE # 394
	MOV  	A,R4
	MOVC 	A,@A+DPTR
	CPL  	A
	ANL  	OSRdyGrp,A
?C0023:
;         Tasks_TCB[OSCurrentTaskID].OSTCBDly = delay_time; // Load delay_time in TCB
			; SOURCE LINE # 395
	MOV  	A,OSCurrentTaskID
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+03H)
	MOV  	R0,A
	MOV  	@R0,AR6
	INC  	R0
	MOV  	@R0,AR7
;         //IrqAll_Enable();    //总中断允许  IrqT0_Enable();          //打开T0中断允许
;     }
			; SOURCE LINE # 397
?C0022:
;     
;     TF0=1;//设置T0中断,调用任务切换
			; SOURCE LINE # 399
	SETB 	TF0
;     
; /*    
;     //1.2 保存任务特殊功能寄存器
;   #ifdef DEBUG
;     SP += 13;
;     //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
;     Push_Reg();
;   #else
;     #pragma asm
;      ;//压栈和出栈按中断压栈和出栈的顺序
; 	   PUSH ACC
;      PUSH B
;      PUSH DPH
;      PUSH DPL
;      PUSH PSW
;      PUSH 0
;      PUSH 1
;      PUSH 2
;      PUSH 3
;      PUSH 4
;      PUSH 5
;      PUSH 6
;      PUSH 7
;     #pragma ENDASM
;   #endif
;     
;     //下次任务运行地址是从调用os_dly_wait()地址之后开始运行
;     OSIntExit();
;     
;     //2.2 恢复任务特殊功能寄存器
;   #ifdef DEBUG
;     //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
;     Pop_Reg();
;     SP -= 13;
;   #else
;     #pragma ASM
;     #pragma ENDASM
;   #endif
;         
; */    
;     
;     //OS_AllIRQ_Enable(); //总中断允许
;     IE=IEtemp;  //恢复所有中断状态
			; SOURCE LINE # 442
	MOV  	IE,R5
;     //DelayNop(10);
; }
			; SOURCE LINE # 444
	RET  	
; END OF _os_dly_wait

; 
; 
; /*********************************************************************************************************
; ** 函数名称: OSTaskSuspend
; ** 功能描述: 使指定任务休眠,但不进行任务切换
; ** 输 入: TaskID : 任务ID
; ** 输 出: 无
; ** 全局变量: 
; ********************************************************************************************************/
; //挂起一个任务
; //#pragma disable  //禁止所有中断
; void OSTaskSuspend (uint8 TaskID)	SMALL

	RSEG  ?PR?_OSTaskSuspend?OS_CORE
_OSTaskSuspend:
	USING	0
			; SOURCE LINE # 456
;---- Variable 'TaskID?760' assigned to Register 'R7' ----
; {uint8 data IEtemp;
; //OS_TCB    *ptcb;
;   
;     IEtemp=IE;//保存中断
			; SOURCE LINE # 460
;---- Variable 'IEtemp?761' assigned to Register 'R6' ----
	MOV  	R6,IE
;     OS_AllIRQ_Unable(); //总中断禁止
			; SOURCE LINE # 461
	CLR  	EA
; //    IrqAll_Unable();    //总中断禁止  IrqT0_Unable();   //定时器0中断禁止
;     //ptcb=&Tasks_TCB[TaskID];
;     Tasks_TCB[TaskID].OSTCBStat      |= OS_STAT_SUSPEND;  // Task is ready to run
			; SOURCE LINE # 464
	MOV  	A,R7
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+05H)
	MOV  	R0,A
	MOV  	A,@R0
	ORL  	A,#08H
	MOV  	@R0,A
;     if((OSRdyTbl[TaskID>>3] &= ~OSMapTbl[TaskID&0x07])==0)  //任务从就绪表中删除
			; SOURCE LINE # 465
	MOV  	A,R7
	RRC  	A
	RRC  	A
	RRC  	A
	ANL  	A,#01FH
	MOV  	R5,A
	ADD  	A,#LOW (OSRdyTbl)
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R4,A
	MOV  	A,R7
	ANL  	A,#07H
	MOV  	DPTR,#OSMapTbl
	MOVC 	A,@A+DPTR
	CPL  	A
	ANL  	A,R4
	MOV  	@R0,A
	JNZ  	?C0025
;       OSRdyGrp    &= ~OSMapTbl[TaskID>>3];   //TaskID>>3-->TaskID/8, //TaskID&0x07-->TaskID%8                  
			; SOURCE LINE # 466
	MOV  	A,R5
	MOVC 	A,@A+DPTR
	CPL  	A
	ANL  	OSRdyGrp,A
?C0025:
;   
; //    IrqAll_Enable();    //总中断允许 IrqT0_Enable();   //打开T0中断允许
;     TF0=1;//设置T0中断,调用任务切换
			; SOURCE LINE # 469
	SETB 	TF0
;     IE=IEtemp;  //恢复所有中断状态
			; SOURCE LINE # 470
	MOV  	IE,R6
; }
			; SOURCE LINE # 471
	RET  	
; END OF _OSTaskSuspend

; 
; //唤醒挂起的任务
; //#pragma disable  //禁止所有中断
; 
; void OSTaskResume (uint8 prio) SMALL

	RSEG  ?PR?_OSTaskResume?OS_CORE
_OSTaskResume:
	USING	0
			; SOURCE LINE # 476
;---- Variable 'prio?862' assigned to Register 'R7' ----
; {uint8 data IEtemp;
; //OS_TCB    *ptcb;
;   
;     IEtemp=IE;//保存中断
			; SOURCE LINE # 480
;---- Variable 'IEtemp?863' assigned to Register 'R6' ----
	MOV  	R6,IE
;     OS_AllIRQ_Unable(); //总中断禁止
			; SOURCE LINE # 481
	CLR  	EA
; //    IrqAll_Unable();    //总中断禁止  IrqT0_Unable();   //定时器0中断禁止
;     //ptcb=&Tasks_TCB[prio];
;     if (((Tasks_TCB[prio].OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&      // Remove suspension 
			; SOURCE LINE # 484
	MOV  	A,R7
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+05H)
	MOV  	R0,A
	MOV  	A,@R0
	ANL  	A,#0F7H
	MOV  	@R0,A
	JNZ  	?C0027
	MOV  	A,R7
	MOV  	B,#0DH
	MUL  	AB
	ADD  	A,#LOW (Tasks_TCB+03H)
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R4,A
	INC  	R0
	MOV  	A,@R0
	ORL  	A,R4
	JNZ  	?C0027
;         (Tasks_TCB[prio].OSTCBDly  == 0))
;     {
			; SOURCE LINE # 486
;       //Make task ready to run
;       OSRdyGrp               |= OSMapTbl[prio>>3];     //prio>>3-->prio/8
			; SOURCE LINE # 488
	MOV  	A,R7
	RRC  	A
	RRC  	A
	RRC  	A
	ANL  	A,#01FH
	MOV  	R5,A
	MOV  	DPTR,#OSMapTbl
	MOVC 	A,@A+DPTR
	ORL  	OSRdyGrp,A
;       OSRdyTbl[prio>>3]      |= OSMapTbl[prio&0x07];   //prio&0x07-->prio%8
			; SOURCE LINE # 489
	MOV  	A,#LOW (OSRdyTbl)
	ADD  	A,R5
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R5,A
	MOV  	A,R7
	ANL  	A,#07H
	MOVC 	A,@A+DPTR
	ORL  	A,R5
	MOV  	@R0,A
;     }
			; SOURCE LINE # 490
?C0027:
; //    IrqAll_Enable();    //总中断允许 IrqT0_Enable();   //打开T0中断允许
;     
;     TF0=1;//设置T0中断,调用任务切换
			; SOURCE LINE # 493
	SETB 	TF0
;     IE=IEtemp;  //恢复所有中断状态
			; SOURCE LINE # 494
	MOV  	IE,R6
; }
			; SOURCE LINE # 495
	RET  	
; END OF _OSTaskResume

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -