📄 os_cpu_c.src
字号:
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
; }
; SOURCE LINE # 105
?C0001:
MOV DPTR,#0EH
LJMP ?C?ADDXBP
; END OF _?OSTaskStkInit
;
; #if OS_CPU_HOOKS_EN
;
; /*
; *********************************************************************************************************
; * OS INITIALIZATION HOOK
; * (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 # 122
; {
;
; }
; SOURCE LINE # 125
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 # 141
; {
; }
; SOURCE LINE # 143
RET
; END OF _?OSInitHookEnd
; #endif
;
; /*
; *********************************************************************************************************
; * 任务创建钩挂函数
; *
; * 描述 : 任务创建时调用
; *
; * 参数 : ptcb是指向将被创建任务的任务控制块的指针。
; *
; * 注意 : 1) 调用期间中断被禁止
; *********************************************************************************************************
; */
; void OSTaskCreateHook (OS_TCB *ptcb) reentrant
RSEG ?PR?_?OSTaskCreateHook?OS_CPU_C
_?OSTaskCreateHook:
USING 0
; SOURCE LINE # 157
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; {
; ptcb = ptcb; /* Prevent compiler warning */
; SOURCE LINE # 159
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; }
; SOURCE LINE # 160
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 # 194
; {
; }
; SOURCE LINE # 196
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 # 225
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; {
; ptcb = ptcb; /* Prevent Compiler warning */
; SOURCE LINE # 227
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; }
; SOURCE LINE # 228
MOV DPTR,#03H
LJMP ?C?ADDXBP
; END OF _?OSTCBInitHook
; #endif
;
; /*
; *********************************************************************************************************
; * 定时钩挂函数
; *
; * 描述 : 本函数每一滴答被调用一次。
; *
; * 参数 : 无
; *
; * 注意 : 1) 在本调用期间中断可以或不可以使能。
; *********************************************************************************************************
; */
; void OSTimeTickHook (void) reentrant
RSEG ?PR?_?OSTimeTickHook?OS_CPU_C
_?OSTimeTickHook:
; SOURCE LINE # 242
; {
; }
; SOURCE LINE # 244
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 # 259
; {
; }
; SOURCE LINE # 261
RET
; END OF _?OSTaskIdleHook
; #endif
;
; #endif
;
; /*
; 使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
; 在外部任务中实现大量的处理。
; 中断处理例程都放在下面。
; */
;
; void UserTickTimer(void)
RSEG ?PR?UserTickTimer?OS_CPU_C
UserTickTimer:
; SOURCE LINE # 272
; {
; SOURCE LINE # 273
; TH0=0x70; //普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
; SOURCE LINE # 274
MOV TH0,#070H
; TL0=0; //Tick=50次/秒(即0.02秒/次),晶振22.1184M
; SOURCE LINE # 275
CLR A
MOV TL0,A
; TR0=1;
; SOURCE LINE # 276
SETB TR0
; }
; SOURCE LINE # 277
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 # 282
; {
; OSIntEnter(); // Must be called first at every hardware interrupt entry point
; SOURCE LINE # 284
LCALL _?OSIntEnter
; UserTickTimer(); // User functions can be called here.
; SOURCE LINE # 285
LCALL UserTickTimer
; OSTimeTick(); // Must be called during tick isr
; SOURCE LINE # 286
LCALL _?OSTimeTick
; OSIntExit(); // Must be called finally at every hardware interupt exit point
; SOURCE LINE # 287
LCALL _?OSIntExit
; }
; SOURCE LINE # 288
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 "source\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 # 295
; {
; #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 # 301
LCALL _?OSIntEnter
; OS_ENTER_CRITICAL();
; SOURCE LINE # 302
CLR EA
; if(TI)
; SOURCE LINE # 303
JNB TI,?C0011
; {
; SOURCE LINE # 304
; TI=0;
; SOURCE LINE # 305
CLR TI
; pc_send.ptr++;
; SOURCE LINE # 306
MOV DPTR,#pc_send+04H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0017
MOV DPTR,#pc_send+03H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
?C0017:
; if (pc_send.ptr < pc_send.count)
; SOURCE LINE # 307
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 # 308
MOV DPTR,#pc_send
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPL,R5
MOV DPH,R4
LCALL ?C?CLDOPTR
MOV SBUF,A
; }
; SOURCE LINE # 309
SJMP ?C0013
?C0011:
; else if(RI)
; SOURCE LINE # 310
JNB RI,?C0013
; {
; SOURCE LINE # 311
; RI=0;
; SOURCE LINE # 312
CLR RI
; //处理输入字符
; }
; SOURCE LINE # 314
?C0013:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 315
SETB EA
;
; OSIntExit(); // Must be called finally at every hardware interupt exit point
; SOURCE LINE # 317
LCALL _?OSIntExit
; }
; SOURCE LINE # 318
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 # 328
; {
; TMOD = 0x21; //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
; SOURCE LINE # 330
MOV TMOD,#021H
; TH0 = 0x70; //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
; SOURCE LINE # 331
MOV TH0,#070H
; TL0 = 0x00; //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
; SOURCE LINE # 332
CLR A
MOV TL0,A
; //ET0 = 1; //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
; TR0 = 1;
; SOURCE LINE # 334
SETB TR0
;
; TH1 = 0xFA; //晶振22.1084, 波特率 9600
; SOURCE LINE # 336
MOV TH1,#0FAH
; ET1 = 0;
; SOURCE LINE # 337
CLR ET1
; TR1 = 1; //start timer1
; SOURCE LINE # 338
SETB TR1
; SCON = 0x50;
; SOURCE LINE # 339
MOV SCON,#050H
; ES = 1;
; SOURCE LINE # 340
SETB ES
;
; //设置串口收发的初始值
; pc_send.ptr=0;
; SOURCE LINE # 343
MOV DPTR,#pc_send+03H
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; pc_send.count=0;
; SOURCE LINE # 344
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; ET0=1; //开时钟节拍中断
; SOURCE LINE # 345
SETB ET0
; } ; SOURCE LINE # 346
RET
; END OF _?InitHardware
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -