Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 34 minutes ago, Arlleex said: Имеет право выкинуть, если не используется явно Явно обращался из нескольких функций. Не совсем понимаю , почему происходил "выкидыш". В примерах из инета было только volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 10 минут назад, Pasa сказал: Мне не нужна переменная. Почему тогда называете её переменной? 1 час назад, Pasa сказал: всячески пробовал изобразить компилятору , что эта переменная участвует во многих вычислениях. 10 минут назад, Pasa сказал: const надеюсь была видна. "разместить" - это одно, а "использовать её с этого адреса" - это другое. Выше объяснил почему. Надеюсь понятно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 44 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 minute ago, Pasa said: Явно обращался из нескольких функций. Не совсем понимаю , почему происходил "выкидыш". В примерах из инета было только volatile. Может потому что доступ к такой изменчивой переменной “implementation-defined” (Стандарт C, 6.7.3/7), т.е. как решат разработчики компилятора, так и будет. Видимо писатели IAR так решили ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 5 минут назад, dimka76 сказал: Почему это не должно работать ? Это будет работать. Но только если обращения есть. А раз она отсутствует в .map - значит обращений нет. 4 минуты назад, Pasa сказал: Явно обращался из нескольких функций. Не совсем понимаю , почему происходил "выкидыш". Значит результат работы этих функций не использовался. А значит - функция удалялась вместе с аргументом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 hour ago, jcxz said: как видно - толку от __root никакого Предложите свой вариант без __root. p.s. Ваши предыдущие предложения результата не принесли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 минуту назад, Pasa сказал: Ваши предыдущие предложения результата не принесли. Вроде я уже всё написал и предложил. Перечитайте ещё раз. А "не принесли" - может потому что вы их не поняли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 4 minutes ago, jcxz said: Значит результат работы этих функций не использовался. А значит - функция удалялась вместе с аргументом. Трудно спорить в таком вот раскладе... Ладно. Еще раз. Вызывались функции, которые обращались к данной константе, производили с с ее значением различные действия и распечатывали все это на консоли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 44 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба Для GCC оптимизация -Os Объявление const volatile uint32_t crc32 __attribute__ ((section (".crc"))) = 0xAA55AA55; Использование xprintf("%u\r\n", crc32); Объявление секции .crc : { KEEP(*(.crc)) KEEP(*(.crc*)) _image_end = .; } >FLASH map файл .crc 0x0802c720 0x4 *(.crc) .crc 0x0802c720 0x4 release/obj/main.o 0x0802c720 crc32 *(.crc*) 0x0802c724 _image_end = . 0x0802c724 . = ALIGN (0x4) Дизассемблер xprintf("%u\r\n", crc32); 802b366: 4b2a ldr r3, [pc, #168] ; (802b410 <main+0xe4>) 802b368: 482a ldr r0, [pc, #168] ; (802b414 <main+0xe8>) 802b36a: 6819 ldr r1, [r3, #0] 802b36c: f7ff fbe8 bl 802ab40 <xprintf> ...... 802b410: 0802c720 .word 0x0802c720 Как видно, чтение переменной осуществляется из памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба Только что, Pasa сказал: Трудно спорить в таком вот раскладе... Ладно. Еще раз. Вызывались функции, которые обращались к данной константе, производили с с ее значением различные действия и распечатывали все это на консоли. И не спорьте, а приведите конкретный код, при котором "выкидывалось". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 minute ago, jcxz said: Вроде я уже всё написал и предложил Ваши предложения повторяют те примеры которые я пробовал в проекте и которые описаны в первом топике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 14 minutes ago, dimka76 said: Как видно, чтение переменной осуществляется из памяти. Завтра ради интереса все "варианты" покручу в отладке. Очень заинтересовало, что в IAR явно описанная константа без __root не попадала во flash. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба Попробовал варианты на железе. Возможно эти моменты присутствуют только для IAR. Оптимизация отключена полностью. Итак: icf-файл как оказалось можно не трогать(создание регионов, секций и т.д.). в исходниках (*.c/*.h) варианты : #pragma location = 0x080E0000 __root volatile const uint32_t key_appl = 0x03020100; volatile const uint32_t key_appl = 0x03020100; const uint32_t key_appl = 0x03020100; НЕ РАБОТАЮТ!!! key_appl осутсвует в hex/map-файлах. При этом при чтении key_appl получаем 0xFFFFFFFF. Сборка проекта проходит нормально, без ошибок и предупреждений. И вот рабочий вариант: #pragma location = 0x080E0000 __root const uint32_t key_appl = 0x03020100; key_appl попадает в hex/map-файлы. При чтении key_appl получаем 0x03020100. И при чтении flash по адресу 0x080E0000 также имеем 0x03020100(это и понятно, потому что все в hex-файле). Хочу отметить, что при экспериментах с IAR важно не пропустить момент - когда key_appl "не в проекте", то IAR у меня не стирал предыдущее значение во flash по адресу 0x080E0000 . И если там от прежних вариантов оставалось значение key_appl = 0x03020100, то это приводило к эффекту key_appl = 0xFFFFFFFF, а чтение памяти возвращало 0x03020100. Для избежания этого перед прошивкой надо делать Erase Chip(J-Link). После этого результаты прошивки становятся адекватными. В результате еще раз СПАСИБО товарищу Sergey_Aleksandrovi4. p.s. откуда читается key_appl при "отсутствии в проекте" посмотрю чуть позжее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба 3 часа назад, Pasa сказал: И вот рабочий вариант: #pragma location = 0x080E0000 __root const uint32_t key_appl = 0x03020100; Это неправильный вариант. Почему - см. те листинги, что я приводил. Они как раз от IAR-а. Вас листинги, ничему не научили? Печально. Впрочем - каждый сам себе буратино. Значит наступите позже на грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба 29 minutes ago, jcxz said: Это неправильный вариант. Действительно печальная ситуация. Мне казалось что "Гуру" должен отличать совершенно разные вещи - исполнение кода(ваши любимые листинги) и генерацию выходного hex-файла с размещением в этом выходном файле заданных заранее констант. Собранный мной утром проект полностью прекрасно запустился на железе. Использование же ранее ваших "листингов" приводило к отрицательному результату. Если вышеназванные вещи тяжело вами воспринимаются - соберите тестовый проект с вашими правильными установками, посмотрите выходные hex-ы, прошейте их. Можете и здесь для остальных опубликовать свой правильный тестовый вариант. Пусть все убедятся в вашей компетентности. Заодно и я у вас "поучусь". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergey_Aleksandrovi4 1 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба Странно конечно, что мой вариант объявления переменной, но с квалификатором volatile, оказался нерабочим. Я этим способом пользовался в нескольких проектах для объявления массива констант в загрузчике. Была включена оптимизация кода по размеру, уровень не вспомню за давностью лет. Основное приложение обращалось к ним исключительно по указателю. Сам загрузчик к этим переменным никак не обращался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться