Цитата(zltigo @ Sep 10 2015, 02:06)

Так-что как Вы "писали" на АСМ, сейчас видно как Вы пишите на Си
Не собираюсь вам что-то доказывать.
Позволили себе фи в мою сторону, хлебайте теперь. Покажите делом. Поступим просто. Я собрал проект из единственного модуля. Покажите здесь криминал. Исходные данные: ATTINY13. 64 байта ОЗУ. Настройки CSTACK 0x20. RSTACK 8. Найдите криминал в листинге:
CODE
###############################################################################
# #
# IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 10/Sep/2015 01:38:52 #
# Copyright 1996-2012 IAR Systems AB. #
# #
# Source file = F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c #
# Command line = F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c #
# --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_E #
# ASY\Debug\Obj\ -lC F:\Work\Projects\ATMEL\IAR\C\TIMER_EA #
# SY\Debug\List\ -lA F:\Work\Projects\ATMEL\IAR\C\TIMER_EA #
# SY\Debug\List\ --initializers_in_flash --debug #
# -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib -Ohz #
# List file = F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\sys_t #
# imer.lst #
# Object file = F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\sys_ti #
# mer.r90 #
# #
# #
###############################################################################
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c
1 //========================================================================
2 #include "sys_timer.h"
\ In segment ABSOLUTE, at 0x59
\ union <unnamed> volatile __io _A_TIMSK0
\ _A_TIMSK0:
\ 00000000 DS8 1
\ In segment ABSOLUTE, at 0x56
\ union <unnamed> volatile __io _A_OCR0A
\ _A_OCR0A:
\ 00000000 DS8 1
\ In segment ABSOLUTE, at 0x53
\ union <unnamed> volatile __io _A_TCCR0B
\ _A_TCCR0B:
\ 00000000 DS8 1
\ In segment ABSOLUTE, at 0x52
\ union <unnamed> volatile __io _A_TCNT0
\ _A_TCNT0:
\ 00000000 DS8 1
3 //========================================================================
4
5 //========================================================================
6 u08 sys_tick;
7 //========================================================================
8
9 //========================================================================
10 #pragma vector = TIM0_COMPA_vect
\ In segment CODE, align 2, keep-with-next
11 __interrupt void Timer0Comp(void)
\ Timer0Comp:
12 {
\ 00000000 93EA ST -Y, R30
\ 00000002 931A ST -Y, R17
\ 00000004 930A ST -Y, R16
\ 00000006 B71F IN R17, 0x3F
13 ST_OCR += SYS_TIME;
\ 00000008 B706 IN R16, 0x36
\ 0000000A 560A SUBI R16, 106
\ 0000000C BF06 OUT 0x36, R16
14 set_bit (sys_tick, SYS_TICK);
\ 0000000E .... LDI R30, Timers_Queue
\ 00000010 8904 LDD R16, Z+20
\ 00000012 6001 ORI R16, 0x01
\ 00000014 8B04 STD Z+20, R16
15 }
\ 00000016 BF1F OUT 0x3F, R17
\ 00000018 9109 LD R16, Y+
\ 0000001A 9119 LD R17, Y+
\ 0000001C 91E9 LD R30, Y+
\ 0000001E 9518 RETI
\ 00000020 REQUIRE _A_OCR0A
16 //========================================================================
17
18 //========================================================================
\ In segment CODE, align 2, keep-with-next
19 void init_sys_timer (void)
\ init_sys_timer:
20 {
21 sys_tick = 0;
\ 00000000 E000 LDI R16, 0
\ 00000002 .... LDI R30, Timers_Queue
\ 00000004 8B04 STD Z+20, R16
22 ST_TCNT = 0;
\ 00000006 BF02 OUT 0x32, R16
23 set_bit (ST_TIMSK, ST_OCIE);
\ 00000008 B709 IN R16, 0x39
\ 0000000A 6004 ORI R16, 0x04
\ 0000000C BF09 OUT 0x39, R16
24 ST_OCR = SYS_TIME;
\ 0000000E E906 LDI R16, 150
\ 00000010 BF06 OUT 0x36, R16
25 ST_TCCR |= ((1<<CS0) | (1<<CS1));
\ 00000012 B703 IN R16, 0x33
\ 00000014 6003 ORI R16, 0x03
\ 00000016 BF03 OUT 0x33, R16
26 }
\ 00000018 9508 RET
\ 0000001A REQUIRE _A_TCNT0
\ 0000001A REQUIRE _A_TIMSK0
\ 0000001A REQUIRE _A_OCR0A
\ 0000001A REQUIRE _A_TCCR0B
\ In segment TINY_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: TINY_Z>`
27 //------------------------------------------------------------------------
28
29 //------------------------------------------------------------------------
30 struct tmrs_queue Timers_Queue [TMRS_QUANTITY];
\ Timers_Queue:
\ 00000000 DS8 20
\ sys_tick:
\ 00000014 DS8 1
31
\ In segment CODE, align 2, keep-with-next
32 void service_timers(void)
\ service_timers:
33 {
34 if (sys_tick & (1<<SYS_TICK))
\ 00000000 .... LDI R30, Timers_Queue
\ 00000002 8904 LDD R16, Z+20
\ 00000004 FF00 SBRS R16, 0
\ 00000006 C01A RJMP ??service_timers_0
35 {
36 clr_bit (sys_tick, SYS_TICK);
\ 00000008 7F0E ANDI R16, 0xFE
\ 0000000A 8B04 STD Z+20, R16
37
38 u08 i;
39
40 for (i = 0; i < TMRS_QUANTITY; i++)
\ 0000000C E000 LDI R16, 0
41 {
42 if (Timers_Queue [i]. tmr_flags & (1<<TMR_UNLOCK))
\ ??service_timers_1:
\ 0000000E 2F10 MOV R17, R16
\ 00000010 0F11 LSL R17
\ 00000012 0F11 LSL R17
\ 00000014 0F10 ADD R17, R16
\ 00000016 .... LDI R30, Timers_Queue
\ 00000018 0FE1 ADD R30, R17
\ 0000001A 8110 LD R17, Z
\ 0000001C FF10 SBRS R17, 0
\ 0000001E C00B RJMP ??service_timers_2
43 {
44 Timers_Queue [i]. tmr_cnt--;
\ 00000020 8121 LDD R18, Z+1
\ 00000022 8132 LDD R19, Z+2
\ 00000024 5021 SUBI R18, 1
\ 00000026 4030 SBCI R19, 0
\ 00000028 8321 STD Z+1, R18
\ 0000002A 8332 STD Z+2, R19
45
46 if (Timers_Queue[i]. tmr_cnt == 0)
\ 0000002C 8121 LDD R18, Z+1
\ 0000002E 2B23 OR R18, R19
\ 00000030 F411 BRNE ??service_timers_2
47 set_bit (Timers_Queue[i]. tmr_flags, TIME_OUT);
\ 00000032 6012 ORI R17, 0x02
\ 00000034 8310 ST Z, R17
48 }
49 }
\ ??service_timers_2:
\ 00000036 9503 INC R16
\ 00000038 3004 CPI R16, 4
\ 0000003A F348 BRCS ??service_timers_1
50 }
51 }
\ ??service_timers_0:
\ 0000003C 9508 RET
52
53 //------------------------------------------------------------------------
54
55 //------------------------------------------------------------------------
\ In segment CODE, align 2, keep-with-next
56 void set_timer(u08 num_tmr, u16 time)
\ set_timer:
57 {
58 set_bit (Timers_Queue [num_tmr]. tmr_flags, TMR_UNLOCK);
\ 00000000 .... RCALL ?Subroutine1
\ ??CrossCallReturnLabel_5:
\ 00000002 6001 ORI R16, 0x01
\ 00000004 8300 ST Z, R16
59 Timers_Queue [num_tmr]. tmr_cnt = time;
\ 00000006 8321 STD Z+1, R18
\ 00000008 8332 STD Z+2, R19
60 }
\ 0000000A 9508 RET
\ In segment CODE, align 2, keep-with-next
\ ?Subroutine1:
\ 00000000 .... RCALL ?Subroutine2
\ ??CrossCallReturnLabel_1:
\ 00000002 .... LDI R30, Timers_Queue
\ 00000004 0FE0 ADD R30, R16
\ 00000006 REQUIRE ?Subroutine3
\ 00000006 ; // Fall through to label ?Subroutine3
\ In segment CODE, align 2, keep-with-next
\ ?Subroutine3:
\ 00000000 8100 LD R16, Z
\ 00000002 9508 RET
\ In segment CODE, align 2, keep-with-next
\ ?Subroutine2:
\ 00000000 2F10 MOV R17, R16
\ 00000002 0F00 LSL R16
\ 00000004 0F00 LSL R16
\ 00000006 0F01 ADD R16, R17
\ 00000008 9508 RET
61 //------------------------------------------------------------------------
62
63 //------------------------------------------------------------------------
\ In segment CODE, align 2, keep-with-next
64 u08 wait(u08 num_tmr)
\ wait:
65
66 {
67 if(Timers_Queue [num_tmr]. tmr_flags & (1<<TIME_OUT))
\ 00000000 .... RCALL ?Subroutine1
\ ??CrossCallReturnLabel_6:
\ 00000002 FF01 SBRS R16, 1
\ 00000004 C004 RJMP ??wait_0
68 {
69 clr_bit (Timers_Queue [num_tmr]. tmr_flags, TIME_OUT);
\ 00000006 7F0D ANDI R16, 0xFD
\ 00000008 8300 ST Z, R16
70 return 1;
\ 0000000A E001 LDI R16, 1
\ 0000000C 9508 RET
71 }
72 else
73 return 0;
\ ??wait_0:
\ 0000000E E000 LDI R16, 0
\ 00000010 9508 RET
74 }
75 //========================================================================
76
\ In segment CODE, align 2, keep-with-next
77 void set_timer_time_out (u08 a)
\ set_timer_time_out:
78 {
79 set_bit (Timers_Queue [a] .tmr_flags, TIME_OUT);
\ 00000000 .... RCALL ?Subroutine0
\ ??CrossCallReturnLabel_2:
\ 00000002 6002 ORI R16, 0x02
\ 00000004 REQUIRE ?Subroutine4
\ 00000004 ; // Fall through to label ?Subroutine4
80 }
\ In segment CODE, align 2, keep-with-next
\ ?Subroutine4:
\ 00000000 8300 ST Z, R16
\ 00000002 9508 RET
\ In segment CODE, align 2, keep-with-next
\ ?Subroutine0:
\ 00000000 .... RCALL ?Subroutine2
\ ??CrossCallReturnLabel_0:
\ 00000002 2FE0 MOV R30, R16
\ 00000004 .... SUBI R30, (-(Timers_Queue) & 0xFF)
\ 00000006 .... RJMP ?Subroutine3
81
\ In segment CODE, align 2, keep-with-next
82 void set_timer_active (u08 a)
\ set_timer_active:
83 {
84 set_bit (Timers_Queue [a] .tmr_flags, TMR_UNLOCK);
\ 00000000 .... RCALL ?Subroutine0
\ ??CrossCallReturnLabel_3:
\ 00000002 6001 ORI R16, 0x01
\ 00000004 .... RJMP ?Subroutine4
85 }
86
\ In segment CODE, align 2, keep-with-next
87 void set_timer_no_active (u08 a)
\ set_timer_no_active:
88 {
89 clr_bit (Timers_Queue [a] .tmr_flags, TMR_UNLOCK);
\ 00000000 .... RCALL ?Subroutine0
\ ??CrossCallReturnLabel_4:
\ 00000002 7F0E ANDI R16, 0xFE
\ 00000004 .... RJMP ?Subroutine4
90 }
\ In segment INTVEC, offset 0xc, root
\ `??Timer0Comp??INTVEC 12`:
\ 0000000C .... RJMP Timer0Comp
Maximum stack usage in bytes:
CSTACK RSTACK Function
------ ------ --------
3 2 Timer0Comp
0 2 init_sys_timer
0 2 service_timers
0 2 set_timer
0 2 set_timer_active
0 2 set_timer_no_active
0 2 set_timer_time_out
0 2 wait
Segment part sizes:
Bytes Function/Label
----- --------------
2 ??Timer0Comp??INTVEC 12
8 ?Subroutine0
6 ?Subroutine1
10 ?Subroutine2
4 ?Subroutine3
4 ?Subroutine4
32 Timer0Comp
21 Timers_Queue
sys_tick
1 _A_OCR0A
1 _A_TCCR0B
1 _A_TCNT0
1 _A_TIMSK0
26 init_sys_timer
62 service_timers
12 set_timer
6 set_timer_active
6 set_timer_no_active
4 set_timer_time_out
18 wait
4 -- Other
4 bytes in segment ABSOLUTE
198 bytes in segment CODE
4 bytes in segment INITTAB
2 bytes in segment INTVEC
21 bytes in segment TINY_Z
198 bytes of CODE memory (+ 6 bytes shared)
21 bytes of DATA memory (+ 4 bytes shared)
Errors: none
Warnings: none