nanorobot 3 4 апреля, 2015 Опубликовано 4 апреля, 2015 · Жалоба В дивайсе два однотипных канала, которые могут параметрироваться. Канал описывется структурой, в которой, помимо полей-параметров, имеются константные поля, описывающие привязку конкретного канала к железу, например кнопки, леды, NSS ноги SPI, которые хотелось бы инициализировать при об'явлении переменной типа TChannel адресами соответсвующих пинов в bit-bang области. Нижеприведенный код (условный), компилятор проглатывает, но соответсвующие поля не инициализирует. 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 122 4 апреля, 2015 Опубликовано 4 апреля, 2015 · Жалоба В ГСС пробовал и с const и без него, один х.В коде криминала не видно. Поведение напоминает отсутствие копирования начальных значений секции .data в стартовом коде. А просто int a = 1234; работает? Если нет - смотреть реализацию cstartup. Или архив с минимальным проектом приложите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 4 апреля, 2015 Опубликовано 4 апреля, 2015 (изменено) · Жалоба В коде криминала не видно. Поведение напоминает отсутствие копирования начальных значений секции .data в стартовом коде. А просто int a = 1234; работает? Если нет - смотреть реализацию cstartup. Или архив с минимальным проектом приложите. Хмм... uint32_t A = 123 инициализируется значением 0x55555555 да и все другие тоже. startup от ChibiOs, будем искать... Хмм... uint32_t A = 123 инициализируется значением 0x55555555 да и все другие тоже. startup от ChibiOs, будем искать... Как оказалось, эффект имеет место только при компиляции проекта в RAM(пока размер позволяет, экономлю ресурс флэш). При компиляции во FLASH все Ок. Благодарю за помощь. Изменено 4 апреля, 2015 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 122 4 апреля, 2015 Опубликовано 4 апреля, 2015 · Жалоба Как оказалось, эффект имеет место только при компиляции проекта в RAMВсе равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 4 апреля, 2015 Опубликовано 4 апреля, 2015 · Жалоба Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера? Конечно непорядок. но хоть какая то ясность, в смысле не "полтергейст" Буду разбираться со скриптом линкера, отличие только в нем - поправил на скорую руку. До некоторого об'ема кода проблем не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 6 апреля, 2015 Опубликовано 6 апреля, 2015 · Жалоба К инициализации отношения не имеет, но все же volatile unsigned long int * const NSS; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться