Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн июн 09, 2014 15:15:03
Пишите уже на ассемблере. Там вы сделаете так, как пожелаете.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
не увидел, где вы такое писали, и не вижу общего в последнем и предпоследнем примерах вашего кода - что там за "та же фигня" происходит, мне непонятно.pokk писал(а):Я же написал что такая фигня происходила в других местах примеру вот тут было тоже самое.
Код: Выделить всё
83: FLAG.flag.F_AC=1; //765765
+00000DB4: 91E00500 LDS R30,0x0500 Load direct from data space
+00000DB6: 64E0 ORI R30,0x40 Logical OR with immediate
+00000DB7: 940E134E CALL 0x0000134E Call subroutine
84: FLAG.flag.F_T1=1;
+00000DB9: 61E0 ORI R30,0x10 Logical OR with immediate
+00000DBA: 940E134E CALL 0x0000134E Call subroutine
85: FLAG.flag.F_I1=0;
+00000DBC: 7FEB ANDI R30,0xFB Logical AND with immediate
+00000DBD: 940E134E CALL 0x0000134E Call subroutine
86: FLAG.flag.F_I2=1;
+00000DBF: 60E8 ORI R30,0x08 Logical OR with immediate
+00000DC0: 93E00500 STS 0x0500,R30 Store direct to data space
87: FLAG.byte=0;
+00000DC2: E0E0 LDI R30,0x00 Load immediate
+00000DC3: 93E00500 STS 0x0500,R30 Store direct to data spaceКод: Выделить всё
0000134E: 93E00500 STS 0x0500,R30 Store direct to data space
+00001350: 9508 RET Subroutine returnЯ вот не могу въехать - что значит "обернул функцией"?
Код: Выделить всё
сделал +00000DBD: 940E134E CALL 0x0000134E Call subroutine
..
0000134E: 93E00500 STS 0x0500,R30 Store direct to data space
+00001350: 9508 RET Subroutine returnв 3 раза дольше выполняется.И чем вам это не угодило?
у вас оптимизация вообще включена или нет? судя по листингу компилятор достаточно умный, чтобы делать ORI и ANDI над содержимым регистра, но при этом достаточно туп, так как постоянно осуществляет сохранение этого регистра в ячейке памяти... бред какой-то.pokk писал(а):Ну вот он опять запись в ОЗУ обернул функцией и вынес
Понятно же, что имелось в виду при инкременте, а не при сложении.Как видим, сброс в ноль не предусмотрен.
Не понятно. Можно попонятнее?Panda_Y2K писал(а):Ого сколько написали.Понятно же...Как видим, сброс в ноль не предусмотрен.
Всё дело было в сферических конях =) для того что бы было проще было в ассемблерном листинге найти кусок кода я его вставлял в самое начало хотя использоваться он должен был в прерываниях. Ну а компилятор видимо по смотрел что код выполняется 1 раз по этому скорость не важна и запихал всё в функции. После того как запихал всё в прерывания не каких вызовов CALL не стало.ARV писал(а):пытаться оптимизировать бессмысленный код - пустая трата времени. оптимизировать надо конкретные задачи, а не сферических коней.
Код: Выделить всё
106: test_inc++;
+00000FED: 5F2F SUBI R18,0xFF Subtract immediate
107: test_inc++;
+00000FEE: 5F2F SUBI R18,0xFF Subtract immediate
108: test_inc++;
+00000FEF: 5F2F SUBI R18,0xFF Subtract immediate