реклама на сайте
подробности

 
 
> Массив по заданному адресу MDK-ARM (Keil)
quandr
сообщение Jul 7 2018, 12:09
Сообщение #1


Участник
*

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



Добрый день.
В документации MDK-ARM описана возможность размещения переменной по заданному адресу.
Например
int x2 __attribute__((at(0x12000))) = 10;

А как массив разместить в определенном адресном пространстве (может как-то через первый элемент)?

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
__inline__
сообщение Jul 7 2018, 13:46
Сообщение #2


Местный
***

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



Три способа:

1) Сделать в линкере секцию и через #pragma section объявлять массив

2) Так же как вы написали : char Buffer[1024] __attribute__((at(0x38800000)));

3) char *Buffer=(char*)0x38000000; Обращаться Buffer[i]=j;

Сообщение отредактировал IgorKossak - Jul 12 2018, 06:06
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 7 2018, 15:45
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(__inline__ @ Jul 7 2018, 16:46) *
3) char *Buffer=(char*)0x38000000; Обращаться Buffer[i]=j;

Никому больше такое не говорите biggrin.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2018, 16:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Arlleex @ Jul 7 2018, 18:45) *
Никому больше такое не говорите biggrin.gif

Ну, вся работа с регистрами периферии так строится - ничего же wink.gif Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию.
Go to the top of the page
 
+Quote Post
quandr
сообщение Jul 8 2018, 13:04
Сообщение #5


Участник
*

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



Цитата(aaarrr @ Jul 7 2018, 19:01) *
Ну, вся работа с регистрами периферии так строится - ничего же wink.gif Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию.

Так как всё таки записать эту секцию для массива в IRAM2 например int Arr [1024]? С началом по конкретному адресу.

Сообщение отредактировал quandr - Jul 8 2018, 13:08
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 8 2018, 14:08
Сообщение #6


Профессионал
*****

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



Цитата(quandr @ Jul 8 2018, 16:04) *
Так как всё таки записать эту секцию для массива в IRAM2 например int Arr [1024]? С началом по конкретному адресу.

Ведь все есть в мануале на Keil. Вот первые же ссылки, который дал гугль:
http://www.keil.com/support/man/docs/armli...62066000009.htm
http://www.keil.com/support/man/docs/armcc...59124982450.htm


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
quandr
сообщение Jul 8 2018, 15:42
Сообщение #7


Участник
*

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



Цитата(Forger @ Jul 8 2018, 17:08) *
Ведь все есть в мануале на Keil. Вот первые же ссылки, который дал гугль:
http://www.keil.com/support/man/docs/armli...62066000009.htm
http://www.keil.com/support/man/docs/armcc...59124982450.htm

Там только регион указан, а мне по адресу нужно.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 8 2018, 16:08
Сообщение #8


Профессионал
*****

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



Цитата(quandr @ Jul 8 2018, 18:42) *
Там только регион указан, а мне по адресу нужно.

Эх, совсем молодежь обленела .... angry.gif
http://www.keil.com/support/man/docs/armli...62066000571.htm

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 9 2018, 03:26
Сообщение #9


Местный
***

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



Цитата(Forger @ Jul 8 2018, 17:08) *
Эх, совсем молодежь обленела .... angry.gif
http://www.keil.com/support/man/docs/armli...62066000571.htm

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


Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания.
Поэтому размещение по конкретному адресу - способ надёжнее
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Jul 9 2018, 06:31
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(__inline__ @ Jul 9 2018, 10:26) *
Выше я дал пример (который почему-то все проигнорировали), что размещение в секции - ещё не гарантирует фактического туда попадания.

Пример неудачный - естественно массив в 1024 байте никто не сможет разместить в секцию размером 8 байт.
Но в общем случае да, если свободной памяти под ноль, то при оптимизации может в другую секцию засунуть.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 9 2018, 06:34
Сообщение #11


Профессионал
*****

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



Цитата(HardEgor @ Jul 9 2018, 09:31) *
Пример неудачный - естественно массив в 1024 байте никто не сможет разместить в секцию размером 8 байт.
Но в общем случае да, если свободной памяти под ноль, то при оптимизации может в другую секцию засунуть.

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 9 2018, 13:22
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 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)
; }

}


Я доволен : всё пихается куда надо и работает sm.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 9 2018, 13:26
Сообщение #13


Профессионал
*****

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



Цитата(__inline__ @ Jul 9 2018, 16:22) *
Разобрался.

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

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

Вместо такой записи, где две области примыкают друг к другу:
Код
SRAM12 0x30000000 0x00040000
{
  *.o (SRAM12)
}

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


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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 9 2018, 13:28
Сообщение #14


Местный
***

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



Цитата(Forger @ Jul 9 2018, 14:26) *
Дык, это и не удивительно, когда комрады тут все разжевали до косточек и осталось лишь проглотить sm.gif

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

Вам спасибо персонально! sm.gif С ваших слов понял, что секция и регион -не одно и тоже
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- quandr   Массив по заданному адресу MDK-ARM (Keil)   Jul 7 2018, 12:09
||- - Arlleex   Цитата(aaarrr @ Jul 7 2018, 19:01) Ну, вс...   Jul 7 2018, 16:41
||- - KRS   Цитата(aaarrr @ Jul 7 2018, 19:01) Ну, вс...   Jul 8 2018, 08:39
||- - quandr   Цитата(Forger @ Jul 8 2018, 19:08) Эх, со...   Jul 8 2018, 16:40
|||- - Forger   Цитата(quandr @ Jul 8 2018, 19:40) Если б...   Jul 8 2018, 16:45
||- - Forger   Цитата(__inline__ @ Jul 9 2018, 06:26) Вы...   Jul 9 2018, 06:20
||- - Forger   Цитата(__inline__ @ Jul 9 2018, 16:28) Ва...   Jul 9 2018, 13:38
|- - quandr   Цитата(__inline__ @ Jul 7 2018, 16:46) Тр...   Jul 8 2018, 02:22
- - k155la3   В файле линкера организовать сегмент и при деклара...   Jul 7 2018, 15:41
|- - haker_fox   QUOTE (k155la3 @ Jul 7 2018, 23:41) В фай...   Jul 8 2018, 00:35
- - pnp_mechanic   Можно так. const uint16_t NAME [] __attribute__(...   Jul 7 2018, 20:05
- - __inline__   Объявил переменную в секции SRAM3: Кодu8 AudioBuff...   Jul 8 2018, 12:50
|- - aaarrr   Цитата(__inline__ @ Jul 8 2018, 15:50) Чт...   Jul 9 2018, 06:21
- - __inline__   ок, попробую разобраться   Jul 9 2018, 09:36
- - __inline__   Продолжая о скаттерах... Понадобилось мне сделать...   Jul 16 2018, 05:26
- - Forger   Цитата(__inline__ @ Jul 16 2018, 08:26) П...   Jul 16 2018, 07:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01533 секунд с 7
ELECTRONIX ©2004-2016