реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Keil __attribute((at(address))
ISK2010
сообщение Oct 28 2015, 14:59
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Добрый день!

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

Код
__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 - Oct 28 2015, 18:33
Go to the top of the page
 
+Quote Post
SII
сообщение Oct 28 2015, 15:07
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Если память не изменяет, выравнивание управляется прагмами... Но точно не скажу: не сталкивался с такой проблемой, а посему и не пытался решить.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 28 2015, 15:12
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если это константа, зашитая на заводе, так и обращайтесь к ней по указателю, как вы и делаете.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Oct 28 2015, 15:36
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



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

Сообщение отредактировал IgorKossak - Oct 28 2015, 18:34
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 28 2015, 15:43
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Думаю, это связано с тем, что данный адрес - не RAM.
Можно сослаться на uint32_t по выровненному адресу 0x1FFF75A8, прочитать, и выбрать из него нужное uint16_t.
Go to the top of the page
 
+Quote Post
ISK2010
сообщение Oct 29 2015, 06:26
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Проверил, не получается применить __attribute((at( XXXX ))) с любым невыровненным адресом, пусть то даже ОЗУ. Конечно, я в итоге считываю её по указателю, но уже хочется знать, можно ли этот атрибут как-то использовать с невыровненными адресами. Может я какую-то настройку не могу найти. Ведь это может еще пригодится.
Go to the top of the page
 
+Quote Post
alexandermas
сообщение Nov 4 2015, 14:29
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 13-07-10
Пользователь №: 58 429



И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Nov 4 2015, 19:46
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(alexandermas @ Nov 4 2015, 15:29) *
И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));

По-любому не работает. И, кстати, замечал, что под KEIL __attribute без замыкающих подчеркиваний тоже съедается.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 4 2015, 20:10
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ISK2010 @ Oct 28 2015, 17:59) *
Можно ли как-то в Keil с помощью атрибута at расположить переменную по не выровненному по 4байта адресу?

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

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

Замечательный вариант, только __IO потеряли.
Go to the top of the page
 
+Quote Post
ISK2010
сообщение Nov 5 2015, 09:03
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Спасибо, aaarrr. Теперь понятно, почему нельзя сделать этот адрес невыровненным.
Go to the top of the page
 
+Quote Post
k000858
сообщение Nov 6 2015, 04:19
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



а как такое же сделать на GCC?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 6 2015, 05:37
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016