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

📄 os_cpu_c.src

📁 ucOS移植到STC89C58RD上面的源代码
💻 SRC
📖 第 1 页 / 共 2 页
字号:
; *                                            (BEGINNING)
; *
; * Description: This function is called by OSInit() at the beginning of OSInit().
; *
; * Arguments  : none
; *
; * Note(s)    : 1) Interrupts should be disabled during this call.
; *********************************************************************************************************
; */
; #if OS_VERSION > 203
; void OSInitHookBegin (void) reentrant

	RSEG  ?PR?_?OSInitHookBegin?OS_CPU_C
_?OSInitHookBegin:
			; SOURCE LINE # 120
; {
; 
; }
			; SOURCE LINE # 123
	RET  	
; END OF _?OSInitHookBegin

; #endif
; 
; /*
; *********************************************************************************************************
; *                                       OS INITIALIZATION HOOK
; *                                               (END)
; *
; * Description: This function is called by OSInit() at the end of OSInit().
; *
; * Arguments  : none
; *
; * Note(s)    : 1) Interrupts should be disabled during this call.
; *********************************************************************************************************
; */
; #if OS_VERSION > 203
; void OSInitHookEnd (void) reentrant

	RSEG  ?PR?_?OSInitHookEnd?OS_CPU_C
_?OSInitHookEnd:
			; SOURCE LINE # 139
; {
; }
			; SOURCE LINE # 141
	RET  	
; END OF _?OSInitHookEnd

; #endif
; 
; /*
; *********************************************************************************************************
; *                                          任务创建钩挂函数
; *
; * 描述       : 任务创建时调用
; *
; * 参数       : ptcb是指向将被创建任务的任务控制块的指针。
; *
; * 注意       : 1) 调用期间中断被禁止
; *********************************************************************************************************
; */
; void OSTaskCreateHook (OS_TCB *ptcb) reentrant

	RSEG  ?PR?_?OSTaskCreateHook?OS_CPU_C
_?OSTaskCreateHook:
	USING	0
			; SOURCE LINE # 155
	MOV  	DPTR,#0FFFDH
	LCALL	?C?ADDXBP
	LCALL	?C?PSTXDATA
; {
;     ptcb = ptcb;                       /* Prevent compiler warning                                     */
			; SOURCE LINE # 157
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	LCALL	?C?PLDXDATA
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	LCALL	?C?PSTXDATA
; }
			; SOURCE LINE # 158
	MOV  	DPTR,#03H
	LJMP 	?C?ADDXBP
; END OF _?OSTaskCreateHook

; 
; 
; /*
; *********************************************************************************************************
; *                                          任务删除钩挂函数
; *
; * 描述       : 任务删除时调用
; *
; * 参数       : ptcb是指向将被删除任务的任务控制块的指针。
; *
; * 注意       : 1) 调用期间中断被禁止
; *********************************************************************************************************
; */
; #if OS_TASK_DEL_EN > 0
; void OSTaskDelHook (OS_TCB *ptcb) reentrant
; {
;     ptcb = ptcb;                       /* Prevent compiler warning                                     */
; }
; #endif
; 
; /*
; *********************************************************************************************************
; *                                          任务切换钩挂函数
; *
; * 描述       : 执行任务切换时调用。这允许你在上下文切换期间执行其它操作。
; *
; * 参数       : 无
; *
; * 注意       : 1) 调用期间中断被禁止
; *              2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
; *                 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
; *********************************************************************************************************
; */
; void OSTaskSwHook (void) reentrant

	RSEG  ?PR?_?OSTaskSwHook?OS_CPU_C
_?OSTaskSwHook:
			; SOURCE LINE # 192
; {
; }
			; SOURCE LINE # 194
	RET  	
; END OF _?OSTaskSwHook

; 
; /*
; *********************************************************************************************************
; *                                          统计任务钩挂函数
; *
; * 描述       : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
; *
; * 注意       : 无
; *********************************************************************************************************
; */
; #if OS_TASK_STAT_EN > 0
; void OSTaskStatHook (void) reentrant
; {
; }
; #endif
; 
; /*
; *********************************************************************************************************
; *                                           OSTCBInit() HOOK
; *
; * Description: This function is called by OSTCBInit() after setting up most of the TCB.
; *
; * Arguments  : ptcb    is a pointer to the TCB of the task being created.
; *
; * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
; *********************************************************************************************************
; */
; #if OS_VERSION > 203
; void OSTCBInitHook (OS_TCB *ptcb) reentrant

	RSEG  ?PR?_?OSTCBInitHook?OS_CPU_C
_?OSTCBInitHook:
	USING	0
			; SOURCE LINE # 223
	MOV  	DPTR,#0FFFDH
	LCALL	?C?ADDXBP
	LCALL	?C?PSTXDATA
