kvandr 0 7 июля, 2018 Опубликовано 7 июля, 2018 (изменено) · Жалоба Добрый день. В документации MDK-ARM описана возможность размещения переменной по заданному адресу. Например int x2 __attribute__((at(0x12000))) = 10; А как массив разместить в определенном адресном пространстве (может как-то через первый элемент)? Спасибо! Изменено 5 марта, 2023 пользователем haker_fox Тема была поднята недавно. Перенёс в соответствующий раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 7 июля, 2018 Опубликовано 7 июля, 2018 (изменено) · Жалоба Три способа: 1) Сделать в линкере секцию и через #pragma section объявлять массив 2) Так же как вы написали : char Buffer[1024] __attribute__((at(0x38800000))); 3) char *Buffer=(char*)0x38000000; Обращаться Buffer=j; Изменено 12 июля, 2018 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 7 июля, 2018 Опубликовано 7 июля, 2018 · Жалоба В файле линкера организовать сегмент и при декларации массива указать его использование в attr. Как в MDK не знаю, возможно имя сегмента указать вместо at(0x12000). Это обеспечит гарантию, что компилятор будет "знать" что этот адрес занят, и не будет накладок. В приведенном Вами коде это не гарантируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 июля, 2018 Опубликовано 7 июля, 2018 · Жалоба 3) char *Buffer=(char*)0x38000000; Обращаться Buffer=j; Никому больше такое не говорите :biggrin: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 июля, 2018 Опубликовано 7 июля, 2018 · Жалоба Никому больше такое не говорите :biggrin: Ну, вся работа с регистрами периферии так строится - ничего же ;) Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 июля, 2018 Опубликовано 7 июля, 2018 · Жалоба Ну, вся работа с регистрами периферии так строится - ничего же ;) Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию. Регистры это заранее определенные области, а компилятор размещает переменные где захочет в соответствии с линкерскриптом. Указали возможность 3 способами, первый из которых как раз указание линкеру. Тогда это сработает, да. Но способ писать по адресу подразумевался как отдельный способ без шаманства с линкерскриптом :rolleyes: В таком случае можно затереть какие-нибудь переменные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pnp_mechanic 2 7 июля, 2018 Опубликовано 7 июля, 2018 · Жалоба Можно так. const uint16_t NAME [] __attribute__((at(0x08002000))) = {...} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба В файле линкера организовать сегмент и при декларации массива указать его использование в attr. Я тоже за такой подход. Т.е. конкретными адресами пусть занимается файл линкера. Всегда так делаем. Правда используем IAR, но это сути вообще не менят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kvandr 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Три способа: 1) Сделать в линкере секцию и через #pragma section объявлять массив 2) Так же как вы написали : char Buffer[1024] __attribute__((at(0x38800000))); 3) char *Buffer=(char*)0x38000000; Обращаться Buffer=j; Куда вписывать #pragma section и как объявлять массив в данном случае? Извините, не делал такого раньше. Поэтому, если можете, чуть подробнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Ну, вся работа с регистрами периферии так строится - ничего же ;) Вообще то не так :) char *Buffer=(char*)0x38000000; снижает скорость и увеличивает расход памяти! потому что лишняя переменная вводится... надо так #define Buffer ((char*)0x38000000) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Объявил переменную в секции 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))); ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kvandr 0 8 июля, 2018 Опубликовано 8 июля, 2018 (изменено) · Жалоба Ну, вся работа с регистрами периферии так строится - ничего же ;) Другое дело, что при таком подходе следует спрятать от линкера тот диапазон адресов, где происходит ручное распределение. А если так, то проще уж сразу определить отдельную секцию. Так как всё таки записать эту секцию для массива в IRAM2 например int Arr [1024]? С началом по конкретному адресу. Изменено 8 июля, 2018 пользователем quandr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Так как всё таки записать эту секцию для массива в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kvandr 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Ведь все есть в мануале на Keil. Вот первые же ссылки, который дал гугль: http://www.keil.com/support/man/docs/armli...62066000009.htm http://www.keil.com/support/man/docs/armcc...59124982450.htm Там только регион указан, а мне по адресу нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Там только регион указан, а мне по адресу нужно. Эх, совсем молодежь обленела .... :angry2: http://www.keil.com/support/man/docs/armli...62066000571.htm Имхо, вместо размещения объектов по конкретному адресу, лучше использовать размещение в секциях, а размещение самих секций делать в соотв. scatter файле (скрипт линкера). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться