|
Массив по заданному адресу MDK-ARM (Keil) |
|
|
|
Jul 8 2018, 16:40
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 4-09-10
Пользователь №: 59 282

|
Цитата(Forger @ Jul 8 2018, 19:08)  Эх, совсем молодежь обленела .... http://www.keil.com/support/man/docs/armli...62066000571.htmИмхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера). Если бы молодость, было бы веселее. А так полтинник, и башка занята чем попало... Кейл только вкусов в коктейль добавил ))
|
|
|
|
|
Jul 9 2018, 03:26
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(Forger @ Jul 8 2018, 17:08)  Эх, совсем молодежь обленела .... http://www.keil.com/support/man/docs/armli...62066000571.htmИмхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера). Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания. Поэтому размещение по конкретному адресу - способ надёжнее
|
|
|
|
|
Jul 9 2018, 06:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(__inline__ @ Jul 9 2018, 06:26)  Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания. В вашем примере не объявлена секция 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() ....
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 9 2018, 13:22
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(Forger @ Jul 9 2018, 07:34)  Не засунет, линкер просто выкинет соотв. ошибку, бинарник не будет создан. Разобрался. Ошибка была в том, что сделал регионы, но секции не засунул. Потому что считал что регион=секция. Оказалось сложнее. Получилось вот так: Код ; 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) ; }
} Я доволен : всё пихается куда надо и работает
|
|
|
|
|
Jul 9 2018, 13:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(__inline__ @ Jul 9 2018, 16:22)  Разобрался. Дык, это и не удивительно, когда комрады тут все разжевали до косточек и осталось лишь проглотить  Scatter файл позволяет делать очень интересные вещи ... , а это - лишь цветочки  Вместо такой записи, где две области примыкают друг к другу: Код SRAM12 0x30000000 0x00040000 { *.o (SRAM12) }
SRAM3 0x30040000 0x00008000 { *.o (SRAM3) } можно писать чуть проще: Код SRAM123 0x30000000 0x000С0000 { *.o (SRAM12) *.o (SRAM3) }
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 9 2018, 13:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(__inline__ @ Jul 9 2018, 16:28)  Вам спасибо персонально!  С ваших слов понял, что секция и регион -не одно и тоже Пожалуйста )) Но в принципе, все это есть в мануале, довольно популярно расписано.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 16 2018, 05:26
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Продолжая о скаттерах... Понадобилось мне сделать буфер в 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.
Сообщение отредактировал __inline__ - Jul 16 2018, 05:38
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|