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

📄 minos_avr.lst

📁 非剥夺型占先式minOS_iccavr avr单片机 icc编译环境
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0065) 
(0066) #if OS_TIME_DLY_EN
(0067) //OS Time Delay --- 使任务延时Tdly个时间节拍
(0068) void OSTimeDly(INT16U Tdly)               /* Delay Tdly clock tick */
(0069) {
(0070) 	OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
    010A 9120013A  LDS	R18,_OS_TASK_CrtPrio
    010C 2733      CLR	R19
    010D E005      LDI	R16,5
    010E E010      LDI	R17,0
    010F D10A      RCALL	mpy16s
    0110 2FE0      MOV	R30,R16
    0111 2FF1      MOV	R31,R17
    0112 E283      LDI	R24,0x23
    0113 E091      LDI	R25,1
    0114 0FE8      ADD	R30,R24
    0115 1FF9      ADC	R31,R25
    0116 8340      STD	R20,0+Z
    0117 8351      STD	R21,1+Z
(0071) 	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
    0118 9120013A  LDS	R18,_OS_TASK_CrtPrio
    011A 2733      CLR	R19
    011B E005      LDI	R16,5
    011C E010      LDI	R17,0
    011D D0FC      RCALL	mpy16s
    011E 2FE0      MOV	R30,R16
    011F 2FF1      MOV	R31,R17
    0120 E282      LDI	R24,0x22
    0121 E091      LDI	R25,1
    0122 0FE8      ADD	R30,R24
    0123 1FF9      ADC	R31,R25
    0124 EF8A      LDI	R24,0xFA
    0125 8380      STD	R24,0+Z
(0072) 	OSSched();
    0126 D025      RCALL	_OSSched
(0073) }
    0127 D137      RCALL	pop_gset1
    0128 9508      RET
_OSTaskSuspend:
  TaskPrio             --> R20
    0129 D132      RCALL	push_gset1
    012A 2F40      MOV	R20,R16
(0074) #endif
(0075) 
(0076) #if OS_TASK_SUSPEND_EN>0
(0077) //把正在运行的任务挂起(Suspend a task)。
(0078) void OSTaskSuspend(INT8U TaskPrio) 
(0079) {
(0080) 	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
    012B 2F24      MOV	R18,R20
    012C 2733      CLR	R19
    012D E005      LDI	R16,5
    012E E010      LDI	R17,0
    012F D0EA      RCALL	mpy16s
    0130 2FE0      MOV	R30,R16
    0131 2FF1      MOV	R31,R17
    0132 E282      LDI	R24,0x22
    0133 E091      LDI	R25,1
    0134 0FE8      ADD	R30,R24
    0135 1FF9      ADC	R31,R25
    0136 EF8D      LDI	R24,0xFD
    0137 8380      STD	R24,0+Z
(0081) 	OSSched();
    0138 D013      RCALL	_OSSched
(0082) }
    0139 D125      RCALL	pop_gset1
    013A 9508      RET
_OSTaskResume:
  TaskPrio             --> R20
    013B D120      RCALL	push_gset1
    013C 2F40      MOV	R20,R16
(0083) #endif
(0084) 
(0085) #if OS_TASK_Resume_EN>0
(0086) // 恢复被挂起的任务(resume a task)。
(0087) void OSTaskResume(INT8U TaskPrio) 
(0088) {
(0089) 	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
    013D 2F24      MOV	R18,R20
    013E 2733      CLR	R19
    013F E005      LDI	R16,5
    0140 E010      LDI	R17,0
    0141 D0D8      RCALL	mpy16s
    0142 2FE0      MOV	R30,R16
    0143 2FF1      MOV	R31,R17
    0144 E282      LDI	R24,0x22
    0145 E091      LDI	R25,1
    0146 0FE8      ADD	R30,R24
    0147 1FF9      ADC	R31,R25
    0148 EF8C      LDI	R24,0xFC
    0149 8380      STD	R24,0+Z
(0090) }
    014A D114      RCALL	pop_gset1
    014B 9508      RET
