|
|
  |
IAR AVR: Константы модуля math.h не расположить в flash memory, не все так просто |
|
|
|
Apr 7 2011, 08:09
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691

|
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.
|
|
|
|
|
Apr 7 2011, 09:06
|

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

|
QUOTE (Target @ Apr 7 2011, 11:09)  После компиляции этого кусочка константы модуля math.h оказываются в сегменте DATA. К этим константам нет доступа, и я не могу дописать к ним __flash. Поймите одну простую вещь - AVR имеет разные адресные пространства. И для доступа к данным в разных адресных пространствах нужно использовать разные ассемблерные команды. Даже если вы запихнете эти константы во флеш, библиотечная функция atan будет искать их в ОЗУ и обращаться за ними будет в ОЗУ, потому что команды доступа вшиты в библиотеку (.d90) на этапе компиляции библиотеки. Чтобы библиотека обращалась во флеш нужно подправить и перекомпилировать исходники библиотеки, которых у вас, вероятнее всего, нет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 7 2011, 09:17
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691

|
Цитата(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 нет?
|
|
|
|
|
Apr 7 2011, 10:21
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691

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

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691

|
Цитата(SasaVitebsk @ Apr 7 2011, 16:24)  И ещё если задаёте вопрос указывайте версию компилятора и камень. А вот он. Mega128
Прикрепленные файлы
map.rar ( 6.42 килобайт )
Кол-во скачиваний: 12
|
|
|
|
|
Apr 8 2011, 04:53
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691

|
Цитата(SasaVitebsk @ Apr 7 2011, 19:38)  А версия компилятора? 5.50
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|