-=az=- 0 2 января, 2020 Опубликовано 2 января, 2020 · Жалоба Добрый день. Программа загрузчика, средствами линкера, перенесены в RAM. Проблем нет, всё работает как нужно. Но, отлаживать в IARе средствами Breakpoint, не получается, он не понимает, что код переехал в RAM. В Eclipse с этим никаких вопросов нет, всё штатно. Есть ли какие настройки ? Или IAR этого не умеет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 2 января, 2020 Опубликовано 2 января, 2020 · Жалоба Ищите в EWARM_DebuggingGuide.ENU.pdf раздел "Setting breakpoints in __ramfunc declared functions". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 2 января, 2020 Опубликовано 2 января, 2020 · Жалоба Опять закат солнца в ручную ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 2 января, 2020 Опубликовано 2 января, 2020 · Жалоба Где вручную ? Всё автоматизировано ! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 3 января, 2020 Опубликовано 3 января, 2020 · Жалоба 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, поставил точки в коде и всё. А тут надо бубен доставать, наверное ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 3 января, 2020 Опубликовано 3 января, 2020 · Жалоба 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++; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 3 января, 2020 Опубликовано 3 января, 2020 (изменено) · Жалоба Я про iar, копирует весь код строкой (файл icf): initialize by copy { readonly, readwrite }; Изменено 3 января, 2020 пользователем -=az=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 3 января, 2020 Опубликовано 3 января, 2020 · Жалоба 1 час назад, -=az=- сказал: initialize by copy { readonly, readwrite }; Ну потому что это глупость. Нужно либо просто ROM_region прописать по адресам RAM, либо сделать place in RAM_region { readonly , readwrite }; Загружать код в RAM будет либо отладчик для отладки, либо загрузчик в штатном режиме. И вообще, для отладки один icf, для релиза другой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 3 января, 2020 Опубликовано 3 января, 2020 · Жалоба https://mcu-things.com/blog/ram-function-easy-way-en/ Как два пальца ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 3 января, 2020 Опубликовано 3 января, 2020 · Жалоба Взял IAR 8.40 Перед функцией поставил __ramfunc и нормально BP ставятся и останавливается в RAM. В icf всё по умолчанию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 4 января, 2020 Опубликовано 4 января, 2020 · Жалоба 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/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 4 января, 2020 Опубликовано 4 января, 2020 · Жалоба Объясните цель, зачем это в вашем случае нужно? Для отладки можно просто скомпилировать код в RAM и не использовать flash совсем. Для прошивки flash из кода достаточно пометить функцию-прошивальщик как __ramfunc. Чего вы добиваетесь копированием почти всего кода в RAM? В микроконтроллерах STM32 код из flash выполняется ни чуть не хуже. Разве что с целью экономить энергию отключением тактирования flash, но что-то мне подсказывает, что это не ваш случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 4 января, 2020 Опубликовано 4 января, 2020 · Жалоба Подключил дебагер OpenOCD, и вся отладка заработала как нужно. Как и предполагалось дебагер в iar не айс ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 4 января, 2020 Опубликовано 4 января, 2020 · Жалоба 1 hour ago, -=az=- said: Как и предполагалось дебагер в iar не айс ... Я бы поспорил, дебагер в IAR(C SPY) это то ради чего можно терпеть его IDE c примитивной подсветкой и иногда неработающей навигацией по коду и автодополнением. Дебагер всегда и сразу работает с любым поддерживаемым программатором без танцев с бубном, отладочная сессия держится сутками, поддержка плагинов, LOG breakpoint'ы аналогов я не видел не у кого(давно ситуацию не мониторил, буду рад услышать обратное) а еще макросы и куча всякий мелких фич которые значительно ускоряют отладку и поиск проблем. Единственный минус IAR, это редактор с отсутствием подсветки #if веток и конечно цена$$$$. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 4 января, 2020 Опубликовано 4 января, 2020 · Жалоба Конечно же просто так от него не отстану, пока не найду корень зла ...) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться