Перейти к содержанию
    

Массив по заданному адресу MDK-ARM (Keil)

Эх, совсем молодежь обленела .... :angry2:

http://www.keil.com/support/man/docs/armli...62066000571.htm

 

Имхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера).

Если бы молодость, было бы веселее. А так полтинник, и башка занята чем попало... Кейл только вкусов в коктейль добавил ))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы молодость, было бы веселее. А так полтинник, и башка занята чем попало...

Сочувствую :05:

Все когда-то начнем тупить на абсолютно ровном месте ...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эх, совсем молодежь обленела .... :angry2:

http://www.keil.com/support/man/docs/armli...62066000571.htm

 

Имхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера).

 

Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания.

Поэтому размещение по конкретному адресу - способ надёжнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания.

 

В вашем примере не объявлена секция 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() ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания.

Пример неудачный - естественно массив в 1024 байте никто не сможет разместить в секцию размером 8 байт.

Но в общем случае да, если свободной памяти под ноль, то при оптимизации может в другую секцию засунуть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример неудачный - естественно массив в 1024 байте никто не сможет разместить в секцию размером 8 байт.

Но в общем случае да, если свободной памяти под ноль, то при оптимизации может в другую секцию засунуть.

Не засунет, линкер просто выкинет соотв. ошибку, бинарник не будет создан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не засунет, линкер просто выкинет соотв. ошибку, бинарник не будет создан.

Разобрался. Ошибка была в том, что сделал регионы, но секции не засунул. Потому что считал что регион=секция. Оказалось сложнее.

Получилось вот так:

; 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)
; }

}

 

Я доволен : всё пихается куда надо и работает :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался.

Дык, это и не удивительно, когда комрады тут все разжевали до косточек и осталось лишь проглотить :)

 

Scatter файл позволяет делать очень интересные вещи ... , а это - лишь цветочки ;)

 

Вместо такой записи, где две области примыкают друг к другу:

SRAM12 0x30000000 0x00040000
{
  *.o (SRAM12)
}

SRAM3 0x30040000 0x00008000
{
  *.o (SRAM3)
}

 

можно писать чуть проще:

 

SRAM123 0x30000000 0x000С0000
{
  *.o (SRAM12)
  *.o (SRAM3)
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, это и не удивительно, когда комрады тут все разжевали до косточек и осталось лишь проглотить :)

 

Scatter файл позволяет делать и не такое, а это - лишь цветочки ;)

Вам спасибо персонально! :) С ваших слов понял, что секция и регион -не одно и тоже

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам спасибо персонально! :) С ваших слов понял, что секция и регион -не одно и тоже

Пожалуйста ))

 

Но в принципе, все это есть в мануале, довольно популярно расписано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжая о скаттерах...

 

Понадобилось мне сделать буфер в 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.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжая о скаттерах...

Полезная инфа!

Судя по приписке, это справедливо только для маленьких объектов размером до 8 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...