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

 
 
 
Reply to this topicStart new topic
> mspgcc4 и MSP430F2132, Компилятор ругается на структуру TLV_bits
dimay192
сообщение Aug 23 2010, 17:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Вот собственно проблема...
Структура TLV_bits - структура, содержащая калибровочные константы в сегмента А флеш памяти.
Она описана в заголовочном файле msp430/include/msp430/tlv.h компилятора mspgcc4.
Само собой разумеется, что ее инициализировать не надо (она содержит заводские установки).
Но вот как это объяснить комлилятору, который на нее ругается следующими словами:

/opt/msp430-gcc-4.4.3/lib/gcc/msp430/4.4.3/../../../../msp430/include/msp430/tlv.h:125: ошибка: структура ‘TLV_bits’ с неинициализированными константными элементами
/opt/msp430-gcc-4.4.3/lib/gcc/msp430/4.4.3/../../../../msp430/include/msp430/tlv.h:125: ошибка: неинициализированная константа ‘TLV_bits’
make: *** [main.o] Ошибка 1

Может подсунуть компилятору опции какие?... но вот какие?
в make-файле я задаю следующие:

CC = msp430-gcc
CXX = msp430-g++
CFLAGS = -mmcu=${CPU} -O0 -Wall -g
CXXFLAGS = -mmcu=${CPU} -O0 -Wall -g -fno-rtti
что я делаю не так?
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 23 2010, 17:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Не пользую GCC. Можно для интереса приаттачить этот хедер к вашему сообщению? Откуда константы в хедере? Там же обычно только типизация данных бывает.

P.S. Чудеса какие-то. Не могу скачать mspgcc-20081230.exe с sourceforge.net sad.gif Файл нулевого размера качается.
Go to the top of the page
 
+Quote Post
dimay192
сообщение Aug 23 2010, 18:26
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Цитата(rezident @ Aug 23 2010, 23:43) *
...Откуда константы в хедере? Там же обычно только типизация данных бывает.


Эммм.... ну все верно! В хидере tlv.h нет никаких констант!...
По сути структура TLV_bits является интерефейсом к данным, зашитым на заводе в калибровочной области контроллера

Цитата(rezident @ Aug 23 2010, 23:43) *
Можно для интереса приаттачить этот хедер к вашему сообщению?


Файл не получается загрузить! Полностью процитирую его содержимое ниже:
Код
#ifndef __msp430_headers_tlv_h
#define __msp430_headers_tlv_h

/* tlv.h
*
* mspgcc project: MSP430 device headers
* tlv structures
*
* (c) 2008 by Sergey A. Borshch <sb-sf@users.sf.net>
*
* $Id: tlv.h,v 1.2 2009/01/11 23:11:48 sb-sf Exp $
*/

/* Switches: none */


/* TLV Calibration Data Structure */
#define TAG_DCO_30             0x01      /* Tag for DCO30  Calibration Data */
#define TAG_ADC12_1            0x10      /* Tag for ADC12_1 Calibration Data */
#define TAG_EMPTY              0xFE      /* Tag for Empty Data Field in Calibration Data */

#define TLV_CHECKSUM_          0x10C0    /* TLV CHECK SUM */
sfrw(TLV_CHECKSUM, TLV_CHECKSUM_);
#define TLV_DCO_30_TAG_        0x10F6    /* TLV TAG_DCO30 TAG */
sfrb(TLV_DCO_30_TAG, TLV_DCO_30_TAG_);
#define TLV_DCO_30_LEN_        0x10F7    /* TLV TAG_DCO30 LEN */
sfrb(TLV_DCO_30_LEN, TLV_DCO_30_LEN_);
#define TLV_ADC12_1_TAG_       0x10DA    /* TLV ADC12_1 TAG */
sfrb(TLV_ADC12_1_TAG, TLV_ADC12_1_TAG_);
#define TLV_ADC12_1_LEN_       0x10DB    /* TLV ADC12_1 LEN */
sfrb(TLV_ADC12_1_LEN, TLV_ADC12_1_LEN_);

