реклама на сайте
подробности

 
 
> Ошибка IAR или чтото еще?
Sergio66
сообщение Dec 18 2006, 12:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Столкнулся со следующей проблемой:
Использую IAR 4.20А
В программе (в функции) перемножаю два числа типа long int. Одно из них - локальная временная переменная (для упрощения расчетов). Результат умножения получается неверным (просто бред!). АВР СТУДИО показывает, что компиллятор размещает временную переменную в регистрах.
Вылечил данную проблему тем, что правдами - неправдами добился того, чтобы компиллятор разместил данную переменную в памяти. Вот только тогда все и заработало.
Кто нибудь может прокомментировать этот случай?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Dec 20 2006, 17:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Мда... Умные речи о значимости скобок не помогли...
Финал - стоны зрителей, аншлаг, занавес закрывается


--------------------
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 20 2006, 17:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(prottoss @ Dec 20 2006, 17:32) *
Мда... Умные речи о значимости скобок не помогли...
Финал - стоны зрителей, аншлаг, занавес закрывается

Уличили tongue.gif
А дизассемблер привести сложно? Или мы должны все бросить и посвятить вечер изучению ?
Сами то смотрели?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 20 2006, 18:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Dog Pawlowa @ Dec 20 2006, 21:54) *
А дизассемблер привести сложно? Или мы должны все бросить и посвятить вечер изучению ? Сами то смотрели?
Я смотрел, и не раз, пожалуйста, c чуйством глубокохо удовлетворения привожу листинг, смотрите:

Код
218          /*****************************************************************************
    219          Коррекция значения времени
    220          Корректирует время в зависимости от значения TIFR и младшего слова (ТС1)
    221          ***************************************************************************
***/
    222          //UINT32 PULSE_SENS_CorrectTime(Pulse_Time_t *Pulse)

   \                                 In segment CODE, align 2, keep-with-next
    223          void PULSE_SENS_CorrectTime(Pulse_Time_t *Pulse)
   \                     PULSE_SENS_CorrectTime:
    224          {
   \   00000000   2F79               MOV     R23, R25
   \   00000002   2E28               MOV     R2, R24
   \   00000004   01F8               MOVW    R31:R30, R17:R16
    225           UINT32 time = Pulse->Time;
   \   00000006   8100               LD      R16, Z
   \   00000008   8111               LDD     R17, Z+1
   \   0000000A   8122               LDD     R18, Z+2
   \   0000000C   8133               LDD     R19, Z+3
    226            
    227             /* корректируем результат по состоянию флага OCF1A
    228              на момент считывания значений времени */
    229              if(Pulse->TIFR_reg & (1 << OCF1A))
   \   0000000E   8144               LDD     R20, Z+4
   \   00000010   FF44               SBRS    R20, 4
   \   00000012   C00A               RJMP    ??PULSE_SENS_CorrectTime_0
    230              {
    231                 time += 0x00010000; /* если флаг установлен, инкрементируем значение милисекунд */
   \   00000014   5000               SUBI    R16, 0
   \   00000016   4010               SBCI    R17, 0
   \   00000018   4F2F               SBCI    R18, 255
   \   0000001A   4F3F               SBCI    R19, 255
    232                 if(SYSTIMER_COMPARE_VAL == LOWORD(time))
   \   0000001C   2F51               MOV     R21, R17
   \   0000001E   3C0F               CPI     R16, 207
   \   00000020   4057               SBCI    R21, 7
   \   00000022   F411               BRNE    ??PULSE_SENS_CorrectTime_0
    233                  
    234                     /* если значение счетчика равно константе в регистре сравнения, то мы это
    235                     значение должны обнулить */
    236                     time &= 0xffff0000;
   \   00000024   E000               LDI     R16, 0
   \   00000026   E010               LDI     R17, 0
    237              }
    238          
    239              /* преобразуем в мкс */
    240              Pulse->Time = ((UINT32)(LOWORD(time) >> 1) + (UINT32)(HIWORD(time)) * 1000);
   \                     ??PULSE_SENS_CorrectTime_0:
   \   00000028   01A8               MOVW    R21:R20, R17:R16
   \   0000002A   9556               LSR     R21
   \   0000002C   9547               ROR     R20
   \   0000002E   E060               LDI     R22, 0
   \   00000030   0189               MOVW    R17:R16, R19:R18
   \   00000032   01C8               MOVW    R25:R24, R17:R16
   \   00000034   EE08               LDI     R16, 232
   \   00000036   E013               LDI     R17, 3
   \   00000038   E020               LDI     R18, 0
   \   0000003A   E030               LDI     R19, 0
   \   0000003C   9F19               MUL     R17, R25
   \   0000003E   0D20               ADD     R18, R0
   \   00000040   1D31               ADC     R19, R1
   \   00000042   9F18               MUL     R17, R24
   \   00000044   2D10               MOV     R17, R0
   \   00000046   0D21               ADD     R18, R1
   \   00000048   1F36               ADC     R19, R22
   \   0000004A   9F09               MUL     R16, R25
   \   0000004C   0D10               ADD     R17, R0
   \   0000004E   1D21               ADC     R18, R1
   \   00000050   1F36               ADC     R19, R22
   \   00000052   9F08               MUL     R16, R24
   \   00000054   2D00               MOV     R16, R0
   \   00000056   0D11               ADD     R17, R1
   \   00000058   1F26               ADC     R18, R22
   \   0000005A   1F36               ADC     R19, R22
   \   0000005C   0F04               ADD     R16, R20
   \   0000005E   1F15               ADC     R17, R21
   \   00000060   1F26               ADC     R18, R22
   \   00000062   1F36               ADC     R19, R22
   \   00000064   8300               ST      Z, R16
   \   00000066   8311               STD     Z+1, R17
   \   00000068   8322               STD     Z+2, R18
   \   0000006A   8333               STD     Z+3, R19
    241              //return ((UINT32)(LOWORD(time) >> 1) + (UINT32)(HIWORD(time)) * 1000);
    242          }
   \   0000006C   2D82               MOV     R24, R2
   \   0000006E   2F97               MOV     R25, R23
   \   00000070   9508               RET




