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

 
 
> деление "long long" в IAR 3.10, Не верно делит long long
Alechin
сообщение Oct 30 2006, 14:36
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Читал в Интернете о проблемах с long long.
В какой версии они исправлены (и исправлены ли вообще), как это обойти?
У меня 4.10А.
Умножает правильно, деление не верное.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
IgorKossak
сообщение Oct 31 2006, 07:33
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Приведите пример неправильного деления, проверю на v4.20a
Go to the top of the page
 
+Quote Post
Alechin
сообщение Nov 1 2006, 05:54
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Вчера потратил пару часов на изучение листинга и map файла.
Выяснил вот что:
все заработало, если выставить галку в настройках компилятора "Place string literals and constant in initialized RAM". При этом константа, на которую я умножаю (1000 в моем случае) хранится в сегменте RAM NEAR_I, при старте инициализируется из FLASH NEAR_ID.
Если эту галку убрать - константа хранится в RAM в сегменте NEAR_C. Хотя в симуляторе она есть в RAM и там и там.
Да и вообще, если убрать последующее деление - умножение работает.
В общем до конца так и не понял.
Для примера кладу выдержки из листинга и map файла для обеих случаев.

Чегой-то файлы не добавились?! Как это сделать то?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2006, 08:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alechin @ Nov 1 2006, 07:54) *
Для примера кладу выдержки из листинга и map файла для обеих случаев.
Лучше отрывок исходного кода. Пока совершенно не понятно что и как не работает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arttab
сообщение Nov 1 2006, 08:19
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата
Чегой-то файлы не добавились?! Как это сделать то?


расширение zip попробуйте. есть ограничения


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Alechin
сообщение Nov 1 2006, 14:14
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Весь проект слишком большой, вычленить из него данный фрагмент сложно.
Попробовал сделать отдельный проект где только этот фрагмент - там все нормально.
Сейчас еще поковырялся и вижу, что отличие только в том, что в варианте размещения в NEAR_C (неработающий) RAM (данная ее часть) не инициализируется при low_level_init.
Но при входе в симулятор туда загружены верные значения! Я делаю ресет, стираю их из памяти, становлюсь на вектор сброса и вперед. Дохожу до main - а они не проинициализированы.

Объявил константу, умножение на которую не проходит как static __flash - и все стало нормально.
Так что проблема видимо в неинициализации данной константы.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2006, 14:28
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alechin @ Nov 1 2006, 16:14) *
Весь проект слишком большой, вычленить из него данный фрагмент сложно.
Попробовал сделать отдельный проект где только этот фрагмент - там все нормально.
Значит, с большой долей вероятности, виноват не компилятор.
Цитата(Alechin @ Nov 1 2006, 16:14) *
Сейчас еще поковырялся и вижу, что отличие только в том, что в варианте размещения в NEAR_C (неработающий) RAM (данная ее часть) не инициализируется при low_level_init.
А какое значение возвращает __low_level_init()? Если он возвращает 0, то инициализация памяти не происходит, если 1 - должна происходить.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alechin
сообщение Nov 1 2006, 19:34
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Цитата
А какое значение возвращает __low_level_init()? Если он возвращает 0, то инициализация памяти не происходит, если 1 - должна происходить.

Единицу. Далее идет инициализация (вроде __segment_init) - там много разных переменных инициализируется. Но конкретно этих (этого сегмента) нет.
Да черт с ним - выкрутился и ладно.

А насчет "не в компиляторе" - нет времени детально разбираться - проект большой - десятка три файлов, более МБайта исходников. Просто сложно "выбрать" все лишнее: например в основном проекте несколько констант long в операциях с long long - и компиляция проходит. А в тестовом, что я сделал при добавлении второй константы появляется ошибка, что в сегменте NEAR_C нет места, хотя файл линекера один в обоих вариантах. И т.п.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:04
Рейтинг@Mail.ru


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