|
|
  |
Keil __attribute((at(address)) |
|
|
|
Oct 28 2015, 14:59
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 28 2015, 15:36
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 4 2015, 14:29
|
Участник

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

|
И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх)));
|
|
|
|
|
Nov 4 2015, 20:10
|
Гуру
     
Группа: Свой
Сообщений: 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 потеряли.
|
|
|
|
|
Nov 6 2015, 05:37
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|