Что бы не напрягать попусту Ваши глаза и мозговые извилины, сделаю два замечания:

В начале кода компилятор послушно берет адрес и формирует переменную time из регистров r16-19
Код
00000000   2F79               MOV     R23, R25
   \   00000002   2E28               MOV     R2, R24
   \   00000004   01F8               MOVW    R31:R30, R17:R16
    225           UINT32 time = Pulse->Time;
   \   00000006   8100               LD      R16, Z
   \   00000008   8111               LDD     R17, Z+1
   \   0000000A   8122               LDD     R18, Z+2
   \   0000000C   8133               LDD     R19, Z+3


В конце, так же послушно запихивает то, что пережевал обратно:

Код
   \   00000064   8300               ST      Z, R16
   \   00000066   8311               STD     Z+1, R17
   \   00000068   8322               STD     Z+2, R18
   \   0000006A   8333               STD     Z+3, R19


Что и как он там насчитал, меня мало интересует, но факт остается фактом, насчитал он не правильно


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 20 2006, 19:29
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Dec 20 2006, 18:05) *
Я смотрел, и не раз, пожалуйста, c чуйством глубокохо удовлетворения привожу листинг, смотрите:
Код
   \                     ??PULSE_SENS_CorrectTime_0:
   \   00000028   01A8               MOVW    R21:R20, R17:R16
   \   0000002A   9556               LSR     R21
   \   0000002C   9547               ROR     R20
   \   0000002E   E060               LDI     R22, 0
   \   00000030   0189               MOVW    R17:R16, R19:R18
   \   00000032   01C8               MOVW    R25:R24, R17:R16
   \   00000034   EE08               LDI     R16, 232
   \   00000036   E013               LDI     R17, 3
   \   00000038   E020               LDI     R18, 0
   \   0000003A   E030               LDI     R19, 0
   \   0000003C   9F19               MUL     R17, R25
   \   0000003E   0D20               ADD     R18, R0
   \   00000040   1D31               ADC     R19, R1
   \   00000042   9F18               MUL     R17, R24
   \   00000044   2D10               MOV     R17, R0
   \   00000046   0D21               ADD     R18, R1
   \   00000048   1F36               ADC     R19, R22
   \   0000004A   9F09               MUL     R16, R25
   \   0000004C   0D10                       ADD     R17, R0
   \   0000004E   1D21               ADC     R18, R1
   \   00000050   1F36               ADC     R19, R22
   \   00000052   9F08               MUL     R16, R24
   \   00000054   2D00               MOV     R16, R0
   \   00000056   0D11               ADD     R17, R1
   \   00000058   1F26               ADC     R18, R22
   \   0000005A   1F36               ADC     R19, R22
   \   0000005C   0F04               ADD     R16, R20
   \   0000005E   1F15               ADC     R17, R21
   \   00000060   1F26               ADC     R18, R22
   \   00000062   1F36               ADC     R19, R22

