📄 os_core.lis
字号:
03BA ; */
03BA ;
03BA ; void OSStart (void)
03BA ; {
03BA ; INT8U y;
03BA ; INT8U x;
03BA ;
03BA ;
03BA ; if (OSRunning == FALSE) {
03BA ; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
03BA ; x = OSUnMapTbl[OSRdyTbl[y]];
03BA ; OSPrioHighRdy = (INT8U)((y << 3) + x);
03BA ; OSPrioCur = OSPrioHighRdy;
03BA ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
03BA ; OSTCBCur = OSTCBHighRdy;
03BA ; OSStartHighRdy(); /* Execute target specific code to start task */
03BA ; }
03BA ; }
03BA L34:
03BA 0E940000 xcall pop_gset2
03BE .dbline 0 ; func end
03BE 0895 ret
03C0 .dbsym r x 22 c
03C0 .dbsym r y 20 c
03C0 .dbend
03C0 .dbfunc e OSTaskIdle _OSTaskIdle fV
03C0 ; pdata -> R16,R17
.even
03C0 _OSTaskIdle::
03C0 .dbline -1
03C0 .dbline 244
03C0 ; /*$PAGE*/
03C0 ; /*
03C0 ; *********************************************************************************************************
03C0 ; * IDLE TASK
03C0 ; *
03C0 ; * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
03C0 ; * executes because they are waiting for event(s) to occur.
03C0 ; *
03C0 ; * Arguments : none
03C0 ; *
03C0 ; * Returns : none
03C0 ; *********************************************************************************************************
03C0 ; */
03C0 ;
03C0 ; void OSTaskIdle (void *pdata)
03C0 ; {
03C0 .dbline 245
03C0 ; pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
03C0 .dbline 246
03C0 L38:
03C0 .dbline 246
03C0 .dbline 247
03C0 0A93 st -y,r16
03C2 0FB7 in r16,0x3f
03C4 F894 cli
03C6 0F93 push r16
03C8 0991 ld r16,y+
03CA .dbline 247
03CA .dbline 248
03CA 81E0 ldi R24,1
03CC 90E0 ldi R25,0
03CE A0E0 ldi R26,0
03D0 B0E0 ldi R27,0
03D2 4090F000 lds R4,_OSIdleCtr+2
03D6 5090F100 lds R5,_OSIdleCtr+2+1
03DA 2090EE00 lds R2,_OSIdleCtr
03DE 3090EF00 lds R3,_OSIdleCtr+1
03E2 280E add R2,R24
03E4 391E adc R3,R25
03E6 4A1E adc R4,R26
03E8 5B1E adc R5,R27
03EA 3092EF00 sts _OSIdleCtr+1,R3
03EE 2092EE00 sts _OSIdleCtr,R2
03F2 5092F100 sts _OSIdleCtr+2+1,R5
03F6 4092F000 sts _OSIdleCtr+2,R4
03FA .dbline 249
03FA 0A93 st -y,r16
03FC 0F91 pop r16
03FE 0FBF out 0x3F,r16
0400 0991 ld r16,y+
0402 .dbline 249
0402 .dbline 250
0402 .dbline 246
0402 .dbline 246
0402 DECF xjmp L38
0404 X3:
0404 .dbline -2
0404 L37:
0404 .dbline 0 ; func end
0404 0895 ret
0406 .dbsym r pdata 16 pV
0406 .dbend
0406 .dbfunc e OSTCBInit _OSTCBInit fc
0406 ; ptcb -> R20,R21
0406 ; opt -> y+10
0406 ; pext -> y+8
0406 ; stk_size -> y+6
0406 ; id -> y+4
0406 ; pbos -> y+2
0406 ; ptos -> R18,R19
0406 ; prio -> R16
.even
0406 _OSTCBInit::
0406 0E940000 xcall push_gset1
040A .dbline -1
040A .dbline 297
040A ; for (;;) {
040A ; OS_ENTER_CRITICAL();
040A ; OSIdleCtr++;
040A ; OS_EXIT_CRITICAL();
040A ; }
040A ; }
040A ; /*$PAGE*/
040A ; /*
040A ; *********************************************************************************************************
040A ; * INITIALIZE TCB
040A ; *
040A ; * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
040A ; * a task is created (see OSTaskCreate() and OSTaskCreateExt()).
040A ; *
040A ; * Arguments : prio is the priority of the task being created
040A ; *
040A ; * ptos is a pointer to the task's top-of-stack assuming that the CPU registers
040A ; * have been placed on the stack. Note that the top-of-stack corresponds to a
040A ; * 'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
040A ; * location if OS_STK_GROWTH is set to 0. Note that stack growth is CPU
040A ; * specific.
040A ; *
040A ; * pbos is a pointer to the bottom of stack. A NULL pointer is passed if called by
040A ; * 'OSTaskCreate()'.
040A ; *
040A ; * id is the task's ID (0..65535)
040A ; *
040A ; * stk_size is the size of the stack (in 'stack units'). If the stack units are INT8Us
040A ; * then, 'stk_size' contains the number of bytes for the stack. If the stack
040A ; * units are INT32Us then, the stack contains '4 * stk_size' bytes. The stack
040A ; * units are established by the #define constant OS_STK which is CPU
040A ; * specific. 'stk_size' is 0 if called by 'OSTaskCreate()'.
040A ; *
040A ; * pext is a pointer to a user supplied memory area that is used to extend the task
040A ; * control block. This allows you to store the contents of floating-point
040A ; * registers, MMU registers or anything else you could find useful during a
040A ; * context switch. You can even assign a name to each task and store this name
040A ; * in this TCB extension. A NULL pointer is passed if called by OSTaskCreate().
040A ; *
040A ; * opt options as passed to 'OSTaskCreateExt()' or,
040A ; * 0 if called from 'OSTaskCreate()'.
040A ; *
040A ; * Returns : OS_NO_ERR if the call was successful
040A ; * OS_NO_MORE_TCB if there are no more free TCBs to be allocated and thus, the task cannot
040A ; * be created.
040A ; *
040A ; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
040A ; *********************************************************************************************************
040A ; */
040A ;
040A ; INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
040A ; {
040A .dbline 301
040A ; OS_TCB *ptcb;
040A ;
040A ;
040A ; OS_ENTER_CRITICAL();
040A 0A93 st -y,r16
040C 0FB7 in r16,0x3f
040E F894 cli
0410 0F93 push r16
0412 0991 ld r16,y+
0414 .dbline 301
0414 .dbline 302
0414 ; ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0414 4091E100 lds R20,_OSTCBFreeList
0418 5091E200 lds R21,_OSTCBFreeList+1
041C .dbline 303
041C ; if (ptcb != (OS_TCB *)0) {
041C 4030 cpi R20,0
041E 4507 cpc R20,R21
0420 09F4 brne X6
0422 73C0 xjmp L43
0424 X6:
0424 X4:
0424 .dbline 303
0424 .dbline 304
0424 ; OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
0424 FA01 movw R30,R20
0426 2280 ldd R2,z+2
0428 3380 ldd R3,z+3
042A 3092E200 sts _OSTCBFreeList+1,R3
042E 2092E100 sts _OSTCBFreeList,R2
0432 .dbline 305
0432 ; OS_EXIT_CRITICAL();
0432 0A93 st -y,r16
0434 0F91 pop r16
0436 0FBF out 0x3F,r16
0438 0991 ld r16,y+
043A .dbline 305
043A .dbline 306
043A ; ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
043A 2083 std z+0,R18
043C 3183 std z+1,R19
043E .dbline 307
043E ; ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
043E 0187 std z+9,R16
0440 .dbline 308
0440 ; ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
0440 2224 clr R2
0442 2086 std z+8,R2
0444 .dbline 309
0444 ; ptcb->OSTCBDly = 0; /* Task is not delayed */
0444 3324 clr R3
0446 2682 std z+6,R2
0448 3782 std z+7,R3
044A .dbline 311
044A ;
044A ; pext = pext; /* Prevent compiler warning if not used */
044A .dbline 312
044A ; stk_size = stk_size;
044A .dbline 313
044A ; pbos = pbos;
044A .dbline 314
044A ; opt = opt;
044A .dbline 315
044A ; id = id;
044A .dbline 317
044A ;
044A ; ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
044A 202E mov R2,R16
044C 2694 lsr R2
044E 2694 lsr R2
0450 2694 lsr R2
0452 2386 std z+11,R2
0454 .dbline 318
0454 ; ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
0454 80E0 ldi R24,<_OSMapTbl
0456 90E0 ldi R25,>_OSMapTbl
0458 E385 ldd R30,z+11
045A FF27 clr R31
045C E80F add R30,R24
045E F91F adc R31,R25
0460 E491 lpm R30,Z
0462 DA01 movw R26,R20
0464 1D96 adiw R26,13
0466 EC93 st x,R30
0468 .dbline 319
0468 ; ptcb->OSTCBX = prio & 0x07;
0468 802F mov R24,R16
046A 8770 andi R24,7
046C FA01 movw R30,R20
046E 8287 std z+10,R24
0470 .dbline 320
0470 ; ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
0470 80E0 ldi R24,<_OSMapTbl
0472 90E0 ldi R25,>_OSMapTbl
0474 E285 ldd R30,z+10
0476 FF27 clr R31
0478 E80F add R30,R24
047A F91F adc R31,R25
047C E491 lpm R30,Z
047E DA01 movw R26,R20
0480 1C96 adiw R26,12
0482 EC93 st x,R30
0484 .dbline 322
0484 ;
0484 ; OS_ENTER_CRITICAL();
0484 0A93 st -y,r16
0486 0FB7 in r16,0x3f
0488 F894 cli
048A 0F93 push r16
048C 0991 ld r16,y+
048E .dbline 322
048E .dbline 323
048E ; OSTCBPrioTbl[prio] = ptcb;
048E 82E0 ldi R24,2
0490 809F mul R24,R16
0492 F001 movw R30,R0
0494 80E0 ldi R24,<_OSTCBPrioTbl
0496 90E0 ldi R25,>_OSTCBPrioTbl
0498 E80F add R30,R24
049A F91F adc R31,R25
049C 4083 std z+0,R20
049E 5183 std z+1,R21
04A0 .dbline 324
04A0 ; ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
04A0 2090DD00 lds R2,_OSTCBList
04A4 3090DE00 lds R3,_OSTCBList+1
04A8 FA01 movw R30,R20
04AA 2282 std z+2,R2
04AC 3382 std z+3,R3
04AE .dbline 325
04AE ; ptcb->OSTCBPrev = (OS_TCB *)0;
04AE 2224 clr R2
04B0 3324 clr R3
04B2 2482 std z+4,R2
04B4 3582 std z+5,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -