Перейти к содержанию
    

STM32407 IAR 8.50.6 разместить байты по адресу во FLASH

34 minutes ago, Arlleex said:

Имеет право выкинуть, если не используется явно

Явно обращался из нескольких функций. Не совсем понимаю , почему происходил "выкидыш". В примерах из инета было только volatile.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, Pasa сказал:

Мне не нужна переменная.

Почему тогда называете её переменной?

1 час назад, Pasa сказал:

всячески пробовал изобразить компилятору , что эта переменная участвует во многих вычислениях.

10 минут назад, Pasa сказал:

const  надеюсь была видна.

"разместить" - это одно, а "использовать её с этого адреса" - это другое. Выше объяснил почему. Надеюсь понятно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Pasa said:

Явно обращался из нескольких функций. Не совсем понимаю , почему происходил "выкидыш". В примерах из инета было только volatile.

 

Может потому что доступ к такой изменчивой переменной “implementation-defined” (Стандарт C, 6.7.3/7), т.е. как решат разработчики компилятора, так и будет.

Видимо писатели IAR так решили )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, dimka76 сказал:

Почему это не должно работать ?

Это будет работать. Но только если обращения есть. А раз она отсутствует в .map - значит обращений нет.

4 минуты назад, Pasa сказал:

Явно обращался из нескольких функций. Не совсем понимаю , почему происходил "выкидыш".

Значит результат работы этих функций не использовался. А значит - функция удалялась вместе с аргументом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

как видно - толку от __root никакого

Предложите свой вариант без __root.

p.s.

Ваши предыдущие предложения результата не принесли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Pasa сказал:

Ваши предыдущие предложения результата не принесли.

Вроде я уже всё написал и предложил. Перечитайте ещё раз.

А "не принесли" - может потому что вы их не поняли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

Значит результат работы этих функций не использовался. А значит - функция удалялась вместе с аргументом.

Трудно спорить в таком вот раскладе...

Ладно. Еще раз. Вызывались функции, которые обращались к данной константе, производили с с ее значением различные действия и распечатывали все это на консоли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для 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

Как видно, чтение переменной осуществляется из памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Pasa сказал:

Трудно спорить в таком вот раскладе...

Ладно. Еще раз. Вызывались функции, которые обращались к данной константе, производили с с ее значением различные действия и распечатывали все это на консоли.

И не спорьте, а приведите конкретный код, при котором "выкидывалось".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

Вроде я уже всё написал и предложил

Ваши предложения повторяют те примеры которые я пробовал в проекте и которые описаны в первом топике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, dimka76 said:

Как видно, чтение переменной осуществляется из памяти.

Завтра ради интереса все "варианты" покручу в отладке. Очень заинтересовало, что в IAR явно описанная константа без __root  не попадала во flash.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал варианты на железе. Возможно эти моменты присутствуют только для 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   при "отсутствии в проекте"  посмотрю чуть позжее...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Pasa сказал:

И вот рабочий вариант:

#pragma location = 0x080E0000

__root const uint32_t key_appl = 0x03020100;

Это неправильный вариант. Почему - см. те листинги, что я приводил. Они как раз от IAR-а.

Вас листинги, ничему не научили? Печально. Впрочем - каждый сам себе буратино. Значит наступите позже на грабли.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 minutes ago, jcxz said:

Это неправильный вариант.

Действительно печальная ситуация. Мне казалось  что "Гуру" должен отличать совершенно разные вещи - исполнение кода(ваши любимые листинги) и генерацию выходного hex-файла с размещением в этом выходном файле заданных заранее констант. Собранный мной утром проект полностью  прекрасно запустился на железе. Использование же ранее ваших "листингов" приводило к отрицательному результату.

Если  вышеназванные вещи тяжело вами воспринимаются - соберите тестовый проект с вашими правильными установками, посмотрите выходные hex-ы, прошейте их.

Можете и  здесь для остальных опубликовать свой правильный тестовый вариант.  Пусть все убедятся в вашей компетентности. Заодно и я у вас "поучусь".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно конечно, что мой вариант объявления переменной, но с квалификатором volatile, оказался нерабочим.

Я этим способом пользовался в нескольких проектах для объявления массива констант в загрузчике. Была включена оптимизация кода по размеру, уровень не вспомню за давностью лет. Основное приложение обращалось к ним исключительно по указателю. Сам загрузчик к этим переменным никак не обращался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...