Jump to content
    

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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, т.е. в данном случае она не работает(((

Share this post


Link to post
Share on other sites

13 hours ago, jcxz said:

PS: IAR v7.80.4 for ARM.

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

Share this post


Link to post
Share on other sites

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-коде нет.

Share this post


Link to post
Share on other sites

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

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

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


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

Share this post


Link to post
Share on other sites

2 minutes ago, Arlleex said:

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

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

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

3 minutes ago, jcxz said:

Да, Вы правы

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

4 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

8 minutes ago, jcxz said:

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

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

Just now, jcxz said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

 

Share this post


Link to post
Share on other sites

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

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

notepad-icf.png

Syntax Highlighting Scheme (IAR ICF).xml

Share this post


Link to post
Share on other sites

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

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

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...