#define CAL_ADC_25T85          0x0007    /* Index for 2.5V/85Deg Cal. Value */
#define CAL_ADC_25T30          0x0006    /* Index for 2.5V/30Deg Cal. Value */
#define CAL_ADC_25VREF_FACTOR  0x0005    /* Index for 2.5V Ref. Factor */
#define CAL_ADC_15T85          0x0004    /* Index for 1.5V/85Deg Cal. Value */
#define CAL_ADC_15T30          0x0003    /* Index for 1.5V/30Deg Cal. Value */
#define CAL_ADC_15VREF_FACTOR  0x0002    /* Index for ADC 1.5V Ref. Factor */
#define CAL_ADC_OFFSET         0x0001    /* Index for ADC Offset */
#define CAL_ADC_GAIN_FACTOR    0x0000    /* Index for ADC Gain Factor */

#define CALDCO_16MHZ_         0x10F8    /* DCOCTL  Calibration Data for 16MHz */
sfrb(CALDCO_16MHZ, CALDCO_16MHZ_);
#define CALBC1_16MHZ_         0x10F9    /* BCSCTL1 Calibration Data for 16MHz */
sfrb(CALBC1_16MHZ, CALBC1_16MHZ_);
#define CALDCO_12MHZ_         0x10FA    /* DCOCTL  Calibration Data for 12MHz */
sfrb(CALDCO_12MHZ, CALDCO_12MHZ_);
#define CALBC1_12MHZ_         0x10FB    /* BCSCTL1 Calibration Data for 12MHz */
sfrb(CALBC1_12MHZ, CALBC1_12MHZ_);
#define CALDCO_8MHZ_          0x10FC    /* DCOCTL  Calibration Data for 8MHz */
sfrb(CALDCO_8MHZ, CALDCO_8MHZ_);
#define CALBC1_8MHZ_          0x10FD    /* BCSCTL1 Calibration Data for 8MHz */
sfrb(CALBC1_8MHZ, CALBC1_8MHZ_);
#define CALDCO_1MHZ_          0x10FE    /* DCOCTL  Calibration Data for 1MHz */
sfrb(CALDCO_1MHZ, CALDCO_1MHZ_);
#define CALBC1_1MHZ_          0x10FF    /* BCSCTL1 Calibration Data for 1MHz */
sfrb(CALBC1_1MHZ, CALBC1_1MHZ_);

#define CAL_DCO_16MHZ          0x0000    /* Index for DCOCTL  Calibration Data for 16MHz */
#define CAL_BC1_16MHZ          0x0001    /* Index for BCSCTL1 Calibration Data for 16MHz */
#define CAL_DCO_12MHZ          0x0002    /* Index for DCOCTL  Calibration Data for 12MHz */
#define CAL_BC1_12MHZ          0x0003    /* Index for BCSCTL1 Calibration Data for 12MHz */
#define CAL_DCO_8MHZ           0x0004    /* Index for DCOCTL  Calibration Data for 8MHz */
#define CAL_BC1_8MHZ           0x0005    /* Index for BCSCTL1 Calibration Data for 8MHz */
#define CAL_DCO_1MHZ           0x0006    /* Index for DCOCTL  Calibration Data for 1MHz */
#define CAL_BC1_1MHZ           0x0007    /* Index for BCSCTL1 Calibration Data for 1MHz */

#ifndef __ASSEMBLER__
/* Structured declaration */
typedef enum
{
    DCO_30_TAG      = 0x01,
    ADC12_1_TAG     = 0x10,
    EMPTY_TAG       = 0xFE,

} tlv_tags_t;

typedef struct
{
    unsigned char tag;
    unsigned char length;
    struct
    {
        unsigned char DCO_16MHZ;
        unsigned char BC1_16MHZ;
        unsigned char DCO_12MHZ;
        unsigned char BC1_12MHZ;
        unsigned char DCO_8MHZ;
        unsigned char BC1_8MHZ;
        unsigned char DCO_1MHZ;
        unsigned char BC1_1MHZ;
    } value;
} const dco_30_tag_t;

