haker_fox 61 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 2 minutes ago, vit496 said: изменяемую volatile добавляет ей rw? Обыскался в инете, не могу найти прямого подтверждения этому(( 2 minutes ago, vit496 said: int32_t x = *(__IO uint32_t*) 0x08001000; Попробую! Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vit496 0 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 3 minutes ago, haker_fox said: volatile добавляет ей rw? отсутствие const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 8 минут назад, vit496 сказал: const uint32_t a = 0; - разместит во FLASH Только если глобальная. Цитата uint32_t b = 0; - разместит во FLASH, при инициализации переложит в ОЗУ Нет. Цитата Вы хотите заставить компилятор разместить изменяемую переменную во FLASH. Вряд ли это получится. И опять нет. Цитата uint32_t x = *(__IO uint32_t*) 0x08001000; Нельзя так делать. Метод костылей, который развалится от первого чиха. + вероятность полного выкидывания размещения структуры в ROM/RAM/где угодно, если не принудить атрибутом used. 6 минут назад, haker_fox сказал: volatile добавляет ей rw? Разумеется, нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 3 minutes ago, vit496 said: отсутствие const Ничего не меняет( // header volatile const CalInfo calInfo @ ".calInfo" { // map calInfo 0x2000'0000 0x200c Data Lc main.o [1] 3 minutes ago, Arlleex said: Разумеется, нет. Тогда я не знаю, что её заставляет укладываться в ОЗУ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vit496 0 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 5 minutes ago, Arlleex said: Нет. Да, с нулем конечно неудачный пример. uint32_t arr[] = { 1, 2, 3, 4 } - разместит во FLASH 1,2,3,4, при инициализации переложит в ОЗУ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба http://microsin.net/programming/arm/iar40-absolute-location-placement.html В следующих примерах определены два объекта const, где первый инициализирован в 0, и второй инициализирован в указанное значение. Оба объекта будут размещены в ROM (FLASH). Это полезно для конфигурационных параметров, к которым планируется осуществлять доступ через некий внешний интерфейс. Обратите внимание на то, что во втором случае компилятор не обязан фактически читать из переменной, потому что её значение заранее известно. Чтобы обеспечить принудительное чтение компилятором переменной, определите её как volatile: #pragma location=0x1004 volatile const int beta; volatile const int gamma @ 0x1008 = 3; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба Только что, pyroman сказал: http://microsin.net/programming/arm/iar40-absolute-location-placement.html Топик читали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 25 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба Quote Там ни одна функция читает из этой константы... Да и хочу уже понять, а что такое происходит. Это же мой профессиональный рост... Профессиональный рост - это когда растет количество подчиненных ) А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC. С дублированием в параллельном сегменте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба Посмотрел листинг. Если calInfo расположена в ОЗУ, что, конечно же неправильно, то данные переменной читаются и, что главное, учитываются! 322 s_calLed::set(!isCalibrated()); \ ??main_12: (+1) \ 0x5A2 0x.... LDR R1,??DataTable2_14 \ 0x5A4 0x7A08 LDRB R0,[R1, #+8] \ 0x5A6 0x2800 CMP R0,#+0 \ 0x5A8 0xD002 BEQ ??main_33 \ 0x5AA 0x2080 MOVS R0,#+128 \ 0x5AC 0x03C0 LSLS R0,R0,#+15 \ 0x5AE 0xE000 B ??main_34 \ ??main_33: (+1) \ 0x5B0 0x2040 MOVS R0,#+64 \ ??main_34: (+1) \ 0x5B2 0x2290 MOVS R2,#+144 \ 0x5B4 0x05D2 LSLS R2,R2,#+23 \ 0x5B6 0x6190 STR R0,[R2, #+24] 1 minute ago, MrYuran said: Профессиональный рост - это когда растет количество подчиненных ) А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC Спасибо за наставления, конечно, но к делу это отношения не имеет😀 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vit496 0 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? Вроде как не даст компилятор такое сделать? calInfo.general.calibrated = 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 9 минут назад, MrYuran сказал: Профессиональный рост - это когда растет количество подчиненных ) А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC. С дублированием в параллельном сегменте Как-то сложно. Особенно, когда надо считать быстро, на основе параметров из таблицы. Обычно контрольные суммы валидируются один раз, где-то вначале, а то и вовсе в загрузчике вместе с контролем прошивки)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 2 minutes ago, vit496 said: А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий. P.S. Забить на всё. Сдать проект с отключенной оптимизацией. там кода чуть-чуть. Это датчик... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 10 минут назад, haker_fox сказал: Посмотрел листинг. Если calInfo расположена в ОЗУ, что, конечно же неправильно, то данные переменной читаются и, что главное, учитываются! Это когда volatile у структуры есть? Тогда это логично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 24 августа, 2023 Опубликовано 24 августа, 2023 · Жалоба 8 минут назад, vit496 сказал: А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? calInfo.general.calibrated = 1 u32 volatile const *reg = (u32 volatile const *)0x12345678; reg - регистр процессора, который можно только читать. Цитата Вроде как не даст компилятор такое сделать? Компилятор, слава богу, знать не знает о методах прошивки Flash. 3 минуты назад, haker_fox сказал: Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает! Потому что это не оптимизация компилятора, а оптимизация линковки. Структура, по-прежнему, выкинута из памяти. В IAR есть атрибут used при размещении? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться