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

📄 os_core.src

📁 本RTOS参考 usOS-II, ARM-RTX
💻 SRC
📖 第 1 页 / 共 3 页
字号:
;     
; }
			; 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 + -