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

 
 
> Ошибка 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
Ответов
aesok
сообщение Dec 18 2006, 13:06
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Показывайте код.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Dec 18 2006, 13:15
Сообщение #3


Местный
***

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



Цитата(aesok @ Dec 18 2006, 13:06) *
Показывайте код.


Вот такой код:
unsigned long int temp = INJ_time * data_temp_struct.FREQ * PRODUCTIVITY / 20000;
тип INJ_time - unsigned long int. Эта переменная локальная.
PRODUCTIVITY - константа
Так вот, переменная temp размещалась компилятором в регистрах и все было плохо

Теперь я переменную temp сделал членом локальной структуры data_temp_struct
Т.о. она стала размещаться в памяти а не в регистрах. Вот с этого все и заработало.
data_temp_struct.temp = INJ_time * data_temp_struct.FREQ * PRODUCTIVITY / 20000;
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 18 2006, 14:48
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Sergio66 @ Dec 18 2006, 13:15) *
Вот такой код:
unsigned long int temp = INJ_time * data_temp_struct.FREQ * PRODUCTIVITY / 20000;
тип INJ_time - unsigned long int. Эта переменная локальная.
PRODUCTIVITY - константа
Так вот, переменная temp размещалась компилятором в регистрах и все было плохо

Теперь я переменную temp сделал членом локальной структуры data_temp_struct
Т.о. она стала размещаться в памяти а не в регистрах. Вот с этого все и заработало.
data_temp_struct.temp = INJ_time * data_temp_struct.FREQ * PRODUCTIVITY / 20000;

Ну, так все правильно. Компилятор перед генерацией производит свертку констант, т.е. вычисляет значение PRODUCTIVITY / 20000. Естественно, оно будет вычисленно неточно. Поставьте в выражении скобки в нужных местах. Еще советую объявить константы как long, тогда погрешность в вычислении уменьшится.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Dec 18 2006, 15:01
Сообщение #5


Местный
***

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



Цитата(_Bill @ Dec 18 2006, 14:48) *
Цитата(Sergio66 @ Dec 18 2006, 13:15) *

Вот такой код:
unsigned long int temp = INJ_time * data_temp_struct.FREQ * PRODUCTIVITY / 20000;
тип INJ_time - unsigned long int. Эта переменная локальная.
PRODUCTIVITY - константа
Так вот, переменная temp размещалась компилятором в регистрах и все было плохо

Теперь я переменную temp сделал членом локальной структуры data_temp_struct
Т.о. она стала размещаться в памяти а не в регистрах. Вот с этого все и заработало.
data_temp_struct.temp = INJ_time * data_temp_struct.FREQ * PRODUCTIVITY / 20000;

Ну, так все правильно. Компилятор перед генерацией производит свертку констант, т.е. вычисляет значение PRODUCTIVITY / 20000. Естественно, оно будет вычисленно неточно. Поставьте в выражении скобки в нужных местах. Еще советую объявить константы как long, тогда погрешность в вычислении уменьшится.


А что, если переменная размещена не в регистрах, а в памяти, свертка констант не производится? Или это происходит как то иначе?
Я ведт ничего не поменял, просто добился иного размещения в памяти переменной!!! И никаких скобок.И без них все заработало. Нет! Дело не в этом!!!
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 18 2006, 15:28
Сообщение #6


Гуру
******

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



Цитата(Sergio66 @ Dec 18 2006, 15:01) *
А что, если переменная размещена не в регистрах, а в памяти, свертка констант не производится? Или это происходит как то иначе?
Я ведт ничего не поменял, просто добился иного размещения в памяти переменной!!! И никаких скобок.И без них все заработало. Нет! Дело не в этом!!!

Послушайте! :-)
Вам предлагают дело - записать формулу ПРАВИЛЬНО.
Разбираться в особенностях компилятора в случае неправильной записи - очень неблагодарное дело.
А еще можно начать разбираться в особенностях различных компиляторов. Путь в никуда.
Меня такие вещи давно не беспокоят - побольше скобок и преобразования типов.
И ффсе! smile.gif


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


Гуру
******

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



Цитата(Dog Pawlowa @ Dec 18 2006, 19:28) *
Послушайте! :-)
Вам предлагают дело - записать формулу ПРАВИЛЬНО.
Разбираться в особенностях компилятора в случае неправильной записи - очень неблагодарное дело.
А еще можно начать разбираться в особенностях различных компиляторов. Путь в никуда.
Меня такие вещи давно не беспокоят - побольше скобок и преобразования типов.
И ффсе! smile.gif
Сказанно, если размещать переменную локально, не вычисляется, если глобально - вычислятся - при чем тут скобки???


--------------------
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 18 2006, 16:46
Сообщение #8


Гуру
******

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



Цитата(prottoss @ Dec 18 2006, 15:45) *
Сказанно, если размещать переменную локально, не вычисляется, если глобально - вычислятся - при чем тут скобки???

1. Было сказано так "побольше скобок И ПРЕОБРАЗОВАНИЯ ТИПОВ".
2. Ообще-тоавтор он мог бы разместить здесь ассемблерный текст и гадание на гуще не состоялось бы.
2. Видел подобный случай - я работал под IAR, клиент стал компилировать под ICC. Результат усреднения значений АЦП считался по разному. Именно из-за особенностей работы компилятора в случае некорректного написания программы. И что? И ничего.


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


Гуру
******

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



Цитата(Dog Pawlowa @ Dec 18 2006, 20:46) *
Цитата(prottoss @ Dec 18 2006, 15:45) *

Сказанно, если размещать переменную локально, не вычисляется, если глобально - вычислятся - при чем тут скобки???

1. Было сказано так "побольше скобок И ПРЕОБРАЗОВАНИЯ ТИПОВ".
Это было сказанно, вернее посоветованна, Вами, и товарищем aesok. Смысл же вопроса автора топика был именно в том, что сказал я - если размещать переменную локально, не вычисляется, если глобально - вычислятся , при чем здесь cкобки, позвольте? У меня, в данный момент, есть тоже подобный фокус в программе, которой сейчас занимаюсь. Если обсуждаемая сдесь проблема не решится, поделюсь своей...


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sergio66   Ошибка IAR или чтото еще?   Dec 18 2006, 12:47
- - aesok   Показывайте код.   Dec 18 2006, 13:06
||- - aesok   Опишите проблемму полностью: Как переменые и стру...   Dec 18 2006, 15:18
||- - Sergio66   Цитата(Dog Pawlowa @ Dec 18 2006, 15:28) ...   Dec 18 2006, 15:44
||- - 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   Мда... Умные речи о значимости скобок не помогли.....   Dec 20 2006, 17:32
|- - Dog Pawlowa   Цитата(prottoss @ Dec 20 2006, 17:32) Мда...   Dec 20 2006, 17:54
|- - prottoss   Цитата(Dog Pawlowa @ Dec 20 2006, 21:54) ...   Dec 20 2006, 18:05
|- - singlskv   Цитата(prottoss @ Dec 20 2006, 18:05) Я с...   Dec 20 2006, 19:29
|- - prottoss   Цитата(singlskv @ Dec 20 2006, 23:29) Pro...   Dec 20 2006, 20:04
|- - Oldring   Цитата(prottoss @ Dec 20 2006, 20:04) В п...   Dec 20 2006, 20:09
|- - 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 Текстовая версия Сейчас: 20th July 2025 - 12:04
Рейтинг@Mail.ru


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