Jump to content

    
Sign in to follow this  
-=az=-

IAR 8.2 STM32 Breakpoint

Recommended Posts

Добрый день.

Программа загрузчика, средствами линкера, перенесены в RAM.

Проблем нет, всё работает как нужно.

Но, отлаживать в IARе средствами Breakpoint, не получается, он не понимает, что код переехал в RAM.

В Eclipse с этим никаких вопросов нет, всё штатно.

Есть ли какие настройки ? Или IAR этого не умеет ?

Share this post


Link to post
Share on other sites

Где вручную ? Всё автоматизировано !

 

SETTING BREAKPOINTS IN __RAMFUNC DECLARED FUNCTIONS
A breakpoint set in a __ramfunc declared function might in some cases not trigger if it
is the first reached breakpoint after system initialization. The reason is that software
breakpoints are written to memory before the startup code has copied the content of
__ramfunc declared functions to RAM, causing the placed breakpoints to be
overwritten. Hardware breakpoints are not affected by this. Using the Run to main
option will, in most cases, resolve this issue because the breakpoints will be re-applied
when you click the Go button.
The only case where using Run to main will not work is if __ramfunc declared
functions are accessed from constructors of global objects. In this case, you must place
an extra breakpoint on the __call_ctors function.

Share this post


Link to post
Share on other sites
17 часов назад, x893 сказал:

Где вручную ? Всё автоматизировано !

 

SETTING BREAKPOINTS IN __RAMFUNC DECLARED FUNCTIONS
A breakpoint set in a __ramfunc declared function might in some cases not trigger if it
is the first reached breakpoint after system initialization. The reason is that software
breakpoints are written to memory before the startup code has copied the content of
__ramfunc declared functions to RAM, causing the placed breakpoints to be
overwritten. Hardware breakpoints are not affected by this. Using the Run to main
option will, in most cases, resolve this issue because the breakpoints will be re-applied
when you click the Go button.
The only case where using Run to main will not work is if __ramfunc declared
functions are accessed from constructors of global objects. In this case, you must place
an extra breakpoint on the __call_ctors function.

Всё бы хорошо ...

Закат в ручную вот почему, в коде ни одна функция не имеет идентификатора __ramfunc.

Весь код средством линкера копируется в ram.

В eclipse, поставил точки в коде и всё.

А тут надо бубен доставать, наверное ...

Share this post


Link to post
Share on other sites
23 minutes ago, -=az=- said:

Весь код средством линкера копируется в ram.

Линкер только секцию создает. Ничего он не копирует.

Копируется при старте. Смотрите Reset_Handler (или что там у Вас запускается).

Что то типа такого в .c/.h

__attribute__ ((section(".ramfunc")))

И в ld файле

    . = ALIGN(4); 
    _etext = .;
    .relocate : AT (_etext)
    {
        . = ALIGN(4);
        _srelocate = .;
        *(.ramfunc .ramfunc.*);
        *(.data .data.*);
        . = ALIGN(4);
        _erelocate = .;
    } > ram

И при старте

    pSrc = &_etext ;
    pDest = &_srelocate ;

    if ( pSrc != pDest )
        while (pDest < &_erelocate)
            *pDest++ = *pSrc++;
 

Share this post


Link to post
Share on other sites
1 час назад, -=az=- сказал:

initialize by copy { readonly, readwrite };

Ну потому что это глупость. Нужно либо просто ROM_region прописать по адресам RAM, либо сделать

place in RAM_region   { readonly , readwrite };

Загружать код в RAM будет либо отладчик для отладки, либо загрузчик в штатном режиме.

И вообще, для отладки один icf, для релиза другой.

Share this post


Link to post
Share on other sites
7 часов назад, VladislavS сказал:

Ну потому что это глупость. Нужно либо просто ROM_region прописать по адресам RAM, либо сделать


place in RAM_region   { readonly , readwrite };

Загружать код в RAM будет либо отладчик для отладки, либо загрузчик в штатном режиме.

И вообще, для отладки один icf, для релиза другой.

Не понял почему глупость.

Сделано именно как рекомендует производитель iar: https://www.iar.com/support/tech-notes/general/execute-in-ram-after-copying-from-flashrom-v5.20-and-later/

Share this post


Link to post
Share on other sites

Объясните цель, зачем это в вашем случае нужно? Для отладки можно просто скомпилировать код в RAM и не использовать flash совсем. Для прошивки flash из кода достаточно пометить функцию-прошивальщик как __ramfunc. Чего вы добиваетесь копированием почти всего кода в RAM? В микроконтроллерах STM32 код из flash выполняется ни чуть не хуже. Разве что с целью экономить энергию отключением тактирования flash, но что-то мне подсказывает, что это не ваш случай.

Share this post


Link to post
Share on other sites
1 hour ago, -=az=- said:

Как и предполагалось дебагер в iar не айс ...

Я бы поспорил, дебагер в IAR(C SPY) это то ради чего можно терпеть его IDE c примитивной подсветкой и иногда неработающей навигацией по коду и автодополнением.
Дебагер всегда и сразу работает с любым поддерживаемым программатором без танцев с бубном, отладочная сессия держится сутками, поддержка плагинов, LOG breakpoint'ы аналогов я не видел не у кого(давно ситуацию не мониторил, буду рад услышать обратное) а еще макросы и куча всякий мелких фич которые значительно ускоряют отладку и поиск проблем.

Единственный минус IAR, это редактор с отсутствием подсветки #if веток и конечно цена$$$$.

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.

Sign in to follow this