Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: нужна помощь
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
forastr
Дали задание перегнать проет из win avr в iar(проект очень большой).Только установил IAR. помогите какой инфой для "самых маленьких" (начинающих) по iar и winavr на русском (как начать что делать).с каким трудностями предется столкнуться при переходе к iar?
KRS
1. Calling conversion разный, если в проекте есть asm исходники, которые вызываются из С надо будет переписывать. IAR использует два стека - один для возвратов, второй для локальных данных и параметров, которые в регистры не влезли.
2. Настройка линкера разная
3. Доступ к периферии разный, особенно в части битового доступа, но это наверное проще поправить дописав макросы.
...
forastr
Подскажите в IAR есть макрос-файл где определены типы uint8_t,uint32_t и как он называется?
Палыч
Есть, называется он stdint.h
forastr
Цитата(Палыч @ Jul 5 2011, 11:37) *
Есть, называется он stdint.h

Спасибо!

Продолжаю перегнать проет из смесм win+iar в iar для avr. Наткнулся на такой кусок такого кода:

Код
#if !defined(CONFIG_H)
#define  CONFIG_H 1
#include <main.h>
#define HW_VER          0x01            // hardware version
#define SW_VER        0x0004            // software version

// define EEPROM settings
__attribute__ ((section (".eeprom"))){
     uint16_t deviceid = 0x0558;
}
__attribute__ ((section (".eeprom")))
     uint8_t serial[] = "MSI245460711";    // store device serial
    
#endif /* !defined(CONFIG_H) */


При компиляции в старом проекте ошибок нету.
А в новом пректе следующие ошибки:
Error[Pe079]: expected a type specifier D:\forastr\Console\Console\My project\config\config.h 8
Error[Pe141]: unnamed prototyped parameters not allowed when body is present D:\forastr\Console\Console\My project\config\config.h 8
Warning[Pe177]: variable "deviceid" was declared but never referenced D:\forastr\Console\Console\My project\config\config.h 9
Error[Pe079]: expected a type specifier D:\forastr\Console\Console\My project\config\config.h 11
Error[Pe247]: function "__attribute__" has already been defined (at line 8) D:\forastr\Console\Console\My project\config\config.h 11
Error[Pe141]: unnamed prototyped parameters not allowed when body is present D:\forastr\Console\Console\My project\config\config.h 11
Error[Pe130]: expected a "{" D:\forastr\Console\Console\My project\config\config.h 12


Помогите,пожалуйста, разобраться с этим.
M_Andrey
#if !defined(CONFIG_H)
#define CONFIG_H 1
#include <main.h>
#define HW_VER 0x01 // hardware version
#define SW_VER 0x0004 // software version

__eeprom uint16_t deviceid = 0x0558;
__eeprom uint8_t serial[] = "MSI245460711"; // store device serial

#endif /* !defined(CONFIG_H) */
demiurg_spb
Глядя на ваши исходники, могу предположить о весьма скромном опыте программиста писавшего их...
Приготовьтесь к предварительному причёсыванию проекта.
А тупо перегонять исходники из под одного компилятора в другой - дело абсолютно бесполезное.
Вы бы лучше делали так чтобы этот проект собирался и в iar и в gcc.
Напишите файлик compiler.h в котором пропишите все зависимости от компилятора через макросы.
Это будет куда полезнее. Можете поискать в интернете открытые универсальные (в смысле компилятора) проекты и подглядеть идеи чтобы не изобретать велосипед.
forastr
Спассибо за помощь. Проект очень большой: кучу файлов включающих друг друга , использует библиотеки разных компиляторв. Я очень молодой специалист (4 курс) и еще тока учусь sm.gif) если честно то я сча в панике и не знаю с чего начать((

Цитата(M_Andrey @ Jul 5 2011, 13:28) *
#if !defined(CONFIG_H)
#define CONFIG_H 1
#include <main.h>
#define HW_VER 0x01 // hardware version
#define SW_VER 0x0004 // software version

__eeprom uint16_t deviceid = 0x0558;
__eeprom uint8_t serial[] = "MSI245460711"; // store device serial

#endif /* !defined(CONFIG_H) */



А чем можно объяснить эти ошибки?(ведь раньше компилировался, мб я в настройках проекта ошибся?)
XVR
Цитата(forastr @ Jul 6 2011, 11:10) *
А чем можно объяснить эти ошибки?(ведь раньше компилировался, мб я в настройках проекта ошибся?)
Тем, что __attribute__ это фича исключительно gcc (win avr)
forastr
Цитата(XVR @ Jul 6 2011, 06:29) *
Тем, что __attribute__ это фича исключительно gcc (win avr)

Ага ,вот оно как.понятно.спасибо.

Цитата
Можете поискать в интернете открытые универсальные (в смысле компилятора) проекты и подглядеть идеи чтобы не изобретать велосипед.


Не совсем понял то, чт Вы имели ввиду.Разъясните ,пожалуйста, или киньте ссылку.
XVR
Цитата(forastr @ Jul 6 2011, 12:52) *
Не совсем понял то, чт Вы имели ввиду.Разъясните ,пожалуйста, или киньте ссылку.
Имелось в виду, что все компиляторно зависимые части нужно собрать в один файл и завернуть в макросы, что бы использование их уже не отличалось для разных компиляторов. Например
common.h
Код
#ifdef __GNU__

#define EEPROM_ __attribute__ ((section (".eeprom")))

#else

#define EEPROM_ __eeprom

#endif


использование:
Код
#if !defined(CONFIG_H)
#define CONFIG_H 1
#include <main.h>
#include "common.h"
#define HW_VER 0x01 // hardware version
#define SW_VER 0x0004 // software version

EEPROM_ uint16_t deviceid = 0x0558;
EEPROM_ uint8_t serial[] = "MSI245460711"; // store device serial

#endif /* !defined(CONFIG_H) */
будет работать и на win avr и на iar

forastr
Цитата(XVR @ Jul 6 2011, 07:05) *
Имелось в виду, что все компиляторно зависимые части нужно собрать в один файл и завернуть в макросы, что бы использование их уже не отличалось для разных компиляторов. Например
common.h
Код
#ifdef __GNU__

#define EEPROM_ __attribute__ ((section (".eeprom")))

#else

#define EEPROM_ __eeprom

#endif


использование:
Код
#if !defined(CONFIG_H)
#define CONFIG_H 1
#include <main.h>
#include "common.h"
#define HW_VER 0x01 // hardware version
#define SW_VER 0x0004 // software version

EEPROM_ uint16_t deviceid = 0x0558;
EEPROM_ uint8_t serial[] = "MSI245460711"; // store device serial

#endif /* !defined(CONFIG_H) */
будет работать и на win avr и на iar



Классная фишка.Спасибо.А ссылки на др сайты можно?


P.s. вопрос про заменяемость библиотек: например подключается такаая библ avr/io.h
я так понял ее надо заменить на ioavr.h для iar. Но avr/io.h тянет за собой еще кучу :avr/sfr_defs.h,avr/portpins.h,avr/version.h,avr/version.h и др.Как правильно сделать переход от одних библоитек к другим?за любую инфу и ссылки буду очень благодарен.
mdmitry
Цитата(forastr @ Jul 6 2011, 13:14) *
я так понял ее надо заменить на ioavr.h для iar. Но avr/io.h тянет за собой еще кучу :avr/sfr_defs.h,avr/portpins.h,avr/version.h,avr/version.h и др.Как правильно сделать переход от одних библоитек к другим?за любую инфу и ссылки буду очень благодарен.

Аналогично можно поступить и с заголовочными файлами. Сделать что-то подобное:
Код
#ifndef CMPLHEAD_H_
#define CMPLHEAD_H_

#if defined(__GNUC__)  && !defined(__IAR_SYSTEMS_ICC__)
        /*GCC */
#include <io.h>
#include <signal.h>
#include <iomacros.h>
#include <sys/types.h>
/*  и другие заголовочные файлы */
#elif !defined (__GNUC__)  && defined(__IAR_SYSTEMS_ICC__)
        /* IAR */
#include <inttypes.h>
/*  и другие заголовочные файлы */
#else
#error Compiler not defined!
/* Ошибка, если собирать не GCC или IAR */
#endif

#endif /* CMPLHEAD_H_ */



Такой файл включать в качестве заголовочного.
forastr
Цитата(mdmitry @ Jul 6 2011, 09:53) *
Аналогично можно поступить и с заголовочными файлами. Сделать что-то подобное:
Код
#ifndef CMPLHEAD_H_
#define CMPLHEAD_H_

#if defined(__GNUC__)  && !defined(__IAR_SYSTEMS_ICC__)
        /*GCC */
#include <io.h>
#include <signal.h>
#include <iomacros.h>
#include <sys/types.h>
/*  и другие заголовочные файлы */
#elif !defined (__GNUC__) && !defined(__MSP430__) && defined(__IAR_SYSTEMS_ICC__)
        /* IAR */
#include <inttypes.h>
/*  и другие заголовочные файлы */
#else
#error Compiler not defined!
/* Ошибка, если собирать не GCC или IAR */
#endif

#endif /* CMPLHEAD_H_ */



Такой файл включать в качестве заголовочного.


Спасибо,но это немножко не то ,что я имел ввиду.
Я бы хотел узнать информацию такого типа: такая-то библиотека IAR соотвествует такой-то библиотеке gcc.Например, какие именно библиотеки IAR надо подключить вместо #include <avr/io.h> ну и тд.
zltigo
QUOTE (forastr @ Jul 6 2011, 15:23) *
Я бы хотел узнать информацию такого типа: такая-то библиотека IAR соотвествует такой-то библиотеке gcc.Например, какие именно библиотеки IAR надо подключить вместо #include <avr/io.h> ну и тд.

Печально sad.gif, но это не "библиотека".
Давайте сначала самостоятельно разберитесь, что такое "библиотека", как она "подключается" и что такое "заголовочный файл". Без этого "ну и тд" нельзя.
forastr
Цитата(zltigo @ Jul 6 2011, 10:37) *
Печально sad.gif, но это не "библиотека".
Давайте сначала самостоятельно разберитесь, что такое "библиотека", как она "подключается" и что такое "заголовочный файл". Без этого "ну и тд" нельзя.

Я понимаю отличие между этими двумя понятиями. просто я в этом посте так и раньше писал , вроде все понимали и я всех понимал)Буду стараться писать правильно.
forastr
По прежнему нуждаюсь в помощи))Многое уже переделал, вот застрял над ошибками такого рода:


Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 309
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 309
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 309
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 309
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 313
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 313
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 313
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 313
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 316
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 316
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 316
Error[Pe125]: expected a "(" D:\forastr\Console\Console\1\hardware\hw_io.c 316

Нажмите для просмотра прикрепленного файла

#define ASM_NOP asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");


пробовал менять на __asm {"nop"};__asm {"nop"};__asm {"nop"};__asm {"nop"};
не помогло.подскажите ,пожалуйста, в чем ошибка?


zltigo
QUOTE (forastr @ Jul 7 2011, 11:37) *
пробовал менять на __asm {"nop"};__asm {"nop"};__asm {"nop"};__asm {"nop"};
не помогло.

У раввина из анекдота были еще идеи sm.gif
QUOTE
подскажите ,пожалуйста, в чем ошибка?

Не читаете документацию на компилятор. Совсем не читаете sad.gif. Я понимаю, что там много букв, но надо читать. В данном случае раздел Intrinsic function.
И никогда, никогда не делайте ассемблерные вставки в сишные исходники, как это часто делается в GCC, для других компиляторов.
forastr
Цитата(zltigo @ Jul 7 2011, 08:51) *
У раввина из анекдота были еще идеи sm.gif

Не читаете документацию на компилятор. Совсем не читаете sad.gif. Я понимаю, что там много букв, но надо читать. В данном случае раздел Intrinsic function.
И никогда, никогда не делайте ассемблерные вставки в сишные исходники, как это часто делается в GCC, для других компиляторов.



Спасибо огромное за помощь и терпение,zltigo! [стыдно(]
ar__systems
Цитата(forastr @ Jul 6 2011, 03:10) *
Спассибо за помощь. Проект очень большой: кучу файлов включающих друг друга , использует

На AVR не может быть очень большого проекта. Для очень большого проекта надо хотя бы PC. sm.gif 500 000 строк и несколько тысяч файлов - вот это большой проект. sm.gif
forastr
Структура проекта вот такая:Нажмите для просмотра прикрепленного файла
Необходимо чтобы
1) все *.с были вынесены в корень проекта
2)*.с включали только *.h
3)*.h включали только *.h


Выношу любой *.с (к примеру queue.c ) в корень , удаляю запись #include "lib\queue.c".Делаю ребилд и тут куча ошибок типа:
Warning[Pe223]: function "*" declared implicitly D:\forastr\Console\Console\1\os\os_main.c 3854 (как то так).Поясните ,пожалуйста , из-за чего так происходит?
XVR
Цитата
Поясните ,пожалуйста , из-за чего так происходит?
Включите вместо *.c соответствующий *.h
forastr
Цитата(XVR @ Jul 11 2011, 06:51) *
Включите вместо *.c соответствующий *.h

Попробовал то ,что Вы предложили -> не получилось.Не у всех *.с есть *.h. Компилятор не подхватывает ни функции которые находятся в другом *.с , ни дефайны которые находятся там же((
demiurg_spb
Цитата(forastr @ Jul 11 2011, 13:55) *
Попробовал то ,что Вы предложили -> не получилось.Не у всех *.с есть *.h.
Выход напрашивается весьма очевидный: создайте недостающие заголовочные файлы и вдумчиво их отредактируйте.
forastr
Расскажите ,пожалуйста, из-за чего возникает такая ошибка:
Error[e27]: Entry "BoardPresent" in module can ( D:\...... \can.r90) redefined in module
hw_eeprom ( D:.....\hw_eeprom.r90 ) ?

Dog Pawlowa
Цитата(forastr @ Jul 13 2011, 09:52) *
Расскажите ,пожалуйста, из-за чего возникает такая ошибка:
Error[e27]: Entry "BoardPresent" in module can ( D:\...... \can.r90) redefined in module
hw_eeprom ( D:.....\hw_eeprom.r90 ) ?

Поищите BoardPresent поиском по всем файлам проекта и выложите здесь.
Cкорее всего в хедере не поставили extern
Палыч
Цитата(forastr @ Jul 13 2011, 10:52) *
Error[e27]
Такая ошибка возникает, если некая переменная (массив, структура,...) объявлена более чем в одном файле.
В Вашем случае: BoardPresent присутствует в файлах can.с и hw_eeprom.с
Вполне вероятно: необходимо добавить extern в одном из файлов.
forastr
Цитата(Dog Pawlowa @ Jul 13 2011, 05:56) *
Поищите BoardPresent поиском по всем файлам проекта и выложите здесь.
Cкорее всего в хедере не поставили extern


Не могу почему то прикрепить эти файлы(Неудачная загрузка. Вам запрещено загружать такой тип файлов).
Имеется два файла где эта переменная исполльзуется:
os_main.c - она просто приравнивается константе(BoardPresent = 1;)
os_main.h - uint8_t BoardPresent = 0;
пробовал extern uint8_t BoardPresen = 0; -> не помогло(


Цитата(Палыч @ Jul 13 2011, 06:09) *
Такая ошибка возникает, если некая переменная (массив, структура,...) объявлена более чем в одном файле.
В Вашем случае: BoardPresent присутствует в файлах can.с и hw_eeprom.с
Вполне вероятно: необходимо добавить extern в одном из файлов.

Самое интересное то ,что этой переменой там нету(А это мб из-за того что у меня все *.h включены в один большой main.h , а этот файл включается почти в каждом файле?)
Палыч
Цитата(forastr @ Jul 13 2011, 11:19) *
пробовал extern uint8_t BoardPresen = 0; -> не помогло(
Осталась та же ошибка? Попробуйте сделать "Rebuild All".
Кроме того:
1. Где то (вероятно в main.c) должно быть uint8_t BoardPresen = 0; ( без extern ).
2. В h-файле оставьте только extern uint8_t BoardPresen; ( без =0 )
forastr
Цитата(Палыч @ Jul 13 2011, 06:40) *
Осталась та же ошибка? Попробуйте сделать "Rebuild All".

Осталась та же ошибка.
Цитата
Кроме того:
1. Где то (вероятно в main.c) должно быть uint8_t BoardPresen = 0; ( без extern ).

Такого объявления больше нету.

Цитата
2. В h-файле оставьте только extern uint8_t BoardPresen; ( без =0 )

Помогло!Спасибо. Как только убираешт такую ошибку появляется такая же но с другой переменной.
Я делал (как мне посоветовали) для каждого *.с свои *.h скорее всего я их криво сделал((

А как исправить такую ошибку для :
Цитата
struct {
uint8_t acr[4];
uint8_t amr[4];
uint8_t btr0;
uint8_t btr1;
uint8_t fixed_rate;
} CAN_init_val= {
{0x00, 0x00, 0x00, 0x00},
{0xff, 0xff, 0xff, 0xff},
BTR0_100k,
BTR1_100k,
0
};


Ругается на перменную CAN_init_val.
Палыч
Цитата(forastr @ Jul 13 2011, 12:24) *
Такого объявления больше нету.
Что значит "больше нету"? У Вас в каком-то с-файле должно быть определение BoardPresen без атрибута extern. Вот в нём должно быть кроме всего прочего ещё и инициализация:
uint8_t BoardPresen =0;

Цитата(forastr @ Jul 13 2011, 12:24) *
Ругается на перменную CAN_init_val.
Привели бы сообщение об ошибке... Или это всё тот же Error[e27] ? Тогда аналогично: в один с-файл поместить то, что Вы привели в цитате; в h-файле добавить extern и убрать инициализацию (т.е. убрать ={ {0x00,...},.....} - до точки с запятой ).
forastr
Спасибо за помощь!
Поясните пожалуста следующий вопрос:


Пусть есть три файла: can.c hw_timer.c hw_timer.h

и есть функция HW_TIMER2_RESTART();

в файле hw_timer.h она написана вот так: inline void HW_TIMER2_RESTART (void);

в файле hw_timer.c описана ее реализация :
Код

inline void HW_TIMER2_RESTART (void)
{
    //Timer 2 initialization (for CAN LED activity)
    TCCR2 = TIMER2_INIT;
    TCNT2 = LED_TCNT_VALUE;
    TIMSK |= _BV (TOIE2); // enable overflow interrupt
}


а в файле can.c идет вызов этой функции: HW_TIMER2_RESTART();

И ,наверное , из-за того что я не правильно это реализовал выскакивает вот такая ошибка Error[e46]: Undefined external "HW_TIMER2_RESTART" referred in can ( D:\forastr\Console\Console\1\Debug\Obj\ can.r90)


Подскажите как правильно?и когда надо писать extern и вообще для чего он?а что означает inline?




Палыч
Цитата(forastr @ Jul 15 2011, 11:19) *
ошибка Error[e46]: Undefined external "HW_TIMER2_RESTART" referred in can ( D:\forastr\Console\Console\1\Debug\Obj\ can.r90)
Перенесите функцию в h-файл.


Цитата(forastr @ Jul 15 2011, 11:19) *
когда надо писать extern и вообще для чего он?
Хорошо бы об этом почитать в учебнике...
Глобальная переменная (массив,структура,...) может быть объявлена только один раз. При этом делается это, обычно, в с-файле. Бывает: необходимо обратиться к этой переменной из некоего места программы, исходный код которой находится в другом с-файле. Чтобы компилятор знал, что эта переменная где-то уже объявлена и под нее выделено место, знал сведения о переменной (тип, размерность,...), необходимо в остальных с-файлах, где эта переменная используется описать (декларировать) её со спецификатором extern.


Цитата(forastr @ Jul 15 2011, 11:19) *
что означает inline?
Что это - "необычная" функция: вместо её вызова в программу подставляется её тело. Т.е. тот код, что записан в функции будет повторен во всех местах, где встречается обращение к этой функции.
forastr
Всем огромное спасибо за помощь и советы. Проект скомпилировался без ворнингов и ошибок.Теперь буду разбираться в сути кода и оптимизировать, и как обычно без форума врядли обойдусь laughing.gif !
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.