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

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

Интересно, какие отличия при выделение области памяти в icf файле через define region и define block?

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


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

Интересно, какие отличия при выделение области памяти в icf файле через define region и define block?
Блоки будут располагаться строго в том порядке, что программист приказал, насколько помню.

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


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

12 hours ago, jcxz said:

И никаких ошибок или варнингов при компиляции.

Сделал всё также)

Действительно, никаких ошибок или предупреждений.

Светодиод теперь зависит от состояния переменной:

Spoiler
   321          
    322              s_calLed::set(!isCalibrated());
   \                     ??main_13: (+1)
   \      0x402   0x....             LDR      R1,??DataTable2_14
   \      0x404   0x7A08             LDRB     R0,[R1, #+8]
   \      0x406   0x2800             CMP      R0,#+0
   \      0x408   0xD00E             BEQ      ??main_34
   \      0x40A   0x2080             MOVS     R0,#+128
   \      0x40C   0x03C0             LSLS     R0,R0,#+15
   \      0x40E   0xE00C             B        ??main_35
   \                     ??main_2:
   \      0x410   0xE000'E100        DC32     0xe000e100
   \      0x414   0x....'....        DC32     s_generalCal
   \      0x418   0x0003'EFD0        DC32     0x3efd0
   \      0x41C   0x0000'2198        DC32     0x2198
   \      0x420   0x0001'F7E8        DC32     0x1f7e8
   \      0x424   0x0001'4FF0        DC32     0x14ff0
   \                     ??main_34: (+1)
   \      0x428   0x2040             MOVS     R0,#+64
   \                     ??main_35: (+1)
   \      0x42A   0x2290             MOVS     R2,#+144
   \      0x42C   0x05D2             LSLS     R2,R2,#+23
   \      0x42E   0x6190             STR      R0,[R2, #+24]

Скрипт линкера выглядит вот так:

Spoiler
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800DBFF;
define symbol CAL_INFO_ROM_START           = 0x0800DC00;
define symbol CAL_INFO_ROM_END             = 0x0800FFFF; 
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__   = 0;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

define region CAL_INFO_BLOCK = mem:[ from CAL_INFO_ROM_START to CAL_INFO_ROM_END];

do not initialize {section .calInfo};

place in CAL_INFO_BLOCK {section .calInfo};

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };

export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;

 

Инициализация константы написана таким обрзаом:

Spoiler
#pragma pack(push, 2) // flash writing by 2 bytes only
struct GeneralCal {
    uint16_t z0;
    uint16_t z1;
    uint16_t z2;
    uint16_t z3;
    bool calibrated;
};
#pragma pack(pop)

#pragma pack(push, 1)
struct CalInfo {
    GeneralCal general;
    uint16_t tbl[4096];
};

__root volatile const CalInfo calInfo @ ".calInfo" {
    {
        3502, 3318, 369, 184, // see readme.md
        false,
    },{
        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
        0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002,
        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002 и т.д.

 

Но при запуске процессор попадает в HardFault. Расшифровка показала, что проблема тут:

image.png.bc60dc5df82851f1a44952813dc0485b.png

А в R0 находится адрес 0x0800DC00. Т.е. startup-код пытается инициализировать константный объект.

 

Из документации на линкер следует, что директива do not initialize относится только к секциям типа zeroinit, т.е. в данном случае она не работает(((

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


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

13 hours ago, jcxz said:

PS: IAR v7.80.4 for ARM.

На новые IARы переходить, как я вижу, Вы не спешите))) Как я понимаю, в этой версии Вам уже известны все его шаблоны поведения. А в новых  продуктах возможно и новые баги появились😀

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


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

19 hours ago, pyroman said:

a const volatile object, declare it with the __ro_placement attribute. See

Вах! А это спасло отца русской демократии, т.е. меня! Вот это да! Спасибище!!!!

static const volatile __ro_placement CalInfo calInfo @ ".calInfo" {

Оптимизация: spee, no size constraint.

Содержимое скрипта линкера:

Spoiler
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

define symbol CAL_INFO_PAGE_COUNT  = 9;
define symbol CAL_INFO_PAGE_SIZE  = 1024;

define block CAL_INFO_BLOCK with alignment = 8, size = CAL_INFO_PAGE_COUNT * CAL_INFO_PAGE_SIZE, fixed order
                            {readonly section .calInfo};

place at address mem: 0x0800DC00 {block CAL_INFO_BLOCK};

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };

export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;

 

Данные из map-файла:

"A1", part 1 of 2:                         0x200c
  CAL_INFO_BLOCK               0x800'dc00  0x2400  <Block>
    .calInfo         const     0x800'dc00  0x200c  main.o [1]
                             - 0x800'fc0c  0x200c
    
    
calInfo                  0x800'dc00  0x200c  Data  Lc  main.o [1]    

Кусок листинга со светодиодом:

Spoiler
  321          
    322              s_calLed::set(!isCalibrated());
   \                     ??main_16: (+1)
   \      0x630   0x....             LDR      R1,??DataTable2_14
   \      0x632   0x7A08             LDRB     R0,[R1, #+8]
   \      0x634   0x2800             CMP      R0,#+0
   \      0x636   0xD002             BEQ      ??main_36
   \      0x638   0x2080             MOVS     R0,#+128
   \      0x63A   0x03C0             LSLS     R0,R0,#+15
   \      0x63C   0xE000             B        ??main_37
   \                     ??main_36: (+1)
   \      0x63E   0x9801             LDR      R0,[SP, #+4]
   \                     ??main_37: (+1)
   \      0x640   0x2290             MOVS     R2,#+144
   \      0x642   0x05D2             LSLS     R2,R2,#+23
   \      0x644   0x6190             STR      R0,[R2, #+24]
    323          

 

Попытки инициализации в startup-коде нет.

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


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

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

Вах! А это спасло отца русской демократии, т.е. меня!

static const volatile __ro_placement CalInfo calInfo @ ".calInfo" {


Вот я и говорил, немцы хоть и немного напридумывали насчет RAM, но задокументировали свои мысли))

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


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

2 minutes ago, Arlleex said:

Вот я и говорил, немцы хоть и немного напридумывали насчет RAM, но задокументировали свои мысли))

Шведы) Они пока ещё шведы) А так - да, как Вы и говорили в другом посте: мощная оптимизация со средствами борьбы против её последствий)

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


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

