Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil __attribute((at(address))
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ISK2010
Добрый день!

Пытаюсь сделать так:

Код
__IO uint16_t VREFINT_CAL __attribute((at( 0x1FFF75AA ))); //Это калибровочная константа, которая зашита на заводе ST


И получаю ошибку:"BatTest Configuration/\.axf: Error: L6438E: __AT section main.o(.ARM.__AT_0x1FFF75AA) address 0x1fff75aa must be at least 4 byte aligned.".

Можно ли как-то в Keil с помощью атрибута at расположить переменную по не выровненному по 4байта адресу?

Сейчас использую #define VREFINT_CAL (*(uint16_t*)(0x1FFF75AA)).
SII
Если память не изменяет, выравнивание управляется прагмами... Но точно не скажу: не сталкивался с такой проблемой, а посему и не пытался решить.
ViKo
Если это константа, зашитая на заводе, так и обращайтесь к ней по указателю, как вы и делаете.
KnightIgor
Цитата(ISK2010 @ Oct 28 2015, 15:59) *
Добрый день!

Пытаюсь сделать так:
Код
__IO uint16_t VREFINT_CAL __attribute((at( 0x1FFF75AA ))); //Это калибровочная константа, которая зашита на заводе ST

И получаю ошибку:"BatTest Configuration/\.axf: Error: L6438E: __AT section main.o(.ARM.__AT_0x1FFF75AA) address 0x1fff75aa must be at least 4 byte aligned.".

Попробовал Ваш пример под KEIL. Та же ошибка.
ViKo
Думаю, это связано с тем, что данный адрес - не RAM.
Можно сослаться на uint32_t по выровненному адресу 0x1FFF75A8, прочитать, и выбрать из него нужное uint16_t.
ISK2010
Проверил, не получается применить __attribute((at( XXXX ))) с любым невыровненным адресом, пусть то даже ОЗУ. Конечно, я в итоге считываю её по указателю, но уже хочется знать, можно ли этот атрибут как-то использовать с невыровненными адресами. Может я какую-то настройку не могу найти. Ведь это может еще пригодится.
alexandermas
И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));
KnightIgor
Цитата(alexandermas @ Nov 4 2015, 15:29) *
И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));

По-любому не работает. И, кстати, замечал, что под KEIL __attribute без замыкающих подчеркиваний тоже съедается.
aaarrr
Цитата(ISK2010 @ Oct 28 2015, 17:59) *
Можно ли как-то в Keil с помощью атрибута at расположить переменную по не выровненному по 4байта адресу?

Нельзя: каждый at превращается в секцию линкера, а они размещаются с выравниванием не менее 4.
Извернуться, конечно, и тут можно, но есть ли смысл?

Цитата(ISK2010 @ Oct 28 2015, 17:59) *
Сейчас использую #define VREFINT_CAL (*(uint16_t*)(0x1FFF75AA)).

Замечательный вариант, только __IO потеряли.
ISK2010
Спасибо, aaarrr. Теперь понятно, почему нельзя сделать этот адрес невыровненным.
k000858
а как такое же сделать на GCC?
Сергей Борщ
Цитата(k000858 @ Nov 6 2015, 07:19) *
а как такое же сделать на GCC?

Код
__attribute__((section(".hw_settings")))
extern hw_settings const volatile HW_settings =
{
    1,
    F_OSC,
    {

В скрипте линкера добавить выходную секцию в нужное место выходной секции .text или, при необходимости, завести новый регион памяти, куда и положить эту секцию:
Код
MEMORY
{
    ........
    HW_SETTINGS(r)      : ORIGIN = 0x08000000 + 3K,         LENGTH =  1K
    .........
}

SECTIONS
{
    ......
    .hw_settings :
    {
        KEEP(*(.hw_settings*))
    } > HW_SETTINGS
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.