(0091) #endif
(0092) 
(0093) //任务调度,把CPU控制权转到优先级最高的处于就绪态的任务。如果没有处于就绪态的任务,就地等待,
(0094) void OSSched(void) 
(0095) {
(0096) 	do
(0097) 	{
(0098) 		OS_TASK_HighPri=OSPrioHighRdy();
_OSSched:
    014C DF5C      RCALL	_OSPrioHighRdy
    014D 2E20      MOV	R2,R16
    014E 2E31      MOV	R3,R17
    014F 92200139  STS	R2,_OS_TASK_HighPri
(0099) 	} while (OS_TASK_HighPri==no_TASK_Rdy);
    0151 91800139  LDS	R24,_OS_TASK_HighPri
    0153 3F8F      CPI	R24,0xFF
    0154 F3B9      BEQ	0x014C
(0100) 	OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
    0155 2F28      MOV	R18,R24
    0156 2733      CLR	R19
    0157 E005      LDI	R16,5
    0158 E010      LDI	R17,0
    0159 D0C0      RCALL	mpy16s
    015A 2FE0      MOV	R30,R16
    015B 2FF1      MOV	R31,R17
    015C E282      LDI	R24,0x22
    015D E091      LDI	R25,1
    015E 0FE8      ADD	R30,R24
    015F 1FF9      ADC	R31,R25
    0160 EF8B      LDI	R24,0xFB
    0161 8380      STD	R24,0+Z
(0101) 	OS_TASK_INT();
    0162 D051      RCALL	_OSCtxSw
(0102) }
    0163 9508      RET
FILE: C:\icc\minOS_iccavr\os_cpu.c
(0000) /*
(0001) *********************************************************************************************************
(0002) *                                      minOS 0.01v
(0003) *                                The Real-Time OS Kernel
(0004) *                                  All Rights Reserved
(0005) * File : OS_CPU.C
(0006) * 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
(0007) *
(0008) *********************************************************************************************************
(0009) */
(0010) 
(0011) #define OS_CPU_GLOBALS
(0012) #include "OS_Includes.h"
(0013) 
(0014) #pragma interrupt_handler OSTickISR:8  //uses Timer0 for time ticks.
(0015) 
(0016) //;CPU specific definitions 
(0017) #define C51_CRYSTAL_FREQ   4000000ul
(0018) //;Determine the reload values for timer 0 this is automated by the next macro
(0019) #define T0_RELOAD  C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 1024
(0020) #define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
(0021) //Initial OS Timer for time ticks --- 初始化时间节拍定时器。
(0022) void InitOSTimer(void)
(0023) {
(0024)   TIMSK |= (1<<1);     // set T0IE0
_InitOSTimer:
    0164 B789      IN	R24,P39
    0165 6082      ORI	R24,2
    0166 BF89      OUT	P39,R24
(0025)   TCCR0  = 0x05;       // CTC0=CK/1024
    0167 E085      LDI	R24,5
    0168 BF83      OUT	P33,R24
(0026)   TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
    0169 E78A      LDI	R24,0x7A
    016A BF82      OUT	P32,R24
(0027)   SREG  |= (1<<7);     // SEI
    016B 9478      BSET	7
(0028) }
    016C 9508      RET
_OSTaskCreate:
  prio                 --> Y+4
  tStk                 --> R22
  tFunc                --> R20
    016D D105      RCALL	push_gset2
    016E 2F62      MOV	R22,R18
    016F 2F73      MOV	R23,R19
    0170 2F40      MOV	R20,R16
    0171 2F51      MOV	R21,R17
