Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 + GCC Константные поля в структуре
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
nanorobot
В дивайсе два однотипных канала, которые могут параметрироваться. Канал описывется структурой, в которой, помимо полей-параметров, имеются константные поля, описывающие привязку конкретного канала к железу, например
кнопки, леды, NSS ноги SPI, которые хотелось бы инициализировать при об'явлении переменной типа TChannel адресами соответсвующих пинов в bit-bang области. Нижеприведенный код (условный), компилятор проглатывает, но соответсвующие поля не инициализирует.


CODE
typedef struct _Channel{
unsigned long int * const NSS; // нога NSS
unsigned long int * const LEDR; // красный светодиод
unsigned long int * const LEDG; // зеленый светодиод
...
...
}TChannel;



TChannel Channel1 = {.NSS = GPIOA_PIN_1, .LEDR = GPIOC_PIN15, .LEDG = GPIOD_PIN9};


макросы типа GPIOx_PINy не привожу, в силу их очевидности, но в их работоспособности убедился экспериментально.

Подобный финт в IAR прокатывал, там в таких полях я даже const не использовал.
В ГСС пробовал и с const и без него, один х.
Чисто константные структуры инициализируются, да. А инициализировать часть полей неконстантной структуры не удается.
Во всех случаях речь идет об инициализации при об'явлении экземпляра типа TChannel;

Сергей Борщ
Цитата(nanorobot @ Apr 4 2015, 07:29) *
В ГСС пробовал и с const и без него, один х.
В коде криминала не видно. Поведение напоминает отсутствие копирования начальных значений секции .data в стартовом коде. А просто int a = 1234; работает? Если нет - смотреть реализацию cstartup. Или архив с минимальным проектом приложите.
nanorobot
Цитата(Сергей Борщ @ Apr 4 2015, 11:21) *
В коде криминала не видно. Поведение напоминает отсутствие копирования начальных значений секции .data в стартовом коде. А просто int a = 1234; работает? Если нет - смотреть реализацию cstartup. Или архив с минимальным проектом приложите.


Хмм... uint32_t A = 123 инициализируется значением 0x55555555 да и все другие тоже. startup от ChibiOs, будем искать...

Цитата(nanorobot @ Apr 4 2015, 11:34) *
Хмм... uint32_t A = 123 инициализируется значением 0x55555555 да и все другие тоже. startup от ChibiOs, будем искать...



Как оказалось, эффект имеет место только при компиляции проекта в RAM(пока размер позволяет, экономлю ресурс флэш). При компиляции во FLASH все Ок. Благодарю за помощь.
Сергей Борщ
Цитата(nanorobot @ Apr 4 2015, 09:03) *
Как оказалось, эффект имеет место только при компиляции проекта в RAM
Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера?
nanorobot
Цитата(Сергей Борщ @ Apr 4 2015, 14:16) *
Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера?

Конечно непорядок. но хоть какая то ясность, в смысле не "полтергейст" Буду разбираться со скриптом линкера, отличие только в нем - поправил на скорую руку. До некоторого об'ема кода проблем не было.
Непомнящий Евгений
К инициализации отношения не имеет, но все же

volatile unsigned long int * const NSS;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.