Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR AVR: Константы модуля math.h не расположить в flash memory
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Target
IgorKossak, поиск не помог, про гугль знаю, про яндекс тоже. Чем закрывать тему, лучше помоги.

После компиляции этого кусочка константы модуля math.h оказываются в сегменте DATA. К этим константам нет доступа, и я не могу дописать к ним __flash.
Не помогает и убирание галочки "Place constants and literals in initialized RAM". После снятия пытался переназначить сегмент NEAR_C, как советовали в поиске, однако это не помогло, и константы продолжают находиться в сегменте DATA.

Код
#include <math.h>

double c, b;

int main()
{
  
  b = 0.1;
  c = atan(b);
  
  if (c > 0)
    c = 0.2;
  
  return 0;
}


Кто-нибудь может посмотреть приложенный проект и посмотреть, в чем может быть дело? Он совсем небольшой (7 килобайт).
В отладчике можно искать __Constant_0_be400000 , которая должна быть в CODE, а не в DATA.
SasaVitebsk
А с чего вы это взяли? Я что-то не пойму. О каких константах идёт речь?????
Я тупо откомпилировал вашу программу.
Вижу у себя 104 байта в сегменте DATA.
Из них две переменных b и c + стеки + 2 сегмента NEAR_I и NEAR_Z.
И что вас не устраивает. Поясните.
rezident
Пример дурацкий. Нет там ни констант, ни какого-либо смысла в такой программе. Оптимизатор имеет право вообще сократить бы ее до __call main, а в main сразу же return.
SasaVitebsk
Ну это я уже опускаю, хотя это очевидно.
Сергей Борщ
QUOTE (Target @ Apr 7 2011, 11:09) *
После компиляции этого кусочка константы модуля math.h оказываются в сегменте DATA. К этим константам нет доступа, и я не могу дописать к ним __flash.
Поймите одну простую вещь - AVR имеет разные адресные пространства. И для доступа к данным в разных адресных пространствах нужно использовать разные ассемблерные команды. Даже если вы запихнете эти константы во флеш, библиотечная функция atan будет искать их в ОЗУ и обращаться за ними будет в ОЗУ, потому что команды доступа вшиты в библиотеку (.d90) на этапе компиляции библиотеки. Чтобы библиотека обращалась во флеш нужно подправить и перекомпилировать исходники библиотеки, которых у вас, вероятнее всего, нет.
Target
Цитата(SasaVitebsk @ Apr 7 2011, 12:44) *
А с чего вы это взяли? Я что-то не пойму. О каких константах идёт речь?????
Я тупо откомпилировал вашу программу.
Вижу у себя 104 байта в сегменте DATA.
Из них две переменных b и c + стеки + 2 сегмента NEAR_I и NEAR_Z.
И что вас не устраивает. Поясните.


Константы модуля math.h. У меня после компиляции в сегмента DATA (микроконтроллерный SRAM) сидит еще куча констант вроде той, что я указал. Это видно в отладчике.

Цитата(Сергей Борщ @ Apr 7 2011, 13:06) *
Чтобы библиотека обращалась во флеш нужно подправить и перекомпилировать исходники библиотеки, которых у вас, вероятнее всего, нет.


Спасибо за ответ. То есть шансов, что библиотека будет их считывать из flash нет?
SasaVitebsk
Цитата(Target @ Apr 7 2011, 12:17) *
Константы модуля math.h. У меня после компиляции в сегмента DATA (микроконтроллерный SRAM) сидит еще куча констант вроде той, что я указал. Это видно в отладчике.
....
Спасибо за ответ. То есть шансов, что библиотека будет их считывать из flash нет?

Ещё раз повторяю. В сегменте DATA нет никаких констант. Я их не вижу. Я вам перечислил всё что там есть.
Библиотека MATCH использует, согласно моей распечатке map файла сегмент NEAR_I. Ну и что?
Target
Цитата(SasaVitebsk @ Apr 7 2011, 13:57) *
Ещё раз повторяю. В сегменте DATA нет никаких констант. Я их не вижу. Я вам перечислил всё что там есть.
Библиотека MATCH использует, согласно моей распечатке map файла сегмент NEAR_I. Ну и что?


Интересно. Вы компилировали мой проект без изменений? Можете заархивировать его и вложить сюда, чтобы я посмотрел на результаты компиляции?
SasaVitebsk
Да ваш проект, если это можно назвать таким словом. К чему вы выбрали C++?
Просмотрите сами и вышлите map файл после вашей компиляции. Всё увидите сами.
Ваша библиотека использует оперативку. Так она описана. Она вообще возможно на асме писана. А вы пытаетесь что-то там поменять.
Всего используется 104 байта памяти. При этом ваших там 8 + 2 стека и 2 сегмента библиотеки ощим колличеством 28 байт.
Если в выборе библиотеки выбрать CLIB, то памяти вообще использоваться не будет. Только 8 байт.
У меня компилятор стоит более древний, поэтому архив я вам не вышлю.
===
И ещё если задаёте вопрос указывайте версию компилятора и камень.
Target
Цитата(SasaVitebsk @ Apr 7 2011, 16:24) *
И ещё если задаёте вопрос указывайте версию компилятора и камень.


А вот он. Mega128
SasaVitebsk
А версия компилятора?
Target
Цитата(SasaVitebsk @ Apr 7 2011, 19:38) *
А версия компилятора?

5.50
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.