6 часов назад, haker_fox сказал:

А в R0 находится адрес 0x0800DC00. Т.е. startup-код пытается инициализировать константный объект.

Да, Вы правы: сейчас вставил Ваш код код в свою программу на XMC4700; загрузил; в самом начале (до startup) поставил в J-Link-е data-бряк по записи на адрес начала calInfo; и получил срабатывание бряка при попытке инициализации его первым байтом инициализатора calInfo.

2 часа назад, haker_fox сказал:

Вах! А это спасло отца русской демократии, т.е. меня! Вот это да! Спасибище!!!!

static const volatile __ro_placement CalInfo calInfo @ ".calInfo" {

В IAR v7.80.4 это тоже сработало - после добавления перестало вылетать на data-бряк в startup-е.

Вчера я не пробовал запускать ваш код на реальном камне. Только скомпилил. Поэтому не видел инициализации в startup. А смысла "inited" в .map-е не понял  :unknw:

4 часа назад, haker_fox сказал:

На новые IARы переходить, как я вижу, Вы не спешите))) Как я понимаю, в этой версии Вам уже известны все его шаблоны поведения. А в новых  продуктах возможно и новые баги появились😀

А смысл? Я сравнивал код, выдаваемый новыми IAR-ами. Он почти байт-в-байт такой-же, как в v7.80.4. Т.е. - IAR-овцы далее пошли не по пути улучшения работы компилятора (и его оптимизатора), а по пути навешивания всяких рюшечек и поддержки новых камней. А это всё ерунда и не нужно.

Вот если бы новые IAR-ы хотя бы так не лажались при оптимизации кода и не делали столько глупостей - перешёл бы. А так - они только стали более монструозными и медленными и плюсов - почти никаких.  :unknw:

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


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

3 minutes ago, jcxz said:

Да, Вы правы

Уф) Самое главное, что совместными усилиями нам удалось отдать верный и нужный приказ инструментарию) Надеюсь, что данный топик принесёт пользу коллегам по форуму💗

4 minutes ago, jcxz said:

Вчера я не пробовал запускать ваш код на реальном камне

По правде говоря, я даже не рассчитывал на такое) Ведь запуск чужого кода на своём железе - трата собственного времени, что не всегда возможно)))

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


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

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

Шведы) Они пока ещё шведы) А так - да, как Вы и говорили в другом посте: мощная оптимизация со средствами борьбы против её последствий)

Для исконно русского любой иностранец - немец.  :biggrin:  ("немцы" - от "не мы").

Оптимизация IAR оставляет желать много лучшего. Мягко говоря. Слишком много дыр в ней. И никакого прогресса (в новых IAR-ах)  :sad:

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


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

8 minutes ago, jcxz said:

А это всё ерунда и не нужно.

Понял) Спасибо за мнение!

Just now, jcxz said:

И никакого прогресса (в новых IAR-ах)  :sad:

Может быть ко власти пришли эффективные менеджеры...

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


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

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

По правде говоря, я даже не рассчитывал на такое) Ведь запуск чужого кода на своём железе - трата собственного времени, что не всегда возможно)))

В таком деле есть как минусы, так и плюсы: Трата времени на исследование чего-то нового, это в ближайшей перспективе - трата времени, а в дальней перспективе наоборот - его экономия. Как и любое обучение. Чем больше потратишь времени на изучение предмета, тем меньше его потратишь когда начнёшь работать по этому предмету.

PS: Именно поэтому негативно отношусь к таким персонажам здесь, которые пишут, что-то типа "Подскажите быстрее! На изучение предмета и чтение мануалов нет времени - надо уже работу работать". Они его тратят во много раз больше, когда наугад ищут пути решения, не изучив как следует тему.

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


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

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

Может быть ко власти пришли эффективные менеджеры...

значит хорошо продается

2 минуты назад, jcxz сказал:

в дальней перспективе наоборот - его экономия.

вопрос философский на самом деле , чем больше знаешь , тем больше начинаешь копаться в сути и на это тоже времени уходит не мало и требуется куда более детальнее ответы , нежели - "ну работает же".

 

 

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


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

У меня 4 iar'овских компилятора на пк: 6.5, 7.8, 8.5, 9.3. Пользуюсь каждым время от времени. Они там ещё к unicode'у перешли не помню начиная с какой версии, поэтому старые скомпилированные либы будут всегда с предупреждением собираться в проекте по этому поводу.

Ещё у меня есть icf-раскраска для Notepad++ 🙂 Так как меня заколебали родные icf и захотелось ваять собственные.

notepad-icf.png

Syntax Highlighting Scheme (IAR ICF).xml

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


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

Тему надо сохранить, очень полезная.

Изменено пользователем haker_fox
На форуме принято общение на русском языке. Не забывайте о громотности, пожалуйста.

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


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

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

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

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

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

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

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

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

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

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