Prottoss
Не поленился, проверил Ваш код
сначала в голове, затем на симуляторе
Так вот: Компилятор сделал РОВНО ТО, ЧТО ВЫ У НЕГО ПОПРОСИЛИ !!!

Так что исчите апщибку в логике работы программы.

Да, кстати, присоединяюсь к
Цитата
И, кстати, это так ведь задумано - при каждом вызове функции портить Pulse->Time?

скорее всего именно здесь собака порылась
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 20 2006, 20:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(singlskv @ Dec 20 2006, 23:29) *
Prottoss
Не поленился, проверил Ваш код
сначала в голове, затем на симуляторе
Так вот: Компилятор сделал РОВНО ТО, ЧТО ВЫ У НЕГО ПОПРОСИЛИ !!!
Так что исчите апщибку в логике работы программы.
Да, кстати, присоединяюсь к
Цитата

И, кстати, это так ведь задумано - при каждом вызове функции портить Pulse->Time?

скорее всего именно здесь собака порылась
Какая все же ошибка? Объясните не разумному?



2 Oldring - функция вызывается после того, как прерывания запрещены. После всех вычислений прерывания разрешаются.



В первом случае я возвращаю результат из функции и он правильный, во втором случае я возвращаю результат в указатель и результат, в итоге, не правильный


--------------------
Go to the top of the page
 
+Quote Post
Oldring
сообщение Dec 20 2006, 20:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(prottoss @ Dec 20 2006, 20:04) *
В первом случае я возвращаю результат из функции и он правильный, во втором случае я возвращаю результат в указатель и результат, в итоге, не правильный


