реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32 + GCC Константные поля в структуре, Как инициализировать константные поля структуры?
nanorobot
сообщение Apr 4 2015, 05:29
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



В дивайсе два однотипных канала, которые могут параметрироваться. Канал описывется структурой, в которой, помимо полей-параметров, имеются константные поля, описывающие привязку конкретного канала к железу, например
кнопки, леды, 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;

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 4 2015, 06:21
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Apr 4 2015, 07:03
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Сергей Борщ @ 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, 07:03
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 4 2015, 09:16
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(nanorobot @ Apr 4 2015, 09:03) *
Как оказалось, эффект имеет место только при компиляции проекта в RAM
Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Apr 4 2015, 10:12
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Сергей Борщ @ Apr 4 2015, 14:16) *
Все равно непорядок. Должно работать и там и там. Варианты компиляции отличаются только скриптом линкера?

Конечно непорядок. но хоть какая то ясность, в смысле не "полтергейст" Буду разбираться со скриптом линкера, отличие только в нем - поправил на скорую руку. До некоторого об'ема кода проблем не было.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Apr 6 2015, 06:07
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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

volatile unsigned long int * const NSS;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 20:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016