Jump to content
    

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

2 minutes ago, vit496 said:

изменяемую

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

2 minutes ago, vit496 said:

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

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

Share this post


Link to post
Share on other sites

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?

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

Share this post


Link to post
Share on other sites

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:

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

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

Share this post


Link to post
Share on other sites

5 minutes ago, Arlleex said:

Нет.

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

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

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

Quote

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

calInfo.general.calibrated = 1

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

2 minutes ago, vit496 said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

image.thumb.png.bacadd1b277a0ed921f5050c199dd351.png

Share this post


Link to post
Share on other sites

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

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

calInfo.general.calibrated = 1

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

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

 

Цитата

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...