ISK2010 0 28 октября, 2015 Опубликовано 28 октября, 2015 (изменено) · Жалоба Добрый день! Пытаюсь сделать так: __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)). Изменено 28 октября, 2015 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 28 октября, 2015 Опубликовано 28 октября, 2015 · Жалоба Если память не изменяет, выравнивание управляется прагмами... Но точно не скажу: не сталкивался с такой проблемой, а посему и не пытался решить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 октября, 2015 Опубликовано 28 октября, 2015 · Жалоба Если это константа, зашитая на заводе, так и обращайтесь к ней по указателю, как вы и делаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 28 октября, 2015 Опубликовано 28 октября, 2015 (изменено) · Жалоба Добрый день! Пытаюсь сделать так: __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. Та же ошибка. Изменено 28 октября, 2015 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 октября, 2015 Опубликовано 28 октября, 2015 · Жалоба Думаю, это связано с тем, что данный адрес - не RAM. Можно сослаться на uint32_t по выровненному адресу 0x1FFF75A8, прочитать, и выбрать из него нужное uint16_t. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 29 октября, 2015 Опубликовано 29 октября, 2015 · Жалоба Проверил, не получается применить __attribute((at( XXXX ))) с любым невыровненным адресом, пусть то даже ОЗУ. Конечно, я в итоге считываю её по указателю, но уже хочется знать, можно ли этот атрибут как-то использовать с невыровненными адресами. Может я какую-то настройку не могу найти. Ведь это может еще пригодится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexandermas 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба И правильно, ошибка синтаксиса. в кейле это должно быть так __IO uint16_t __attribute__((at(xхххххххх))); По-любому не работает. И, кстати, замечал, что под KEIL __attribute без замыкающих подчеркиваний тоже съедается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба Можно ли как-то в Keil с помощью атрибута at расположить переменную по не выровненному по 4байта адресу? Нельзя: каждый at превращается в секцию линкера, а они размещаются с выравниванием не менее 4. Извернуться, конечно, и тут можно, но есть ли смысл? Сейчас использую #define VREFINT_CAL (*(uint16_t*)(0x1FFF75AA)). Замечательный вариант, только __IO потеряли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба Спасибо, aaarrr. Теперь понятно, почему нельзя сделать этот адрес невыровненным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k000858 0 6 ноября, 2015 Опубликовано 6 ноября, 2015 · Жалоба а как такое же сделать на GCC? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 6 ноября, 2015 Опубликовано 6 ноября, 2015 · Жалоба а как такое же сделать на 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться