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

📄 project.lst

📁 AVR单片机C语言程序设计实例精粹
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0032 E5CF      LDI	R28,0x5F
    0033 E0D4      LDI	R29,4
    0034 BFCD      OUT	0x3D,R28
    0035 BFDE      OUT	0x3E,R29
    0036 51C0      SUBI	R28,0x10
    0037 40D0      SBCI	R29,0
    0038 EA0A      LDI	R16,0xAA
    0039 8308      STD	Y+0,R16
    003A 2400      CLR	R0
    003B E7E0      LDI	R30,0x70
    003C E0F0      LDI	R31,0
    003D E010      LDI	R17,0
    003E 38E8      CPI	R30,0x88
    003F 07F1      CPC	R31,R17
    0040 F011      BEQ	0x0043
    0041 9201      ST	R0,Z+
    0042 CFFB      RJMP	0x003E
    0043 8300      STD	Z+0,R16
    0044 E5E4      LDI	R30,0x54
    0045 E0F0      LDI	R31,0
    0046 E6A0      LDI	R26,0x60
    0047 E0B0      LDI	R27,0
    0048 E010      LDI	R17,0
    0049 36E4      CPI	R30,0x64
    004A 07F1      CPC	R31,R17
    004B F021      BEQ	0x0050
    004C 95C8      LPM
    004D 9631      ADIW	R30,1
    004E 920D      ST	R0,X+
    004F CFF9      RJMP	0x0049
    0050 940E014C  CALL	_main
_exit:
    0052 CFFF      RJMP	_exit
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\多任务模拟系统设计\initial.c
(0001) //***************************************************************
(0002) // File Name : Gpio.c
(0003) // Author    : Steaven
(0004) // Created   : 2008-06-09
(0005) // Modified  : 
(0006) // Revision  : V0.0
(0007) //***************************************************************
(0008) 
(0009) #include "app.h"
(0010) 
(0011) //local function(s) declaration
(0012) void Gpio_Init(void);
(0013) void Timer2_Init(void);
(0014) void Interrupt_Init(void);
(0015) 
(0016) //***************************************************************
(0017) // Function    : Hardware_Init
(0018) // Input       : none
(0019) // Output      : none
(0020) // Description : ATmega16 Hardware Initialization
(0021) //***************************************************************
(0022) void Hardware_Init(void)
(0023) {
(0024)     Gpio_Init();
_Hardware_Init:
    0053 D002      RCALL	_Gpio_Init
(0025)     Timer2_Init();
    0054 D00E      RCALL	_Timer2_Init
(0026)     Interrupt_Init();
(0027) }
    0055 C01B      RJMP	_Interrupt_Init
(0028) 
(0029) //***************************************************************
(0030) // Function    : Gpio_Init
(0031) // Input       : none
(0032) // Output      : none
(0033) // Description : ATmega16 GPIO Initialization
(0034) //***************************************************************
(0035) void Gpio_Init(void)
(0036) {
(0037) 	DDRB  &= 0xF0;  //Key1~Key4,GPIO input
_Gpio_Init:
    0056 B387      IN	R24,0x17
    0057 7F80      ANDI	R24,0xF0
    0058 BB87      OUT	0x17,R24
(0038) 	PORTB &= 0xF0;  //Key1~Key4,GPIO no pull-up
    0059 B388      IN	R24,0x18
    005A 7F80      ANDI	R24,0xF0
    005B BB88      OUT	0x18,R24
(0039) 	DDRD  |= 0xF0;  //LED1~LED4,GPIO output
    005C B381      IN	R24,0x11
    005D 6F80      ORI	R24,0xF0
    005E BB81      OUT	0x11,R24
(0040) 	PORTB &= 0x0F;  //LED1~LED4,Gpio output 'L'
    005F B388      IN	R24,0x18
    0060 708F      ANDI	R24,0xF
    0061 BB88      OUT	0x18,R24
(0041) }
    0062 9508      RET
(0042) 
(0043) //***************************************************************
(0044) // Function    : Timer_Init
(0045) // Input       : none
(0046) // Output      : none
(0047) // Description : ATmega16 Timer Initialization
(0048) //***************************************************************
(0049) void Timer2_Init(void)
(0050) {
(0051) 	ASSR  = 0x00;   //Timer2 clocked by sys clk
_Timer2_Init:
    0063 2422      CLR	R2
    0064 BC22      OUT	0x22,R2
(0052) 	TCCR2 = 0x47;   //1024 division,8M/1024,CTC Mode
    0065 E487      LDI	R24,0x47
    0066 BD85      OUT	0x25,R24
(0053) 	TCNT2 = 0x00;   //Clear Counter
    0067 BC24      OUT	0x24,R2
(0054) 	OCR2  = 78;     //78 * 1024/8M = 10ms 
    0068 E48E      LDI	R24,0x4E
    0069 BD83      OUT	0x23,R24
(0055) 	TIMSK |= 0x80;  //Enable OCIE2
    006A B789      IN	R24,0x39
    006B 6880      ORI	R24,0x80
    006C BF89      OUT	0x39,R24
(0056) 	TIFR  |= 0x80;  //Clear OCIF2
    006D B788      IN	R24,0x38
    006E 6880      ORI	R24,0x80
    006F BF88      OUT	0x38,R24
(0057) }
    0070 9508      RET
(0058) 
(0059) //***************************************************************
(0060) // Function    : Interrupt_Init
(0061) // Input       : none
(0062) // Output      : none
(0063) // Description : ATmega16 Interrupt Initialization
(0064) //***************************************************************
(0065) void Interrupt_Init(void)
(0066) {
(0067) 	SREG |= 0x80;   //Enable Global Interrupt
_Interrupt_Init:
    0071 9478      BSET	7
(0068) }
    0072 9508      RET
_Timer2_Interrupt:
    0073 940E03F1  CALL	push_lset
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\多任务模拟系统设计\interrupt.c
(0001) //***************************************************************
(0002) // File Name : Interrupt.c
(0003) // Author    : Steaven
(0004) // Created   : 2008-06-09
(0005) // Modified  : 
(0006) // Revision  : V0.0
(0007) //***************************************************************
(0008) 
(0009) #include "app.h"
(0010) 
(0011) //***************************************************************
(0012) // Function    : Timer2_Interrupt
(0013) // Input       : none
(0014) // Output      : none
(0015) // Description : Kernel Clock Interrupt Service Routine
(0016) //***************************************************************
(0017) #pragma interrupt_handler Timer2_Interrupt:4
(0018) void Timer2_Interrupt(void)
(0019) {
(0020) 	//Clear Timer2 OCIF Flag
(0021) 	TIFR  |= 0x80;
    0075 B788      IN	R24,0x38
    0076 6880      ORI	R24,0x80
    0077 BF88      OUT	0x38,R24
(0022)     TCNT2 = 0x00;
    0078 2422      CLR	R2
    0079 BC24      OUT	0x24,R2
(0023) 	//Key Detection
(0024) 	Key_Detection();
    007A 940E028B  CALL	_Key_Detection
(0025) 	//Update Task Status
(0026) 	OS_Task_Update();
    007C 940E00EB  CALL	_OS_Task_Update
(0027) }
    007E 940E0408  CALL	pop_lset
    0080 9518      RETI
_OS_Event_Pend:
  wTaskEvent           --> R20
  bTaskPrio            --> R16
    0081 940E03D6  CALL	push_gset1
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\多任务模拟系统设计\Kernel.c
(0001) //******************************************************************************
(0002) // File Name : main.c
(0003) // Author    : Steaven
(0004) // Created   : 2008-06-09
(0005) // Modified  : 
(0006) // Revision  : V0.0
(0007) //******************************************************************************
(0008) 
(0009) #include "App.h"
(0010) 
(0011) //Task Control Block structure
(0012) typedef struct
(0013) {
(0014) 	INT16U wTimerPeriod;
(0015) 	INT16U wTimerCount;
(0016) 	INT16U wEvent;
(0017) }OS_TCB;
(0018) 
(0019) //structure array definition
(0020) OS_TCB OSTCB[cMaxTask];
(0021) 
(0022) //******************************************************************************
(0023) // Function    : OS_Event_Pend
(0024) // Input       : wTaskPrio - priority of task
(0025) // Output      : event of task
(0026) // Description : Inquiry event of task indexed by priority and then clear it
(0027) //******************************************************************************
(0028) INT16U OS_Event_Pend(INT8U bTaskPrio)
(0029) {
(0030) 	INT16U wTaskEvent;
(0031) 	wTaskEvent = OSTCB[bTaskPrio].wEvent;
    0083 E086      LDI	R24,6
    0084 9F80      MUL	R24,R16
    0085 01F0      MOVW	R30,R0
    0086 E784      LDI	R24,0x74
    0087 E090      LDI	R25,0
    0088 0FE8      ADD	R30,R24
    0089 1FF9      ADC	R31,R25
    008A 8140      LDD	R20,Z+0
    008B 8151      LDD	R21,Z+1
(0032) 	OSTCB[bTaskPrio].wEvent &= ~wTaskEvent;
    008C E086      LDI	R24,6
    008D 9F80      MUL	R24,R16
    008E 0110      MOVW	R2,R0
    008F E784      LDI	R24,0x74
    0090 E090      LDI	R25,0
    0091 0E28      ADD	R2,R24
    0092 1E39      ADC	R3,R25
    0093 012A      MOVW	R4,R20
    0094 9440      COM	R4
    0095 9450      COM	R5
    0096 01F1      MOVW	R30,R2
    0097 8060      LDD	R6,Z+0
    0098 8071      LDD	R7,Z+1
    0099 2064      AND	R6,R4
    009A 2075      AND	R7,R5
    009B 8271      STD	Z+1,R7
    009C 8260      STD	Z+0,R6
(0033) 	return(wTaskEvent);
    009D 018A      MOVW	R16,R20
    009E 940E03D9  CALL	pop_gset1
    00A0 9508      RET
_OS_Event_Post:
  wTaskEvent           --> R20
  bTaskPrio            --> R22
    00A1 940E03ED  CALL	push_gset2
    00A3 01A9      MOVW	R20,R18
    00A4 2F60      MOV	R22,R16
(0034) }
(0035) 
(0036) //******************************************************************************
(0037) // Function    : OSEventSend
(0038) // Input       : wTaskPrio - priority of task
(0039) //               wTaskEvent - event to be sent                 
(0040) // Output      : none
(0041) // Description : Send an event to task indexed by priority
(0042) //******************************************************************************
(0043) void OS_Event_Post(INT8U bTaskPrio,INT16U wTaskEvent)
(0044) {
(0045) 	OSTCB[bTaskPrio].wEvent |= (1 << wTaskEvent);
    00A5 E086      LDI	R24,6
    00A6 9F86      MUL	R24,R22
    00A7 0110      MOVW	R2,R0
    00A8 E784      LDI	R24,0x74
    00A9 E090      LDI	R25,0
    00AA 0E28      ADD	R2,R24
    00AB 1E39      ADC	R3,R25
    00AC E001      LDI	R16,1
    00AD E010      LDI	R17,0
    00AE 019A      MOVW	R18,R20
    00AF 940E041F  CALL	lsl16
    00B1 01F1      MOVW	R30,R2
    00B2 8040      LDD	R4,Z+0
    00B3 8051      LDD	R5,Z+1
    00B4 2A40      OR	R4,R16
    00B5 2A51      OR	R5,R17
    00B6 8251      STD	Z+1,R5
    00B7 8240      STD	Z+0,R4
(0046) }
    00B8 940E03D3  CALL	pop_gset2
    00BA 9508      RET
(0047) 
(0048) //******************************************************************************
(0049) // Function    : OS_Task_Create
(0050) // Input       : wTaskPrio - priority of task
(0051) //               wTimerPeriod - period of task
(0052) // Output      : none
(0053) // Description : Set time period of a task to create it
(0054) //******************************************************************************
(0055) void OS_Task_Create(INT8U bTaskPrio,INT16U wTimerPeriod)
(0056) {
(0057) 	OSTCB[bTaskPrio].wTimerPeriod = wTimerPeriod;
_OS_Task_Create:
  wTimerPeriod         --> R18
  bTaskPrio            --> R16
    00BB E086      LDI	R24,6
    00BC 9F80      MUL	R24,R16
    00BD 01F0      MOVW	R30,R0
    00BE E780      LDI	R24,0x70
    00BF E090      LDI	R25,0
    00C0 0FE8      ADD	R30,R24
    00C1 1FF9      ADC	R31,R25
    00C2 8331      STD	Z+1,R19
    00C3 8320      STD	Z+0,R18
(0058) }
    00C4 9508      RET
(0059) 
(0060) //******************************************************************************
(0061) // Function    : OS_Task_Start
(0062) // Input       : wTaskPrio - priority of task
(0063) //               wTimerCount - Initial time count of a task
(0064) // Output      : none
(0065) // Description : Set initial time count of a task
(0066) //******************************************************************************
(0067) void OS_Task_Init(INT8U bTaskPrio,INT16U wTimerCount)
(0068) {
(0069) 	OSTCB[bTaskPrio].wTimerCount = wTimerCount;
_OS_Task_Init:
  wTimerCount          --> R18
  bTaskPrio            --> R16
    00C5 E086      LDI	R24,6
    00C6 9F80      MUL	R24,R16
    00C7 01F0      MOVW	R30,R0
    00C8 E782      LDI	R24,0x72
    00C9 E090      LDI	R25,0
    00CA 0FE8      ADD	R30,R24
    00CB 1FF9      ADC	R31,R25
    00CC 8331      STD	Z+1,R19
    00CD 8320      STD	Z+0,R18
(0070) }
    00CE 9508      RET
