Перейти к содержанию
    

STM32 + GCC Константные поля в структуре

В дивайсе два однотипных канала, которые могут параметрироваться. Канал описывется структурой, в которой, помимо полей-параметров, имеются константные поля, описывающие привязку конкретного канала к железу, например

кнопки, леды, 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;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ГСС пробовал и с const и без него, один х.
В коде криминала не видно. Поведение напоминает отсутствие копирования начальных значений секции .data в стартовом коде. А просто int a = 1234; работает? Если нет - смотреть реализацию cstartup. Или архив с минимальным проектом приложите.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В коде криминала не видно. Поведение напоминает отсутствие копирования начальных значений секции .data в стартовом коде. А просто int a = 1234; работает? Если нет - смотреть реализацию cstartup. Или архив с минимальным проектом приложите.

 

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

 

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

 

 

Как оказалось, эффект имеет место только при компиляции проекта в RAM(пока размер позволяет, экономлю ресурс флэш). При компиляции во FLASH все Ок. Благодарю за помощь.

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как оказалось, эффект имеет место только при компиляции проекта в RAM
Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера?

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К инициализации отношения не имеет, но все же

 

volatile unsigned long int * const NSS;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...