(0029) 
(0030) //建立一个任务(Create a Task)。
(0031) //Inport :  tFunc --- function address , tStk --- stack bottom , prio --- Priority .
(0032) void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio) 
(0033) {
(0034)  	OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
    0172 812C      LDD	R18,4+Y
    0173 2733      CLR	R19
    0174 E005      LDI	R16,5
    0175 E010      LDI	R17,0
    0176 D0A3      RCALL	mpy16s
    0177 2FE0      MOV	R30,R16
    0178 2FF1      MOV	R31,R17
    0179 E282      LDI	R24,0x22
    017A E091      LDI	R25,1
    017B 0FE8      ADD	R30,R24
    017C 1FF9      ADC	R31,R25
    017D EF8C      LDI	R24,0xFC
    017E 8380      STD	R24,0+Z
(0035) 	OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called             */
    017F 812C      LDD	R18,4+Y
    0180 2733      CLR	R19
    0181 E005      LDI	R16,5
    0182 E010      LDI	R17,0
    0183 D096      RCALL	mpy16s
    0184 2FE0      MOV	R30,R16
    0185 2FF1      MOV	R31,R17
    0186 E280      LDI	R24,0x20
    0187 E091      LDI	R25,1
    0188 0FE8      ADD	R30,R24
    0189 1FF9      ADC	R31,R25
    018A 2F86      MOV	R24,R22
    018B 2F97      MOV	R25,R23
    018C 9701      SBIW	R24,1
    018D 970C      SBIW	R24,0xC
    018E 9702      SBIW	R24,2
    018F 8380      STD	R24,0+Z
    0190 8391      STD	R25,1+Z
(0036)                           -12             /* reserve for to save R0-R5 , R26-R31 registers  */
(0037)                           -sizeof(INT16U) /* The PC value to be loaded                      */
(0038) 					   ;
(0039) 	*--tStk	=  *(INT16U const *)tFunc & 0xff;   /* Save low byte of task function address   */
    0191 2F86      MOV	R24,R22
    0192 2F97      MOV	R25,R23
    0193 9701      SBIW	R24,1
    0194 2E28      MOV	R2,R24
    0195 2E39      MOV	R3,R25
    0196 2D62      MOV	R22,R2
    0197 2D73      MOV	R23,R3
    0198 2F04      MOV	R16,R20
    0199 2F15      MOV	R17,R21
    019A D0DD      RCALL	lpm16
    019B 2F80      MOV	R24,R16
    019C 2F91      MOV	R25,R17
    019D 7090      ANDI	R25,0
    019E 2DE2      MOV	R30,R2
    019F 2DF3      MOV	R31,R3
    01A0 8380      STD	R24,0+Z
(0040) 	*--tStk	=  *(INT16U const *)tFunc / 0x100;  /* Save high byte of task function address  */
    01A1 2F86      MOV	R24,R22
    01A2 2F97      MOV	R25,R23
    01A3 9701      SBIW	R24,1
    01A4 2E28      MOV	R2,R24
    01A5 2E39      MOV	R3,R25
    01A6 2D62      MOV	R22,R2
    01A7 2D73      MOV	R23,R3
    01A8 2F04      MOV	R16,R20
    01A9 2F15      MOV	R17,R21
    01AA D0CD      RCALL	lpm16
    01AB 2E40      MOV	R4,R16
    01AC 2E51      MOV	R5,R17
    01AD 2C45      MOV	R4,R5
    01AE 2455      CLR	R5
    01AF 2DE2      MOV	R30,R2
    01B0 2DF3      MOV	R31,R3
    01B1 8240      STD	R4,0+Z
(0041) }
    01B2 D0C3      RCALL	pop_gset2
    01B3 9508      RET