_OS_Task_Switch:
  bTemp                --> R20
  bTaskPrio            --> R16
    00CF 940E03D6  CALL	push_gset1
(0071) 
(0072) //******************************************************************************
(0073) // Function    : OS_Task_Switch
(0074) // Input       : wTaskPrio - priority of task
(0075) // Output      : none
(0076) // Description : inquiry the task in ready status.if there's no ready task with
(0077) //               priority higher than current one,the task would run
(0078) //******************************************************************************
(0079) INT16U OS_Task_Switch(INT8U bTaskPrio)
(0080) {
(0081) 	INT8U bTemp;
(0082) 	for(bTemp = 0;bTemp < bTaskPrio;bTemp++)
    00D1 2744      CLR	R20
    00D2 C011      RJMP	0x00E4
(0083) 	{
(0084) 		if(OSTCB[bTemp].wEvent != 0)
    00D3 E086      LDI	R24,6
    00D4 9F84      MUL	R24,R20
    00D5 01F0      MOVW	R30,R0
    00D6 E784      LDI	R24,0x74
    00D7 E090      LDI	R25,0
    00D8 0FE8      ADD	R30,R24
    00D9 1FF9      ADC	R31,R25
    00DA 8020      LDD	R2,Z+0
    00DB 8031      LDD	R3,Z+1
    00DC 2022      TST	R2
    00DD F411      BNE	0x00E0
    00DE 2033      TST	R3
    00DF F019      BEQ	0x00E3
(0085) 		{
(0086) 			return(true);
    00E0 E001      LDI	R16,1
    00E1 E010      LDI	R17,0
    00E2 C005      RJMP	0x00E8
    00E3 9543      INC	R20
    00E4 1740      CP	R20,R16
    00E5 F368      BCS	0x00D3
(0087) 		}
(0088) 	}
(0089) 	return(false);
    00E6 2700      CLR	R16
    00E7 2711      CLR	R17
    00E8 940E03D9  CALL	pop_gset1
    00EA 9508      RET
_OS_Task_Update:
  bTemp                --> R20
    00EB 940E03D6  CALL	push_gset1
(0090) }
(0091) 
(0092) //******************************************************************************
(0093) // Function    : OS_Task_Update
(0094) // Input       : none
(0095) // Output      : none
(0096) // Description : increase timercount of all tasks in each SYS clock ISR.if task
(0097) //               is timeout,Kernel send a timer event to the task
(0098) //******************************************************************************
(0099) void OS_Task_Update(void)
(0100) {
(0101) 	INT8U bTemp;
(0102) 	for(bTemp = 0;bTemp < cMaxTask;bTemp++)
    00ED 2744      CLR	R20
    00EE C030      RJMP	0x011F
(0103) 	{
(0104) 		OSTCB[bTemp].wTimerCount++;
    00EF E086      LDI	R24,6
    00F0 9F84      MUL	R24,R20
    00F1 0110      MOVW	R2,R0
    00F2 E782      LDI	R24,0x72
    00F3 E090      LDI	R25,0
    00F4 0E28      ADD	R2,R24
    00F5 1E39      ADC	R3,R25
    00F6 01F1      MOVW	R30,R2
    00F7 8180      LDD	R24,Z+0
    00F8 8191      LDD	R25,Z+1
    00F9 9601      ADIW	R24,1
    00FA 8391      STD	Z+1,R25
    00FB 8380      STD	Z+0,R24
(0105) 		if(OSTCB[bTemp].wTimerCount == OSTCB[bTemp].wTimerPeriod)
    00FC E086      LDI	R24,6
    00FD 9F84      MUL	R24,R20
    00FE E780      LDI	R24,0x70
    00FF E090      LDI	R25,0
    0100 01F0      MOVW	R30,R0
    0101 0FE8      ADD	R30,R24
    0102 1FF9      ADC	R31,R25
    0103 8020      LDD	R2,Z+0
    0104 8031      LDD	R3,Z+1
    0105 E782      LDI	R24,0x72
    0106 E090      LDI	R25,0
    0107 01F0      MOVW	R30,R0
    0108 0FE8      ADD	R30,R24
    0109 1FF9      ADC	R31,R25
    010A 8040      LDD	R4,Z+0
    010B 8051      LDD	R5,Z+1
    010C 1442      CP	R4,R2
    010D 0453      CPC	R5,R3
    010E F479      BNE	0x011E
(0106) 		{
(0107) 			OSTCB[bTemp].wTimerCount = 0;
    010F E086      LDI	R24,6
    0110 9F84      MUL	R24,R20

⌨️ 快捷键说明

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