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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Массив по заданному адресу 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
__inline__
сообщение Jul 7 2018, 13:46
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 211
Регистрация: 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
k155la3
сообщение Jul 7 2018, 15:41
Сообщение #3


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

Группа: Свой
Сообщений: 1 085
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



В файле линкера организовать сегмент и при декларации массива указать его использование в attr.
Как в MDK не знаю, возможно имя сегмента указать вместо at(0x12000).
Это обеспечит гарантию, что компилятор будет "знать" что этот адрес занят, и не будет накладок.
В приведенном Вами коде это не гарантируется.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 7 2018, 15:45
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 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
Сообщение #5


Гуру
******

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



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

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


Местный
***

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



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

Регистры это заранее определенные области, а компилятор размещает переменные где захочет в соответствии с линкерскриптом. Указали возможность 3 способами, первый из которых как раз указание линкеру. Тогда это сработает, да. Но способ писать по адресу подразумевался как отдельный способ без шаманства с линкерскриптом rolleyes.gif В таком случае можно затереть какие-нибудь переменные.
Go to the top of the page
 
+Quote Post
pnp_mechanic
сообщение Jul 7 2018, 20:05
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 25-07-17
Пользователь №: 98 462



Можно так.
const uint16_t NAME [] __attribute__((at(0x08002000))) = {...}
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 8 2018, 00:35
Сообщение #8


Познающий...
******

Группа: Свой
Сообщений: 2 885
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (k155la3 @ Jul 7 2018, 23:41) *
В файле линкера организовать сегмент и при декларации массива указать его использование в attr.

Я тоже за такой подход. Т.е. конкретными адресами пусть занимается файл линкера. Всегда так делаем. Правда используем IAR, но это сути вообще не менят.


--------------------
Желаю всем гармонии с самими собой!
Go to the top of the page
 
+Quote Post
quandr
сообщение Jul 8 2018, 02:22
Сообщение #9


Участник
*

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



Цитата(__inline__ @ Jul 7 2018, 16:46) *
Три способа:

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

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

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


Куда вписывать #pragma section и как объявлять массив в данном случае? Извините, не делал такого раньше. Поэтому, если можете, чуть подробнее.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 8 2018, 08:39
Сообщение #10


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

Группа: Модераторы
Сообщений: 1 949
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(aaarrr @ Jul 7 2018, 19:01) *
Ну, вся работа с регистрами периферии так строится - ничего же wink.gif

Вообще то не так sm.gif

char *Buffer=(char*)0x38000000;

снижает скорость и увеличивает расход памяти! потому что лишняя переменная вводится...

надо так
#define Buffer ((char*)0x38000000)
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 8 2018, 12:50
Сообщение #11


Местный
***

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



Объявил переменную в секции SRAM3:
Код
u8 AudioBuffer[1024] __attribute__((section("SRAM3")));


Скаттер-файл:
Код
LR_IROM1 0x08000000 0x00200000  {   ; load region size_region

  ER_IROM1 0x08000000 0x00200000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }

  DTCM 0x20000000 0x00020000  { ; RW data
  }

  AXI 0x24000000 0x00080000  { ; RW data
   .ANY (+RW +ZI)
  }

  SRAM12 0x30000000 0x00040000  { ; RW data
   .ANY (+RW +ZI)
  }

  SRAM3 0x30040000 0x00000008  { ; RW data
   .ANY (+RW +ZI)
  }

  SRAM4 0x38000000 0x00010000  { ; RW data
  }

}


Из скаттера видно, что секция SRAM3 всего 8 байт, а надо 1024.

Тем не менее, линковка успешна!

Вопрос - почему? Какого чёрта линковщик засунул переменную AudioBuffer в другую область памяти?

Что я сделал не так?

выдержка из МАР-файла. точно, вообще в другую секцию засунул!

как победить урода? (Keil)

или только через :
1) u8 *AudioBuffer=(u8*)0x30040000;
2) u8 AudioBuffer[1024] __attribute__((at(0x30040000)));

?
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
quandr
сообщение Jul 8 2018, 13:04
Сообщение #12


Участник
*

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


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

Группа: Свой
Сообщений: 1 041
Регистрация: 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
Сообщение #14


Участник
*

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


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

Группа: Свой
Сообщений: 1 041
Регистрация: 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

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

 


RSS Текстовая версия Сейчас: 18th July 2018 - 14:06
Рейтинг@Mail.ru


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