Ключевое слово - "в итоге". Так найдите то место, в котором результат в конце концов портится. Судя по тому, что, как Вы пишете, код вычисления выражения одинаковый - и результат сразу после вычисления выражения одинаковый. Так что ищите глюк где-то в другом месте.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sergio66   Ошибка IAR или чтото еще?   Dec 18 2006, 12:47
- - aesok   Показывайте код.   Dec 18 2006, 13:06
|- - Sergio66   Цитата(aesok @ Dec 18 2006, 13:06) Показы...   Dec 18 2006, 13:15
|- - _Bill   Цитата(Sergio66 @ Dec 18 2006, 13:15) Вот...   Dec 18 2006, 14:48
|- - Sergio66   Цитата(_Bill @ Dec 18 2006, 14:48) Цитата...   Dec 18 2006, 15:01
||- - aesok   Опишите проблемму полностью: Как переменые и стру...   Dec 18 2006, 15:18
||- - Dog Pawlowa   Цитата(Sergio66 @ Dec 18 2006, 15:01) А ч...   Dec 18 2006, 15:28
||- - Sergio66   Цитата(Dog Pawlowa @ Dec 18 2006, 15:28) ...   Dec 18 2006, 15:44
||- - prottoss   Цитата(Dog Pawlowa @ Dec 18 2006, 19:28) ...   Dec 18 2006, 15:45
||- - Dog Pawlowa   Цитата(prottoss @ Dec 18 2006, 15:45) Ска...   Dec 18 2006, 16:46
||- - prottoss   Цитата(Dog Pawlowa @ Dec 18 2006, 20:46) ...   Dec 18 2006, 17:08
||- - Dog Pawlowa   Цитата(prottoss @ Dec 18 2006, 17:08) Цит...   Dec 18 2006, 18:48
||- - Oldring   Цитата(Dog Pawlowa @ Dec 18 2006, 18:48) ...   Dec 18 2006, 19:08
||- - singlskv   Цитата(Oldring @ Dec 18 2006, 19:08) Дело...   Dec 18 2006, 19:31
||- - _Bill   Цитата(Oldring @ Dec 18 2006, 19:08) Цита...   Dec 20 2006, 15:06
||- - Oldring   Цитата(_Bill @ Dec 20 2006, 15:06) Код b ...   Dec 20 2006, 16:30
|- - Oldring   Цитата(_Bill @ Dec 18 2006, 14:48) Ну, та...   Dec 18 2006, 17:27
- - singlskv   Цитата(Sergio66 @ Dec 18 2006, 12:47) Сто...   Dec 18 2006, 16:11
- - Oldring   Ответ прост. До тех пор, пока результат вычисления...   Dec 18 2006, 19:38
|- - singlskv   Цитата(Oldring @ Dec 18 2006, 19:38) Отве...   Dec 18 2006, 19:53
|- - Dog Pawlowa   Цитата(Oldring @ Dec 18 2006, 19:38) Отве...   Dec 18 2006, 20:31
|- - Oldring   Цитата(Dog Pawlowa @ Dec 18 2006, 20:23) ...   Dec 18 2006, 20:37
|- - prottoss   Цитата(Dog Pawlowa @ Dec 19 2006, 00:31) ...   Dec 18 2006, 20:43
|- - Oldring   Цитата(prottoss @ Dec 18 2006, 20:43) Выр...   Dec 18 2006, 21:14
|- - singlskv   Цитата(prottoss @ Dec 18 2006, 20:43) Выр...   Dec 18 2006, 21:18
|- - Dog Pawlowa   Цитата(prottoss @ Dec 18 2006, 20:43) Вы ...   Dec 19 2006, 09:49
|- - Sergio66   [/quote] Дуру? Отчасти А на конкретный вопрос -...   Dec 19 2006, 11:57
|- - Oldring   Цитата(Sergio66 @ Dec 19 2006, 11:57) Рез...   Dec 19 2006, 14:44
||- - Sergio66   Цитата(Oldring @ Dec 19 2006, 15:44) Цита...   Dec 19 2006, 15:15
||- - Dog Pawlowa   Цитата(Sergio66 @ Dec 19 2006, 15:15) Да ...   Dec 19 2006, 19:10
|- - Dog Pawlowa   Цитата(Sergio66 @ Dec 19 2006, 11:57) Был...   Dec 19 2006, 19:24
- - Oldring   Не совсем. 1. Включение оптимизации самой по себе...   Dec 18 2006, 20:08
- - GDI   Была у меня похожая проблема, правда, у меня порти...   Dec 19 2006, 13:32
- - singlskv   автар продемонстрируйте свое искуство, так сказать...   Dec 19 2006, 19:18
- - Oldring   int расширяется до long до умножения. Потом должна...   Dec 19 2006, 19:50
|- - Sergio66   Цитата(Oldring @ Dec 19 2006, 19:50) int ...   Dec 20 2006, 13:33
|- - Oldring   Цитата(Sergio66 @ Dec 20 2006, 13:33) 1. ...   Dec 20 2006, 14:13
- - Serg79   Sergio66 Ты сдесь воду то не баламуть а приведи но...   Dec 20 2006, 15:22
- - prottoss   Пока Sergio66 молчит, задам я свой вопрос, потому ...   Dec 20 2006, 16:15
|- - prottoss   Цитата(Oldring @ Dec 21 2006, 00:09) Ключ...   Dec 20 2006, 20:23
- - Oldring   Чтобы не напрягать попусту наши извилины скомпилир...   Dec 20 2006, 18:57
|- - prottoss   Цитата(Oldring @ Dec 20 2006, 22:57) Чтоб...   Dec 20 2006, 19:12
- - Oldring   Замечательно, где еще прописывается значение Pulse...   Dec 20 2006, 19:19
|- - prottoss   Цитата(Oldring @ Dec 20 2006, 23:19) Заме...   Dec 20 2006, 19:26
- - Oldring   Я конечно имел в виду дизассемблер, в котором изме...   Dec 20 2006, 19:28
- - Oldring   Да, не забудьте убедиться, что функция после преры...   Dec 20 2006, 19:34
- - Oldring   Пожалуйста, приведите два варианта кода отдельно -...   Dec 20 2006, 20:28
|- - prottoss   Цитата(Oldring @ Dec 21 2006, 00:28) Пожа...   Dec 20 2006, 20:43
- - Oldring   Ну так а когда в нерабочем варианте вызывается фун...   Dec 20 2006, 20:45
|- - prottoss   Цитата(Oldring @ Dec 21 2006, 00:45) Ну т...   Dec 20 2006, 20:53
- - Oldring   Только этот вариант все равно не должен компилиров...   Dec 20 2006, 21:02
|- - prottoss   Цитата(Oldring @ Dec 21 2006, 01:02) Толь...   Dec 21 2006, 17:09
|- - Dog Pawlowa   Цитата(prottoss @ Dec 21 2006, 17:09) Все...   Dec 21 2006, 17:39
||- - prottoss   Цитата(Dog Pawlowa @ Dec 21 2006, 21:39) ...   Dec 21 2006, 18:04
||- - Dog Pawlowa   Цитата(prottoss @ Dec 21 2006, 18:04) А в...   Dec 21 2006, 18:44
||- - prottoss   Цитата(Dog Pawlowa @ Dec 21 2006, 22:44) ...   Dec 21 2006, 19:02
||- - defunct   Цитата(prottoss @ Dec 21 2006, 19:02) Да ...   Dec 21 2006, 20:33
||- - Serg79   Цитата(defunct @ Dec 21 2006, 20:33) Насч...   Dec 22 2006, 13:29
||- - prottoss   Цитата(defunct @ Dec 22 2006, 00:33) Цита...   Dec 22 2006, 14:57
||- - defunct   Цитата(prottoss @ Dec 22 2006, 14:57) Что...   Dec 22 2006, 16:20
||- - Wild007   2 defunct ЦитатаВы ставите в противовес JTAG...   Dec 22 2006, 17:02
||- - prottoss   Цитата(defunct @ Dec 22 2006, 20:20) Цита...   Dec 22 2006, 17:05
||- - defunct   Цитата(prottoss @ Dec 22 2006, 17:05) Чит...   Dec 22 2006, 17:25
|- - singlskv   Цитата(prottoss @ Dec 21 2006, 17:09) Уве...   Dec 21 2006, 19:47
- - WHALE   [/quote] В начале программы забивайте весь отведен...   Dec 21 2006, 22:05
- - singlskv   Цитата(WHALE @ Dec 21 2006, 22:05) Цитата...   Dec 21 2006, 22:14


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01554 секунд с 7
ELECTRONIX ©2004-2016