kvandr 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Эх, совсем молодежь обленела .... :angry2: http://www.keil.com/support/man/docs/armli...62066000571.htm Имхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера). Если бы молодость, было бы веселее. А так полтинник, и башка занята чем попало... Кейл только вкусов в коктейль добавил )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Если бы молодость, было бы веселее. А так полтинник, и башка занята чем попало... Сочувствую :05: Все когда-то начнем тупить на абсолютно ровном месте ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Эх, совсем молодежь обленела .... :angry2: http://www.keil.com/support/man/docs/armli...62066000571.htm Имхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера). Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания. Поэтому размещение по конкретному адресу - способ надёжнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания. В вашем примере не объявлена секция SRAM3, а объявлен регион с таким названием. Короче, вот тут почитайте: http://www.keil.com/support/man/docs/armcl...62066000009.htm Для примера вот так в Keil я делал RAM функции ("стандартный" метод меня не устраивает): scatter: RW_IRAM1 0x20000000 0x00004000; RW data { *.o (RAM_FUNCTION) .ANY (+RW +ZI) } в исходниках: #define RAM_FUNCTION __attribute__ ((section("RAM_FUNCTION"))) static RAM_FUNCTION Status getStatus() ... RAM_FUNCTION Status waitForLastOperation(uint32_t timeout) ... RAM_FUNCTION void stm32l1::Flash::enableRunPowerDown() .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Что я сделал не так? В приведенном скаттер-файле нет секции SRAM3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания. Пример неудачный - естественно массив в 1024 байте никто не сможет разместить в секцию размером 8 байт. Но в общем случае да, если свободной памяти под ноль, то при оптимизации может в другую секцию засунуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Пример неудачный - естественно массив в 1024 байте никто не сможет разместить в секцию размером 8 байт. Но в общем случае да, если свободной памяти под ноль, то при оптимизации может в другую секцию засунуть. Не засунет, линкер просто выкинет соотв. ошибку, бинарник не будет создан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба ок, попробую разобраться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Не засунет, линкер просто выкинет соотв. ошибку, бинарник не будет создан. Разобрался. Ошибка была в том, что сделал регионы, но секции не засунул. Потому что считал что регион=секция. Оказалось сложнее. Получилось вот так: ; Scatter-Loading Description File LR_FLASH 0x08000000 0x00200000 { ER_FLASH 0x08000000 0x00200000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } DTCM 0x20000000 0x00020000 { *.o (DTCM) } AXI 0x24000000 0x00080000 { .ANY (+RW +ZI) } SRAM12 0x30000000 0x00040000 { *.o (SRAM12) } SRAM3 0x30040000 0x00008000 { *.o (SRAM3) } ; SRAM4 0x38000000 0x00010000 ; { ; *.o (SRAM4) ; } } Я доволен : всё пихается куда надо и работает :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Разобрался. Дык, это и не удивительно, когда комрады тут все разжевали до косточек и осталось лишь проглотить :) Scatter файл позволяет делать очень интересные вещи ... , а это - лишь цветочки ;) Вместо такой записи, где две области примыкают друг к другу: SRAM12 0x30000000 0x00040000 { *.o (SRAM12) } SRAM3 0x30040000 0x00008000 { *.o (SRAM3) } можно писать чуть проще: SRAM123 0x30000000 0x000С0000 { *.o (SRAM12) *.o (SRAM3) } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Дык, это и не удивительно, когда комрады тут все разжевали до косточек и осталось лишь проглотить :) Scatter файл позволяет делать и не такое, а это - лишь цветочки ;) Вам спасибо персонально! :) С ваших слов понял, что секция и регион -не одно и тоже Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Вам спасибо персонально! :) С ваших слов понял, что секция и регион -не одно и тоже Пожалуйста )) Но в принципе, все это есть в мануале, довольно популярно расписано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 16 июля, 2018 Опубликовано 16 июля, 2018 (изменено) · Жалоба Продолжая о скаттерах... Понадобилось мне сделать буфер в RAM, который не трётся при сбросе CPU (для сохранения состояния). Объявил регион, секцию - обязательно указываем UNINIT: AXI3 0x2405B500 UNINIT 0x00024B00;STATE { *.o (STATE) } В программе - обязательно указываем zero_init: u8 STATE[0x00024B00] __attribute__((section("STATE"),zero_init)); Кейла тут говорит, что zero_init обязателен - типа косяк: SYMPTOM/ CAUSE/ RESOLUTION/ => http://www.keil.com/support/docs/3480.htm Проверил, действительно без указания zero_init память трётся при сбросе CPU. Изменено 16 июля, 2018 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Продолжая о скаттерах... Полезная инфа! Судя по приписке, это справедливо только для маленьких объектов размером до 8 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться