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

 
 
> Ошибка 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
Dog Pawlowa
сообщение Dec 18 2006, 18:48
Сообщение #10


Гуру
******

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



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

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

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

Цитата(Oldring @ Dec 18 2006, 17:27) *
Цитата(Dog Pawlowa @ Dec 18 2006, 15:28) *

Вам предлагают дело - записать формулу ПРАВИЛЬНО.

Все записано правильно.
Но нужно бы еще выяснить, какие диапазоны переменных и чему точно равны константы.
Тогда мы по разному понимает слово "правильно". Я включал в это понятие учет возможности переполнения и максимальной независимости от констант. А Вы - нет? smile.gif


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


Гуру
******

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



Цитата(Dog Pawlowa @ Dec 18 2006, 18:48) *
Тогда мы по разному понимает слово "правильно". Я включал в это понятие учет возможности переполнения и максимальной независимости от констант. А Вы - нет? smile.gif


Дело в том, что Билл написал просто чепуху про "естественную" свертку целочисленных констант перед вычислением выражения, а Вашего предложения я вообще почему-то не вижу в истории переписки. Так как так и не была озвучена информация про диапазоны операндов, хотелось бы все-таки увидеть, что именно Вы считаете "правильной" записью данного выражения, если это понятие "правильности" отличется от формальной правильности. Хотелось бы также узнать Ваше мнение по следующему вопросу: существует ли с точки зрения стандарта языка программирования С какая-либо разница между выражениями

Код
a * b * c / d


и

Код
((a * b) * c)  / d


?

И, кстати, считаете ли Вы что компилятор имеет право выражение

Код
a = b * 2 / 3;


заменить на

Код
a = 0;


?


--------------------
Пишите в личку.
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
||- - 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 Текстовая версия Сейчас: 23rd July 2025 - 18:09
Рейтинг@Mail.ru


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