(0042) 
(0043) static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
(0044) 
(0045) //context switch interrupt --- 软中断任务切换
(0046) void OSCtxSw(void) 
(0047) {
(0048)     asm("PUSH R31\n"
_OSCtxSw:
    01B4 93FF      PUSH	R31
    01B5 93EF      PUSH	R30
    01B6 93DF      PUSH	R29
    01B7 93CF      PUSH	R28
    01B8 93BF      PUSH	R27
    01B9 93AF      PUSH	R26
    01BA 920F      PUSH	R0
    01BB 921F      PUSH	R1
    01BC 922F      PUSH	R2
    01BD 923F      PUSH	R3
    01BE 924F      PUSH	R4
    01BF 925F      PUSH	R5
    01C0 B7FD      IN	R31,P3D
    01C1 93F0013B  STS	R31,_OS_TASK_CrtPrio+1
    01C3 B7FE      IN	R31,P3E
    01C4 93F0013C  STS	R31,_OS_TASK_CrtPrio+2
(0049)         "PUSH R30\n"
(0050)         "PUSH R29\n"
(0051)         "PUSH R28\n"
(0052)         "PUSH R27\n"
(0053)         "PUSH R26\n"
(0054) 
(0055)         "PUSH R0\n"
(0056)         "PUSH R1\n"
(0057)         "PUSH R2\n"
(0058)         "PUSH R3\n"
(0059)         "PUSH R4\n"
(0060)         "PUSH R5\n"
(0061) 
(0062) 		"IN R31,0x3d\n"     //Save SPL
(0063) 		"STS %SaveSP,R31\n"
(0064) 		"IN R31,0x3e\n"     //Save SPH 
(0065) 		"STS %SaveSP+1,R31\n"
(0066) 	
(0067) 	);
(0068) 
(0069) 	OSTCB[OS_TASK_CrtPrio].OSStkTop = SaveSP; //Save the current task top.
    01C6 9120013A  LDS	R18,_OS_TASK_CrtPrio
    01C8 2733      CLR	R19
    01C9 E005      LDI	R16,5
    01CA E010      LDI	R17,0
    01CB D04E      RCALL	mpy16s
    01CC 2FE0      MOV	R30,R16
    01CD 2FF1      MOV	R31,R17
    01CE E280      LDI	R24,0x20
    01CF E091      LDI	R25,1
    01D0 0FE8      ADD	R30,R24
    01D1 1FF9      ADC	R31,R25
    01D2 9030013C  LDS	R3,_OS_TASK_CrtPrio+2
    01D4 9020013B  LDS	R2,_OS_TASK_CrtPrio+1
    01D6 8220      STD	R2,0+Z
    01D7 8231      STD	R3,1+Z
(0070) 
(0071) 	OS_TASK_CrtPrio=OS_TASK_HighPri;
    01D8 90200139  LDS	R2,_OS_TASK_HighPri
    01DA 9220013A  STS	R2,_OS_TASK_CrtPrio
(0072) 
(0073) // Load context from the stack
(0074)     SaveSP = OSTCB[OS_TASK_CrtPrio].OSStkTop;	//load the high priority task task top.
    01DC 2D22      MOV	R18,R2
    01DD 2733      CLR	R19
    01DE E005      LDI	R16,5
    01DF E010      LDI	R17,0
    01E0 D039      RCALL	mpy16s
    01E1 2FE0      MOV	R30,R16
    01E2 2FF1      MOV	R31,R17
    01E3 E280      LDI	R24,0x20
    01E4 E091      LDI	R25,1
    01E5 0FE8      ADD	R30,R24
    01E6 1FF9      ADC	R31,R25
    01E7 8020      LDD	R2,0+Z
    01E8 8031      LDD	R3,1+Z
    01E9 9230013C  STS	R3,_OS_TASK_CrtPrio+2
    01EB 9220013B  STS	R2,_OS_TASK_CrtPrio+1
(0075) 
(0076)     asm("CLI\n"						
    01ED 94F8      BCLR	7
    01EE 91F0013B  LDS	R31,_OS_TASK_CrtPrio+1
    01F0 BFFD      OUT	P3D,R31
    01F1 91F0013C  LDS	R31,_OS_TASK_CrtPrio+2
    01F3 BFFE      OUT	P3E,R31
    01F4 9478      BSET	7
    01F5 905F      POP	R5
    01F6 904F      POP	R4
    01F7 903F      POP	R3
    01F8 902F      POP	R2
    01F9 901F      POP	R1
    01FA 900F      POP	R0
    01FB 91AF      POP	R26
    01FC 91BF      POP	R27
    01FD 91CF      POP	R28
    01FE 91DF      POP	R29
    01FF 91EF      POP	R30
    0200 91FF      POP	R31
(0077) 	    "LDS R31,%SaveSP\n" 
(0078) 	    "OUT 0x3d,R31\n"
(0079) 		"LDS R31,%SaveSP+1\n" 
(0080) 	    "OUT 0x3e,R31\n"
(0081) 		"SEI\n"
(0082) 		
(0083)         "POP R5\n"
(0084)         "POP R4\n"
(0085)         "POP R3\n"
(0086)         "POP R2\n"
(0087)         "POP R1\n"
(0088)         "POP R0\n"
(0089) 		
(0090) 	    "POP R26\n"
(0091) 	    "POP R27\n"
(0092)         "POP R28\n"
(0093)         "POP R29\n"
(0094)         "POP R30\n"
(0095)         "POP R31\n"
(0096) 	);
(0097) }
    0201 9508      RET
(0098) //Initial CPU SP for main() function stack.
(0099) void OSInitSP(void)
(0100) {
(0101)     SaveSP = (INT16U)&TASK_main_PrioStk[MAX_STK_SIZE-1];	//load the high priority task task top.
_OSInitSP:
    0202 E18F      LDI	R24,0x1F
    0203 E091      LDI	R25,1
    0204 9390013C  STS	R25,_OS_TASK_CrtPrio+2
    0206 9380013B  STS	R24,_OS_TASK_CrtPrio+1
(0102)     asm("POP R0\n"
    0208 900F      POP	R0
    0209 901F      POP	R1
    020A 91F0013B  LDS	R31,_OS_TASK_CrtPrio+1
    020C BFFD      OUT	P3D,R31
    020D 91F0013C  LDS	R31,_OS_TASK_CrtPrio+2
    020F BFFE      OUT	P3E,R31
    0210 921F      PUSH	R1
    0211 920F      PUSH	R0
(0103) 	    "POP R1\n"
(0104) 	    "LDS R31,%SaveSP\n" 
(0105) 	    "OUT 0x3d,R31\n"
(0106) 		"LDS R31,%SaveSP+1\n" 
(0107) 	    "OUT 0x3e,R31\n"
(0108) 		"PUSH R1\n"
(0109) 		"PUSH R0\n"
(0110) 	);
(0111) }
    0212 9508      RET
_OSTickISR:
    0213 D01A      RCALL	push_lset
(0112) 
(0113) //OS Time Tick Interrupt,OS 时钟节拍中断.
(0114) void OSTickISR(void) 
(0115) {
(0116)     TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
    0214 E78A      LDI	R24,0x7A
    0215 BF82      OUT	P32,R24
(0117) 	AppTickHook();     //Hook file for a time tick --- 用户每个时间节拍的钩子函数

⌨️ 快捷键说明

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