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

    

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

Добрый день.

В документации MDK-ARM описана возможность размещения переменной по заданному адресу.

Например

int x2 __attribute__((at(0x12000))) = 10;

 

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

 

Спасибо!

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


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

Три способа:

 

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

 

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

 

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

Изменено пользователем IgorKossak
бездумное цитирование

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


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

В файле линкера организовать сегмент и при декларации массива указать его использование в attr.

Как в MDK не знаю, возможно имя сегмента указать вместо at(0x12000).

Это обеспечит гарантию, что компилятор будет "знать" что этот адрес занят, и не будет накладок.

В приведенном Вами коде это не гарантируется.

 

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


Ссылка на сообщение
Поделиться на другие сайты
3) char *Buffer=(char*)0x38000000; Обращаться Buffer=j;

Никому больше такое не говорите :biggrin:

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


Ссылка на сообщение
Поделиться на другие сайты
Никому больше такое не говорите :biggrin:

Ну, вся работа с регистрами периферии так строится - ничего же ;) Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию.

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


Ссылка на сообщение
Поделиться на другие сайты
Ну, вся работа с регистрами периферии так строится - ничего же ;) Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию.

Регистры это заранее определенные области, а компилятор размещает переменные где захочет в соответствии с линкерскриптом. Указали возможность 3 способами, первый из которых как раз указание линкеру. Тогда это сработает, да. Но способ писать по адресу подразумевался как отдельный способ без шаманства с линкерскриптом :rolleyes: В таком случае можно затереть какие-нибудь переменные.

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


Ссылка на сообщение
Поделиться на другие сайты
В файле линкера организовать сегмент и при декларации массива указать его использование в attr.

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

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


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

 

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

 

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

 

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

 

Куда вписывать #pragma section и как объявлять массив в данном случае? Извините, не делал такого раньше. Поэтому, если можете, чуть подробнее.

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


Ссылка на сообщение
Поделиться на другие сайты
Ну, вся работа с регистрами периферии так строится - ничего же ;)

Вообще то не так :)

 

char *Buffer=(char*)0x38000000;

 

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

 

надо так

#define Buffer ((char*)0x38000000)

 

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


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

Объявил переменную в секции 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)));

 

?

post-99126-1531054211_thumb.png

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


Ссылка на сообщение
Поделиться на другие сайты
Ну, вся работа с регистрами периферии так строится - ничего же ;) Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию.

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Так как всё таки записать эту секцию для массива в 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

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


Ссылка на сообщение
Поделиться на другие сайты
Ведь все есть в мануале на Keil. Вот первые же ссылки, который дал гугль:

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

http://www.keil.com/support/man/docs/armcc...59124982450.htm

Там только регион указан, а мне по адресу нужно.

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


Ссылка на сообщение
Поделиться на другие сайты
Там только регион указан, а мне по адресу нужно.

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

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

 

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти