Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: деление "long long" в IAR 3.10
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Alechin
Читал в Интернете о проблемах с long long.
В какой версии они исправлены (и исправлены ли вообще), как это обойти?
У меня 4.10А.
Умножает правильно, деление не верное.
IgorKossak
Приведите пример неправильного деления, проверю на v4.20a
Alechin
Вчера потратил пару часов на изучение листинга и map файла.
Выяснил вот что:
все заработало, если выставить галку в настройках компилятора "Place string literals and constant in initialized RAM". При этом константа, на которую я умножаю (1000 в моем случае) хранится в сегменте RAM NEAR_I, при старте инициализируется из FLASH NEAR_ID.
Если эту галку убрать - константа хранится в RAM в сегменте NEAR_C. Хотя в симуляторе она есть в RAM и там и там.
Да и вообще, если убрать последующее деление - умножение работает.
В общем до конца так и не понял.
Для примера кладу выдержки из листинга и map файла для обеих случаев.

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


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

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

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

А насчет "не в компиляторе" - нет времени детально разбираться - проект большой - десятка три файлов, более МБайта исходников. Просто сложно "выбрать" все лишнее: например в основном проекте несколько констант long в операциях с long long - и компиляция проходит. А в тестовом, что я сделал при добавлении второй константы появляется ошибка, что в сегменте NEAR_C нет места, хотя файл линекера один в обоих вариантах. И т.п.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.