typedef struct
{
    unsigned char tag;
    unsigned char length;
    struct
    {
        unsigned int ADC_GAIN_FACTOR;
        unsigned int ADC_OFFSET;
        unsigned int ADC_15VREF_FACTOR;
        unsigned int ADC_15T30;
        unsigned int ADC_15T85;
        unsigned int ADC_25VREF_FACTOR;
        unsigned int ADC_25T30;
        unsigned int ADC_25T85;
    } value;
} const adc12_1_tag_t;

typedef struct
{
    unsigned char tag;
    unsigned char length;
} const empty_tag_t;

struct
{
    unsigned int checksum;
    empty_tag_t  empty;
    unsigned int dummy[11];
    adc12_1_tag_t adc12_1;
    dco_30_tag_t dco_30;
} const volatile TLV_bits asm("0x10c0");
#endif  // __ASSEMBLER__

#endif  /* __msp430_headers_tlv_h */


Как видиде, структура TLV_bits определена как const volatile и привязана к фиксированному адресу.
Вот с ней то компилятор и не подружился!!!!!

Цитата(rezident @ Aug 23 2010, 23:43) *
P.S. Чудеса какие-то. Не могу скачать mspgcc-20081230.exe с sourceforge.net sad.gif Файл нулевого размера качается.


логичнее взять отсюда http://mspgcc4.sourceforge.net/ (свежайшая сборка, базируется на gcc-4.4.3) - можно вытянуть сборку, а можно и собрать из исходников
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 23 2010, 18:46
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Попробуйте обойтись без асмовых вставок.
Код
typedef struct
{
    uint8_t a;
    uint8_t b;
    uint8_t c;
} some_struct_t;

#define some_struct (*(const volatile some_struct_t*)(0x10c0))


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 24 2010, 04:38
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(demiurg_spb @ Aug 23 2010, 22:46) *
Попробуйте обойтись без асмовых вставок.

Дело скорее всего не в асмовых вставках.
Для начала может просто разделить описание структуры и привязку к константе во флеше.

Доб.©
static const volatile stFlashData __SEG_A__ FlashData;// = FACTORY_SETTINGS; - mspgcc4 скушал без вопросов.
Если у вас такое не сработает - значит, в новой версии что-то сломали (у меня версия конца прошлого года)
Хотя, у меня не пишется по адресу, а кладётся в секцию. Сейчас попробую привязать к адресу.
Доб.2
static const volatile stFlashData FlashData asm("0x1080");// = FACTORY_SETTINGS; - OK

Сообщение отредактировал MrYuran - Aug 24 2010, 04:49


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimay192
сообщение Aug 24 2010, 11:08
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Создал пустой проект (в котором только одна пустая ф-ция main()).
Для начала откомпилировал его как С-проект! Компиляция прошла успешно!
При попытке откомпилировать как С++ проект (в make файл добавляю строки CXX= msp430-g++ и CXXFLAGS= -mmcu=${CPU} -O2 -Wall -g -fno-rtti, + меняю расширение файла с .c на .cpp) опять вылазит сообщение, что типа структура TLV_bits с неинициализированными константными членами...
Я бы и рад использовать С компилятор. Но штука в том, что проект у меня уже написан и отлажен в IARе как С++ - проект!
Переделывать его обратно в С желания большого нет! А с ИАРом дел больше иметь не хотся!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 24 2010, 11:14
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Может, ключиками какими поиграть, чтобы эти ошибки отключить?
Или попробуйте g++ из старой версии


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimay192
сообщение Aug 24 2010, 11:51
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Цитата(MrYuran @ Aug 24 2010, 17:14) *
Может, ключиками какими поиграть, чтобы эти ошибки отключить?
Или попробуйте g++ из старой версии


На сколько мне известно, ошибки отключить нельзя! Предупреждения можно...
На счет использовать предыдущую версию g++... тоже был бы не вариант...
нашел там как минимум две ошибки в хидерах для msp430x21x2... одна опечатка и одна ошибка типа past/copy...
Видать еще очень сырыми загововники были... В текущей версии исправлено...

