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

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

|
Добрый день. В документации MDK-ARM описана возможность размещения переменной по заданному адресу. Например int x2 __attribute__((at(0x12000))) = 10;
А как массив разместить в определенном адресном пространстве (может как-то через первый элемент)?
Спасибо!
|
|
|
|
|
Jul 7 2018, 13:46
|

Местный
  
Группа: Участник
Сообщений: 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
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jul 7 2018, 20:05
|
Участник

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

|
Можно так. const uint16_t NAME [] __attribute__((at(0x08002000))) = {...}
|
|
|
|
|
Jul 8 2018, 02:22
|
Участник

Группа: Участник
Сообщений: 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 и как объявлять массив в данном случае? Извините, не делал такого раньше. Поэтому, если можете, чуть подробнее.
|
|
|
|
|
Jul 8 2018, 08:39
|

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

|
Цитата(aaarrr @ Jul 7 2018, 19:01)  Ну, вся работа с регистрами периферии так строится - ничего же  Вообще то не так  char *Buffer=(char*)0x38000000; снижает скорость и увеличивает расход памяти! потому что лишняя переменная вводится... надо так #define Buffer ((char*)0x38000000)
|
|
|
|
|
Jul 8 2018, 12:50
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 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))); ?
|
|
|
|
|
Jul 8 2018, 13:04
|
Участник

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

|
Цитата(aaarrr @ Jul 7 2018, 19:01)  Ну, вся работа с регистрами периферии так строится - ничего же  Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию. Так как всё таки записать эту секцию для массива в IRAM2 например int Arr [1024]? С началом по конкретному адресу.
Сообщение отредактировал quandr - Jul 8 2018, 13:08
|
|
|
|
|
Jul 8 2018, 15:42
|
Участник

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

|
Цитата(Forger @ Jul 8 2018, 17:08)  Там только регион указан, а мне по адресу нужно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|