Ответ: Здесь пример транляции Вашего кода на AVR
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 14 января 2003 г. 13:27
В ответ на: Ответ: Во-первых, без структур обойтись можно. Другое дело, что с ними часто отправлено Bill 14 января 2003 г. 12:56


1
2 typedef struct {
3 unsigned int nowPos;
4 unsigned int goPos;
5 unsigned int nowSpeed;
6 unsigned int goSpeed;
7 unsigned int minSpeed;
8 unsigned goDirection:1;
9 unsigned goRainbow:1;
10 unsigned lastDir:1;
11 } nxStepData;
12

\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?`
13 static nxStepData step; //(объявлена как глобальная!)
\ static nxStepData __near step;
\ step:
\ 00000000 DS 12

\ In segment CODE, align 2, keep-with-next
14 void test(void)
15 {
16 if(step.nowSpeed > step.goSpeed)
\ __nearfunc void test();
\ test:
\ 00000000 .... LDI R30,LOW(step)
\ 00000002 .... LDI R31,(step) >> 8
\ 00000004 8106 LDD R16,Z+6
\ 00000006 8117 LDD R17,Z+7
\ 00000008 8124 LDD R18,Z+4
\ 0000000A 8135 LDD R19,Z+5
\ 0000000C D024 RCALL ??test_0
\ 0000000E F478 BRCC ??test_1
17 {
18 if(step.nowSpeed > step.minSpeed)
\ 00000010 8500 LDD R16,Z+8
\ 00000012 8511 LDD R17,Z+9
\ 00000014 D020 RCALL ??test_0
\ 00000016 F438 BRCC ??test_2
19 {
20 if(step.goSpeed < step.minSpeed)
\ 00000018 8106 LDD R16,Z+6
\ 0000001A 8117 LDD R17,Z+7
\ 0000001C D01A RCALL ??test_3
\ 0000001E F498 BRCC ??test_4
21 step.nowSpeed = step.minSpeed;
\ 00000020 8324 STD Z+4,R18
\ 00000022 8335 STD Z+5,R19
\ 00000024 9508 RET
22 else
23 step.nowSpeed = step.goSpeed;
24 }
25 else
26 {
27 step.nowSpeed--;
\ ??test_2:
\ 00000026 0189 MOVW R17 : R16,R19 : R18
\ 00000028 5001 SUBI R16,1
\ 0000002A 4010 SBCI R17,0
\ 0000002C C00C RJMP ??test_4
28 };
29 }
30 else if(step.nowSpeed != step.goSpeed)
\ ??test_1:
\ 0000002E 0189 MOVW R17 : R16,R19 : R18
\ 00000030 8126 LDD R18,Z+6
\ 00000032 8137 LDD R19,Z+7
\ 00000034 D010 RCALL ??test_0
\ 00000036 F061 BREQ ??test_5
31 {
32 if(step.goSpeed < step.minSpeed)
\ 00000038 0189 MOVW R17 : R16,R19 : R18
\ 0000003A D00B RCALL ??test_3
\ 0000003C F438 BRCC ??test_6
33 step.nowSpeed++;
\ 0000003E 8104 LDD R16,Z+4
\ 00000040 8115 LDD R17,Z+5
\ 00000042 5F0F SUBI R16,255
\ 00000044 4F1F SBCI R17,255
\ ??test_4:
\ 00000046 8304 STD Z+4,R16
\ 00000048 8315 STD Z+5,R17
\ 0000004A 9508 RET
34 else step.nowSpeed = step.goSpeed;
\ ??test_6:
\ 0000004C 8304 STD Z+4,R16
\ 0000004E 8315 STD Z+5,R17
35 };
36 }
\ ??test_5:
\ 00000050 9508 RET
\ ??test_3:
\ 00000052 8520 LDD R18,Z+8
\ 00000054 8531 LDD R19,Z+9
\ ??test_0:
\ 00000056 1702 CP R16,R18
\ 00000058 0713 CPC R17,R19
\ 0000005A 9508 RET

Maximum stack usage in bytes:

Function CSTACK RSTACK
-------- ------ ------
test 0 0


92 bytes in segment CODE
6 bytes in segment INITTAB
12 bytes in segment NEAR_Z


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru