|
|
  |
mspgcc4 и MSP430F2132, Компилятор ругается на структуру TLV_bits |
|
|
|
Aug 23 2010, 17:23
|
Участник

Группа: Участник
Сообщений: 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 что я делаю не так?
|
|
|
|
|
Aug 23 2010, 18:26
|
Участник

Группа: Участник
Сообщений: 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) - можно вытянуть сборку, а можно и собрать из исходников
|
|
|
|
|
Aug 24 2010, 04:38
|

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

|
Цитата(demiurg_spb @ Aug 23 2010, 22:46)  Попробуйте обойтись без асмовых вставок. Дело скорее всего не в асмовых вставках. Для начала может просто разделить описание структуры и привязку к константе во флеше. Доб.© static const volatile stFlashData __SEG_A__ FlashData;// = FACTORY_SETTINGS; - mspgcc4 скушал без вопросов. Если у вас такое не сработает - значит, в новой версии что-то сломали (у меня версия конца прошлого года) Хотя, у меня не пишется по адресу, а кладётся в секцию. Сейчас попробую привязать к адресу. Доб.2static const volatile stFlashData FlashData asm("0x1080");// = FACTORY_SETTINGS; - OK
Сообщение отредактировал MrYuran - Aug 24 2010, 04:49
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 24 2010, 11:08
|
Участник

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

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

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 24 2010, 20:12
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Aug 25 2010, 10:30
|

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

|
Цитата(dimay192 @ Aug 23 2010, 22:26)  логичнее взять отсюда http://mspgcc4.sourceforge.net/ (свежайшая сборка, базируется на gcc-4.4.3) - можно вытянуть сборку, а можно и собрать из исходников Давненько там не бывал, и где там откуда чего вытягивать? В "Downloads" вытягивается какой-то непонятный zip на 400кБ, в котором некоторое борохло и какой-то лянчер, непонятно чего делающий Люди! Помогите научиться собирать MSPGCC под виндой! Ну и вообще, собирать...
Сообщение отредактировал MrYuran - Aug 25 2010, 11:04
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 25 2010, 11:47
|
Участник

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

|
Цитата(MrYuran @ Aug 25 2010, 16:30)  Давненько там не бывал, и где там откуда чего вытягивать? В "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
|
|
|
|
|
Aug 25 2010, 12:09
|
Участник

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

|
Цитата(MrYuran @ Aug 25 2010, 18:00)  configure make install ?  Да не, вызовом скрипта buildgcc.sh: svn checkout https://mspgcc4.svn.sourceforge.net/svnroot/mspgcc4cd mspgcc4 && sh buildgcc.sh
|
|
|
|
|
Aug 25 2010, 13:50
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|