Ой! че та не то наредактировал в собственных сообщениях...
короче, решение нашлось...
В заголовочный файл tlv.h нужно добавить три строчки

#ifdef __cplusplus
extern "C"
#endif //__cplusplus

перед структурой TLV_bits

Код
#ifdef __cplusplus
extern "C"
#endif //__cplusplus

struct
{
    unsigned int checksum;
    empty_tag_t  empty;
    unsigned int dummy[11];
    adc12_1_tag_t adc12_1;
    dco_30_tag_t dco_30;
} const volatile TLV_bits asm("0x10c0");

Эти три строчки в предыдущей версии mspgcc (3.2.3) присутствовали. В текущей (4.4.3) их убрали...
ЗАчем...?
Вопрос думаю следует адресовать автору заголовочного файла, Сергею Борщю

Сообщение отредактировал dimay192 - Aug 24 2010, 12:34
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 24 2010, 20:12
Сообщение #9


Гуру
******

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



Цитата(dimay192 @ Aug 24 2010, 14:51) *
Вопрос думаю следует адресовать автору заголовочного файла, Сергею Борщю
Скорее тем, кто этот файл перетаскивал в mspgcc4. Я его писал для mspgcc3. У меня на компе в исходниках от 27.01.09 extern "C" нет. Видимо кто-то уже потом исправлял, а автор mspgcc4 взял старую версию. И я не совсем понимаю, почему в плюсах это дает ошибку. Вот то, что там для plain C нет static - по моим понятиям является ошибкой и как я это упустил, а компилятор пропускал - загадка. Видимо из-за того, что я проверял на плюсах. Хорошо бы разобраться, почему в четвертой версии это в плюсах считается ошибкой. const лишь запрещает запись, а volatile показывает, что значение может появляться там неизвестным компилятору образом и сочетание const volatile для неинициализированной переменной (по моим понятиям) вполне законно.
Вот из описания самого gcc:
Цитата
-Wuninitialized
Warn if an automatic variable is used without first being initialized or if a variable may be clobbered by a setjmp call. In C++, warn if a non-static reference or non-static `const' member appears in a class without constructors.

If you want to warn about code which uses the uninitialized value of the variable in its own initializer, use the -Winit-self option.

These warnings occur for individual uninitialized or clobbered elements of structure, union or array variables as well as for variables which are uninitialized or clobbered as a whole. They do not occur for variables or elements declared volatile. Because these warnings depend on optimization, the exact variables or elements for which there are warnings will depend on the precise optimization options and version of GCC used.
То есть для volatile это даже предупреждения не должно генерить, не то что ошибку.


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Aug 25 2010, 10:30
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(dimay192 @ Aug 23 2010, 22:26) *
логичнее взять отсюда http://mspgcc4.sourceforge.net/ (свежайшая сборка, базируется на gcc-4.4.3) - можно вытянуть сборку, а можно и собрать из исходников

Давненько там не бывал, и где там откуда чего вытягивать? cranky.gif
В "Downloads" вытягивается какой-то непонятный zip на 400кБ, в котором некоторое борохло и какой-то лянчер, непонятно чего делающий

Люди! Помогите научиться собирать MSPGCC под виндой! Ну и вообще, собирать...

Сообщение отредактировал MrYuran - Aug 25 2010, 11:04


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimay192
сообщение Aug 25 2010, 11:47
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Цитата(MrYuran @ Aug 25 2010, 16:30) *
Давненько там не бывал, и где там откуда чего вытягивать? cranky.gif
В "Downloads" вытягивается какой-то непонятный zip на 400кБ, в котором некоторое борохло и какой-то лянчер, непонятно чего делающий

Люди! Помогите научиться собирать MSPGCC под виндой! Ну и вообще, собирать...


Чуть ниже нужно спуститься: All Files -> Каталог gcc-4.4.3-gdb-7.0.1-20100218 -> 20100218-msp430-gcc-4.4.3-gdb-7.0.1-insight-6.8.exe (9,5МБ)
Это уже собранный пакет (mspgcc+gdb).
"борохло" - это для самостоятельной сборки.
Под виндой пользую готовую сборку, пол линухой - собрал самостоятельно, там это в два шага делается...
в винде мутки какие-то с цигвином или МинГВ... в общем, ересь какая-то... не стал я заморачиваться...

Сообщение отредактировал dimay192 - Aug 25 2010, 11:48
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 25 2010, 12:00
Сообщение #12


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(dimay192 @ Aug 25 2010, 15:47) *
Под виндой пользую готовую сборку, пол линухой - собрал самостоятельно, там это в два шага делается...

configure
make install
?
rolleyes.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimay192
сообщение Aug 25 2010, 12:09
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Цитата(MrYuran @ Aug 25 2010, 18:00) *
configure
make install
?
rolleyes.gif


Да не, вызовом скрипта buildgcc.sh:

svn checkout https://mspgcc4.svn.sourceforge.net/svnroot/mspgcc4
cd mspgcc4 && sh buildgcc.sh
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 25 2010, 13:07
Сообщение #14


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(dimay192 @ Aug 25 2010, 16:09) *
Да не, вызовом скрипта buildgcc.sh:

Да, это надо сильно постараться, чтобы не получилось...
А под MinGW чем отличается?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimay192
сообщение Aug 25 2010, 13:50
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711



Цитата(MrYuran @ Aug 25 2010, 19:07) *
Да, это надо сильно постараться, чтобы не получилось...
А под MinGW чем отличается?


чес слово, не знаю, не пробовал... желания такого не возникало...
Сейчас пытаюсь получить рабочую среду (редактор,компилятор, отладчик,...) для линукса, чтобы можно было полностью уйти от винды...
IAR - единственно, что меня держит на ней...

То самое "барахло" на 400КБ, тоже меня по-началу смутило... подумал, ну блин, с нуля собирать что ли...
качнул, установил цигвин (gcc, wget, perl и еще что-то там нужно добавить к установке по умолчанию),
распаковал "барахло" в домашний каталог (через файл-манагер из под винды можно закинуть)
запускаем цигвин
меняем каталог, где лежит скрипт (куда мы только что распаковали)
$ cd $HOME/mspgcc4-20100815
запускаем скрипт
$ ./buildgcc.pl
Далее, отвечаем на вопросы, которые по ходу дела вываливаются (о версиях софта, что мы желаем установить)...
Сборка начинается...
Что делать с собранным пакетом в винде... Х. её З.... (может с этого места кто другой рассказ продолжит...)
Дальше я наткнулся на готовую сброку (20100218-msp430-gcc-4.4.3-gdb-7.0.1-insight-6.8.exe (9,5МБ)), которую чудесным образом до того момента не замечал...
на том мои эксперименты по сборке mspgcc для винды завершились... Может прижмет... Тогда продолжу...

По ходу дела возникает другой вопрос: как приладить GDB7.0.1, который находится в этой сборке к eclipse?
С предыдущим вариантом отладчика все понятно было... Была инструкция (весьма удачная, считаю) написанная для дураков...
http://www.levap.ru/2009/11/eclipse-mspgcc/
http://www.levap.ru/2009/12/debug-eclipse-gdb/
Что делать с текущей версией? Утилита msp430-gdbproxy в ней не наблюдается... А это значит, что текущая версия gdb (7.0.1) обходится как то без нее!
Но как? Я не понял!
И поэтому запустил версию gdb-7.0.1 с msp430-gdbproxy из предыдущей сборки mspgcc (3.2.3)
Вроде заработало! но коряво...
Все хреного... Все шатается...
Убожество...!
Может кто знает другие методы запуска gdb-7.0.1 из под eclipse?

Сообщение отредактировал dimay192 - Aug 25 2010, 14:44
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:14
Рейтинг@Mail.ru


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