; {
;     ptcb = ptcb;                                           /* Prevent Compiler warning                 */
			; SOURCE LINE # 225
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	LCALL	?C?PLDXDATA
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	LCALL	?C?PSTXDATA
; }
			; SOURCE LINE # 226
	MOV  	DPTR,#03H
	LJMP 	?C?ADDXBP
; END OF _?OSTCBInitHook

; #endif
; 
; /*
; *********************************************************************************************************
; *                                          定时钩挂函数
; *
; * 描述       : 本函数每一滴答被调用一次。
; *
; * 参数       : 无
; *
; * 注意       : 1) 在本调用期间中断可以或不可以使能。
; *********************************************************************************************************
; */
; void OSTimeTickHook (void) reentrant

	RSEG  ?PR?_?OSTimeTickHook?OS_CPU_C
_?OSTimeTickHook:
			; SOURCE LINE # 240
; {
; }
			; SOURCE LINE # 242
	RET  	
; END OF _?OSTimeTickHook

; 
; /*
; *********************************************************************************************************
; *                                             IDLE TASK HOOK
; *
; * Description: This function is called by the idle task.  This hook has been added to allow you to do  
; *              such things as STOP the CPU to conserve power.
; *
; * Arguments  : none
; *
; * Note(s)    : 1) Interrupts are enabled during this call.
; *********************************************************************************************************
; */
; #if OS_VERSION >= 251
; void OSTaskIdleHook (void) reentrant

	RSEG  ?PR?_?OSTaskIdleHook?OS_CPU_C
_?OSTaskIdleHook:
			; SOURCE LINE # 257
; {
; }
			; SOURCE LINE # 259
	RET  	
; END OF _?OSTaskIdleHook

; #endif
; 
; #endif
; 
; /*
;    使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
;    在外部任务中实现大量的处理。
;    中断处理例程都放在下面。
; */
; 
; void UserTickTimer(void)

	RSEG  ?PR?UserTickTimer?OS_CPU_C
UserTickTimer:
			; SOURCE LINE # 270
; {
			; SOURCE LINE # 271
;     TH0  = 0xDB;   //定义Tick=100次/秒(即0.01秒/次),TH,TL值与CPU的频率有关(11.0592M)
			; SOURCE LINE # 272
	MOV  	TH0,#0DBH
;     TL0  = 0xFF;  
			; SOURCE LINE # 273
	MOV  	TL0,#0FFH
;     TR0=1;
			; SOURCE LINE # 274
	SETB 	TR0
; }
			; SOURCE LINE # 275
	RET  	
; END OF UserTickTimer

CSEG	AT	0000BH
	LJMP	OSTickISR

; 
; /* 
;   ucOS-II系统时钟中断处理程序
; */
; void OSTickISR(void) interrupt 1

	RSEG  ?PR?OSTickISR?OS_CPU_C
	USING	0
OSTickISR:
	PUSH 	ACC
	PUSH 	B
	PUSH 	DPH
	PUSH 	DPL
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR1
	PUSH 	AR2
	PUSH 	AR3
	PUSH 	AR4
	PUSH 	AR5
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 280
; {
;     OSIntEnter();					// Must be called first at every hardware interrupt entry point 
			; SOURCE LINE # 282
	LCALL	_?OSIntEnter
;     UserTickTimer();				// User functions can be called here.
			; SOURCE LINE # 283
	LCALL	UserTickTimer
;    	OSTimeTick();					// Must be called during tick isr 
			; SOURCE LINE # 284
	LCALL	_?OSTimeTick
;    	OSIntExit();					// Must be called finally at every hardware interupt exit point 
			; SOURCE LINE # 285
	LCALL	_?OSIntExit
; }
			; SOURCE LINE # 286
	POP  	AR7
	POP  	AR6
	POP  	AR5
	POP  	AR4
	POP  	AR3
	POP  	AR2
	POP  	AR1
	POP  	AR0
	POP  	PSW
	POP  	DPL
	POP  	DPH
	POP  	B
	POP  	ACC
	RETI 	
; END OF OSTickISR

CSEG	AT	00023H
	LJMP	SerialISR

; 
; /*--------------------------------------------------------------*/
; /* ucOS-II的中断服务程序示例                                    */
; /*--------------------------------------------------------------*/
; #include "serial.h"
; 
; void SerialISR(void) interrupt 4

	RSEG  ?PR?SerialISR?OS_CPU_C
	USING	0
