haker_fox 92 August 24, 2023 Posted August 24, 2023 · Report post 2 minutes ago, vit496 said: изменяемую volatile добавляет ей rw? Обыскался в инете, не могу найти прямого подтверждения этому(( 2 minutes ago, vit496 said: int32_t x = *(__IO uint32_t*) 0x08001000; Попробую! Спасибо! Quote Share this post Link to post Share on other sites More sharing options...
vit496 0 August 24, 2023 Posted August 24, 2023 · Report post 3 minutes ago, haker_fox said: volatile добавляет ей rw? отсутствие const Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 August 24, 2023 Posted August 24, 2023 · Report post 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? Разумеется, нет. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 92 August 24, 2023 Posted August 24, 2023 · Report post 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: Разумеется, нет. Тогда я не знаю, что её заставляет укладываться в ОЗУ... Quote Share this post Link to post Share on other sites More sharing options...
vit496 0 August 24, 2023 Posted August 24, 2023 · Report post 5 minutes ago, Arlleex said: Нет. Да, с нулем конечно неудачный пример. uint32_t arr[] = { 1, 2, 3, 4 } - разместит во FLASH 1,2,3,4, при инициализации переложит в ОЗУ. Quote Share this post Link to post Share on other sites More sharing options...
pyroman 2 August 24, 2023 Posted August 24, 2023 · Report post 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; Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 August 24, 2023 Posted August 24, 2023 · Report post Только что, pyroman сказал: http://microsin.net/programming/arm/iar40-absolute-location-placement.html Топик читали? Quote Share this post Link to post Share on other sites More sharing options...
MrYuran 34 August 24, 2023 Posted August 24, 2023 · Report post Quote Там ни одна функция читает из этой константы... Да и хочу уже понять, а что такое происходит. Это же мой профессиональный рост... Профессиональный рост - это когда растет количество подчиненных ) А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC. С дублированием в параллельном сегменте Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 92 August 24, 2023 Posted August 24, 2023 · Report post Посмотрел листинг. Если 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 Спасибо за наставления, конечно, но к делу это отношения не имеет😀 Quote Share this post Link to post Share on other sites More sharing options...
vit496 0 August 24, 2023 Posted August 24, 2023 · Report post А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? Вроде как не даст компилятор такое сделать? calInfo.general.calibrated = 1 Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 August 24, 2023 Posted August 24, 2023 · Report post 9 минут назад, MrYuran сказал: Профессиональный рост - это когда растет количество подчиненных ) А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC. С дублированием в параллельном сегменте Как-то сложно. Особенно, когда надо считать быстро, на основе параметров из таблицы. Обычно контрольные суммы валидируются один раз, где-то вначале, а то и вовсе в загрузчике вместе с контролем прошивки)) Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 92 August 24, 2023 Posted August 24, 2023 · Report post 2 minutes ago, vit496 said: А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий. P.S. Забить на всё. Сдать проект с отключенной оптимизацией. там кода чуть-чуть. Это датчик... Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 August 24, 2023 Posted August 24, 2023 · Report post 10 минут назад, haker_fox сказал: Посмотрел листинг. Если calInfo расположена в ОЗУ, что, конечно же неправильно, то данные переменной читаются и, что главное, учитываются! Это когда volatile у структуры есть? Тогда это логично. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 92 August 24, 2023 Posted August 24, 2023 · Report post Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает! Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 August 24, 2023 Posted August 24, 2023 · Report post 8 минут назад, vit496 сказал: А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? calInfo.general.calibrated = 1 u32 volatile const *reg = (u32 volatile const *)0x12345678; reg - регистр процессора, который можно только читать. Цитата Вроде как не даст компилятор такое сделать? Компилятор, слава богу, знать не знает о методах прошивки Flash. 3 минуты назад, haker_fox сказал: Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает! Потому что это не оптимизация компилятора, а оптимизация линковки. Структура, по-прежнему, выкинута из памяти. В IAR есть атрибут used при размещении? Quote Share this post Link to post Share on other sites More sharing options...