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

Keil __attribute((at(address))

Добрый день!

 

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

 

__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)).

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

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


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

Если память не изменяет, выравнивание управляется прагмами... Но точно не скажу: не сталкивался с такой проблемой, а посему и не пытался решить.

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


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

Если это константа, зашитая на заводе, так и обращайтесь к ней по указателю, как вы и делаете.

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


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

Добрый день!

 

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

__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. Та же ошибка.

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

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


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

Думаю, это связано с тем, что данный адрес - не RAM.

Можно сослаться на uint32_t по выровненному адресу 0x1FFF75A8, прочитать, и выбрать из него нужное uint16_t.

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


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

Проверил, не получается применить __attribute((at( XXXX ))) с любым невыровненным адресом, пусть то даже ОЗУ. Конечно, я в итоге считываю её по указателю, но уже хочется знать, можно ли этот атрибут как-то использовать с невыровненными адресами. Может я какую-то настройку не могу найти. Ведь это может еще пригодится.

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


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

И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));

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


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

И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));

По-любому не работает. И, кстати, замечал, что под KEIL __attribute без замыкающих подчеркиваний тоже съедается.

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


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

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

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

Извернуться, конечно, и тут можно, но есть ли смысл?

 

Сейчас использую #define VREFINT_CAL (*(uint16_t*)(0x1FFF75AA)).

Замечательный вариант, только __IO потеряли.

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


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

Спасибо, aaarrr. Теперь понятно, почему нельзя сделать этот адрес невыровненным.

 

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


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

а как такое же сделать на 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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...