SerialISR:
	PUSH 	ACC
	PUSH 	B
	PUSH 	DPH
	PUSH 	DPL
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR1
	PUSH 	AR2
	PUSH 	AR3
	PUSH 	AR4
	PUSH 	AR5
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 293
; {
; #if OS_CRITICAL_METHOD == 3         // Allocate storage for CPU status register 
;     OS_CPU_SR  cpu_sr;
; #endif 
; 
;     OSIntEnter();					// Must be called first at every hardware interrupt entry point 
			; SOURCE LINE # 299
	LCALL	_?OSIntEnter
;     OS_ENTER_CRITICAL();
			; SOURCE LINE # 300
	CLR  	EA
;     if(TI)
			; SOURCE LINE # 301
	JNB  	TI,?C0011
; 	{
			; SOURCE LINE # 302
; 	  TI=0;
			; SOURCE LINE # 303
	CLR  	TI
;       pc_send.ptr++;
			; SOURCE LINE # 304
	MOV  	DPTR,#pc_send+03H
	CLR  	A
	MOV  	B,#01H
	LCALL	?C?IILDX
;       if (pc_send.ptr < pc_send.count)
			; SOURCE LINE # 305
	MOV  	DPTR,#pc_send+05H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#pc_send+03H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	CLR  	C
	SUBB 	A,R7
	MOV  	A,R6
	XRL  	A,#080H
	MOV  	R0,A
	MOV  	A,R4
	XRL  	A,#080H
	SUBB 	A,R0
	JNC  	?C0013
;         SBUF=pc_send.buffer[pc_send.ptr];
			; SOURCE LINE # 306
	MOV  	DPTR,#pc_send
	LCALL	?C?PLDXDATA
	MOV  	DPL,R5
	MOV  	DPH,R4
	LCALL	?C?CLDOPTR
	MOV  	SBUF,A
; 	}
			; SOURCE LINE # 307
	SJMP 	?C0013
?C0011:
; 	else if(RI)
			; SOURCE LINE # 308
	JNB  	RI,?C0013
; 	{
			; SOURCE LINE # 309
; 	    RI=0;
			; SOURCE LINE # 310
	CLR  	RI
; //处理输入字符
; 	}
			; SOURCE LINE # 312
?C0013:
;     OS_EXIT_CRITICAL();
			; SOURCE LINE # 313
	SETB 	EA
; 
;    	OSIntExit();			// Must be called finally at every hardware interupt exit point 
			; SOURCE LINE # 315
	LCALL	_?OSIntExit
; }
			; SOURCE LINE # 316
	POP  	AR7
	POP  	AR6
	POP  	AR5
	POP  	AR4
	POP  	AR3
	POP  	AR2
	POP  	AR1
	POP  	AR0
	POP  	PSW
	POP  	DPL
	POP  	DPH
	POP  	B
	POP  	ACC
	RETI 	
; END OF SerialISR

; 
; 
; /*
;   设置硬件寄存器的初始值。
;   初始化定时器0,作为ucOS-II的系统时钟。
;   还有其他的与硬件相关的初始化也可以放在这里。
; */
; 
; //串口初始化  0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
; void InitHardware(void) reentrant

	RSEG  ?PR?_?InitHardware?OS_CPU_C
_?InitHardware:
			; SOURCE LINE # 326
; {
;     AUXR = 0x01;		//   
			; SOURCE LINE # 328
	MOV  	AUXR,#01H
;     TMOD = 0x21;   //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
			; SOURCE LINE # 329
	MOV  	TMOD,#021H
;     TH0  = 0xDB;   //定义Tick=100次/秒(即0.01秒/次),TH,TL值与CPU的频率有关(11.0592M)
			; SOURCE LINE # 330
	MOV  	TH0,#0DBH
;     TL0  = 0xFF;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
			; SOURCE LINE # 331
	MOV  	TL0,#0FFH
;     //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
;     TR0  = 1;
			; SOURCE LINE # 333
	SETB 	TR0
; 
; // Setup serial communication 
; // Configure timer 2 as a baud rate generator
; 	PCON |= 0x80;				// 119200
			; SOURCE LINE # 337
	ORL  	PCON,#080H
; 	SCON = 0x50;
			; SOURCE LINE # 338
	MOV  	SCON,#050H
; 
; 	TH1 = 0xFD;
			; SOURCE LINE # 340
	MOV  	TH1,#0FDH
; 	TL1 = 0xFD;
			; SOURCE LINE # 341
	MOV  	TL1,#0FDH
; 	TR1 =1;
			; SOURCE LINE # 342
	SETB 	TR1
; 	ES = 1;
			; SOURCE LINE # 343
	SETB 	ES
; 
;     //设置串口收发的初始值
;     pc_send.ptr=0;
			; SOURCE LINE # 346
	CLR  	A
	MOV  	DPTR,#pc_send+03H
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
;     pc_send.count=0;
			; SOURCE LINE # 347
	INC  	DPTR
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
; }			; SOURCE LINE # 348
	RET  	
; END OF _?InitHardware

	END

⌨️ 快捷键说明

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