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

IAR 9.30.1, как запретить оптимизировать чтение из FLASH?

2 minutes ago, vit496 said:

изменяемую

volatile добавляет ей rw? Обыскался в инете, не могу найти прямого подтверждения этому((

2 minutes ago, vit496 said:

int32_t x = *(__IO uint32_t*) 0x08001000;

Попробую! Спасибо!

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


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

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?

Разумеется, нет.

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


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

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:

Разумеется, нет.

Тогда я не знаю, что её заставляет укладываться в ОЗУ...

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


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

5 minutes ago, Arlleex said:

Нет.

Да, с нулем конечно неудачный пример.

uint32_t arr[] = { 1, 2, 3, 4 } - разместит во FLASH 1,2,3,4, при инициализации переложит в ОЗУ.

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


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

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;

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


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

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

Топик читали?

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


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

Quote

Там ни одна функция читает из этой константы... Да и хочу уже понять, а что такое происходит. Это же мой профессиональный рост...

Профессиональный рост - это когда растет количество подчиненных )

А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC.

С дублированием в параллельном сегменте

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


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

Посмотрел листинг. Если 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

Спасибо за наставления, конечно, но к делу это отношения не имеет😀

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


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

А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH? Вроде как не даст компилятор такое сделать?

calInfo.general.calibrated = 1

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


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

9 минут назад, MrYuran сказал:

Профессиональный рост - это когда растет количество подчиненных )

А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC.

С дублированием в параллельном сегменте

Как-то сложно. Особенно, когда надо считать быстро, на основе параметров из таблицы. Обычно контрольные суммы валидируются один раз, где-то вначале, а то и вовсе в загрузчике вместе с контролем прошивки))

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


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

2 minutes ago, vit496 said:

А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH?

Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий.

P.S. Забить на всё. Сдать проект с отключенной оптимизацией. там кода чуть-чуть. Это датчик...

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


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

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

Посмотрел листинг. Если calInfo расположена в ОЗУ, что, конечно же неправильно, то данные переменной читаются и, что главное, учитываются!

Это когда volatile у структуры есть? Тогда это логично.

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


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

Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает!

image.thumb.png.bacadd1b277a0ed921f5050c199dd351.png

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


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

8 минут назад, vit496 сказал:

А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH?

calInfo.general.calibrated = 1

u32 volatile const *reg = (u32 volatile const *)0x12345678;

reg - регистр процессора, который можно только читать.

 

Цитата

Вроде как не даст компилятор такое сделать?

Компилятор, слава богу, знать не знает о методах прошивки Flash.
 

3 минуты назад, haker_fox сказал:

Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает!

Потому что это не оптимизация компилятора, а оптимизация линковки. Структура, по-прежнему, выкинута из памяти. В IAR есть атрибут used при размещении?

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


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

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

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

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

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

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

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

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

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

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