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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> вопросы по IAR, В поисках идеального компилятора
andrvisht
сообщение Oct 27 2005, 08:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Перехожу на С, в связи с этим пересмотрел ICC CV и наконец добрался до IAR
Для начала пересмотрел все что уже было сказано, много пока туманно надо будет осмысливать.
Первый вопрос, хотя я вроде как с ответом утвердился, это возможно ли в IAR представить число в виде 0bxxxxxxxx. Лазая по настройкам пришел к выводу что нет такой возможности, да и в ANSI C это не предусмотрено. Или я чего-то не знаю ?
Второй:
вот в этой ветке
http://forum.electronix.ru/index.php?showtopic=8829
встретил описание макроса как
Код
#define _DDR_(a) DDR##a
#define _DDR(a) _DDR##_(a)
#define SETDDR(x) (_DDR(x##p)|=BIT(x##b))
//PORT A **********************************
#define OUT0p A
#define OUT0b 4


SETDDR(OUT0); макрос который ставит 4 бит в DDRA
В инклудах описаны только представления PORTA, DDRA, PINA, остальные как-то формируются ?? но как так и не понял. sad.gif
В help на IAR по поводу ## нашел вот это:

Rule 98 (required)
There shall be at most one occurrence of the # or ## preprocessor operator in a single macro definition.
How the rule is checked
The compiler will generate an error, indicating a violation of this rule, if more than one of # or ## is used in combination. For example, the occurrence of # and ## in the same macro definition will trigger an error.

Example of rule violations
#define FOO(x) BAR(#x) ## _var

Examples of correct code
#define FOO(x) #x
#define FOO(x) my_ ## x

И опять ничего не понял sad.gif
что за ## что он делает ? В книгах по С ничего такого не нашел...
Кстати этот макрос работает на IAR и ICC, CV ругается.

Может кто обьяснить что это за ## и как они работают ....
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Oct 27 2005, 09:30
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



## в макросе с параметром обозначает, что далее следует параметр макроса в символьном виде без разрывов, например:
Код
#define Stop(CHN) bCh##CHN##Up = 0; bCh##CHN = 0;
Stop(13); // для препроцессора это "bCh13Up = 0; bCh13 = 0;"


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Oct 27 2005, 09:34
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(&-rey @ Oct 27 2005, 11:58)
Examples of correct code
#define FOO(x) #x
#define FOO(x) my_ ## x

Может кто обьяснить что это за ## и как они работают ....

## позволяет образовывать новые идентификаторы путем "склеивания" двух
других идентификаторов. Например, объявление FOO(beep) препроцессор
преобразует в my_beep. Подробности можно почитать здесь.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 27 2005, 09:48
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(&-rey @ Oct 27 2005, 11:58)
Может кто обьяснить что это за ## и как они работают ....
*


## - это склейка аргументов после подстановки в одну лексему.
В ранних версиях С не было, использовался комментарий. Препроцессор его выкидывал перед основной работой и само собой цепочки символов склеивались.

Код
// old C style:
// #define GLUE2(a,b) a/**/b
// ANSI
#define GLUE2(a,b) a ## b

   i = GLUE2(j + 2, 1); // всё равно что i = j + 21;


# - это подстановка аргумента как текстовой строки
Код
#define DUMP(a) printf( "(" #a ") = %d\n", a)

int main(void)
{
   int i=5, j=7;
   DUMP( sizeof( void * ) );
   DUMP( i + j );
   return 0;
}


или, что часто более полезно, так
Код
#define ENTRY(a) { a, #a }
struct {
   int code;
   const char *name;
} error_code_table[] = {
  ENTRY(ALL_OK),
  ENTRY(CRC_ERROR),
  ENTRY(BAD_COMMAND)
};

что писать несколько веселее, чем
Код
ыtruct {
   int code;
   const char *name;
} error_code_table[] = {
  { ALL_OK, "ALL_OK" },
  { CRC_ERROR, "CRC_ERROR" },
  { BAD_COMMAND, "BAD_COMMAND" }
};


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 27 2005, 10:16
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(G}{OST @ Oct 27 2005, 12:30)
## в макросе с параметром обозначает, что далее следует параметр макроса в символьном виде без разрывов, например:
Код
#define Stop(CHN) bCh##CHN##Up = 0; bCh##CHN = 0;
Stop(13); // для препроцессора это "bCh13Up = 0; bCh13 = 0;"

*


То есть, если я правильно понял:
## (начало вставки) - параметр - ## (конец вставки)
если до вставки ничего нет то можно не писать ## в начале
и соответственно если после вставки ничего нет то можно ## не ставить
Код
#define SETDDR(x) (_DDR(x##p)|=BIT(x##b))

SETDDR(OUT0);


будет выполняться так
_DDR(OUTp)|=BIT(OUTb)
а поскольку у нас
#define OUT0p A
#define OUT0b 4
то:
_DDR(A)|=BIT(4)
за счет
#define _DDR(a) _DDR##_(a)
будет подставлено:
_DDR##_(A)|=BIT(4)
и в итоге
#define _DDR_(a) DDR##a
преобразует все к виду:
DDRA|=BIT(4)

Вот только с последними двумя
#define _DDR_(a) DDR##a
#define _DDR(a) _DDR##_(a)
не совсем понятно
а именно Зачем
#define _DDR(a) _DDR##_(a)
почему не #define _DDR(a) DDR##a ???
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 27 2005, 10:18
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(halfdoom @ Oct 27 2005, 12:34)
Цитата(&-rey @ Oct 27 2005, 11:58)
Examples of correct code
#define FOO(x) #x
#define FOO(x) my_ ## x

Может кто обьяснить что это за ## и как они работают ....

## позволяет образовывать новые идентификаторы путем "склеивания" двух
других идентификаторов. Например, объявление FOO(beep) препроцессор
преобразует в my_beep. Подробности можно почитать здесь.
*


Спасибо, счас буду переводить.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 27 2005, 10:20
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(ReAl @ Oct 27 2005, 12:48)
Цитата(&-rey @ Oct 27 2005, 11:58)
Может кто обьяснить что это за ## и как они работают ....
*


## - это склейка аргументов после подстановки в одну лексему.
В ранних версиях С не было, использовался комментарий. Препроцессор его выкидывал перед основной работой и само собой цепочки символов склеивались.

Код
// old C style:
// #define GLUE2(a,b) a/**/b
// ANSI
#define GLUE2(a,b) a ## b

   i = GLUE2(j + 2, 1); // всё равно что i = j + 21;


# - это подстановка аргумента как текстовой строки
Код
#define DUMP(a) printf( "(" #a ") = %d\n", a)

int main(void)
{
   int i=5, j=7;
   DUMP( sizeof( void * ) );
   DUMP( i + j );
   return 0;
}


или, что часто более полезно, так
Код
#define ENTRY(a) { a, #a }
struct {
   int code;
   const char *name;
} error_code_table[] = {
  ENTRY(ALL_OK),
  ENTRY(CRC_ERROR),
  ENTRY(BAD_COMMAND)
};

что писать несколько веселее, чем
Код
ыtruct {
   int code;
   const char *name;
} error_code_table[] = {
  { ALL_OK, "ALL_OK" },
  { CRC_ERROR, "CRC_ERROR" },
  { BAD_COMMAND, "BAD_COMMAND" }
};

*


Спасибо, буду переваривать.
А по поводу bin формата я прав, или что-то где-то недопонял?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 27 2005, 10:35
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(&-rey @ Oct 27 2005, 13:16)
То есть, если я правильно понял:
## (начало вставки) - параметр  - ## (конец вставки)
если до вставки ничего нет то можно не писать ## в начале
и соответственно если после вставки ничего нет то можно ## не ставить

Нет, ## - это "двуместный оператор", он склеивает свои левый и правый аргументы (как "+" их складывает).

Цитата(&-rey)
А по поводу bin формата я прав, или что-то где-то недопонял?


А что с bin-форматом? Я что-то не нашёл вопрос.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 27 2005, 10:43
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ещё для переваривания :-)
Для неокрепших желудков - осторожно, понемногу :-)
Вопрос вкусовой, но я не люблю писать лишнее, поэтому не стесняюсь писать так:

Цитата(dlportio_driver.h)
#ifndef DLPORTIO_DRIVER_H
#define DLPORTIO_DRIVER_H


typedef WINAPI void (*DlPortWritePortUchar_t) (unsigned port, uint8_t data);
typedef WINAPI uint8_t(*DlPortReadPortUchar_t) (unsigned p);
typedef WINAPI void (*DlPortWritePortBufferUchar_t) (unsigned p, uint8_t * buf, int len);
typedef WINAPI void (*DlPortReadPortBufferUchar_t) (unsigned p, uint8_t * buf, int len);
typedef WINAPI void (*DlPortWritePortUshort_t) (unsigned p, uint16_t data);
typedef WINAPI uint16_t(*DlPortReadPortUshort_t) (unsigned p);
typedef WINAPI void (*DlPortWritePortBufferUshort_t) (unsigned p, uint16_t * buf, int len);
typedef WINAPI void (*DlPortReadPortBufferUshort_t) (unsigned p, uint16_t * buf, int len);

class dlportio_driver : public port_io_driver {
public:
  static dlportio_driver *create();

/* ЛИШНЕЕ ПОСКИПАНО */

protected:
    HINSTANCE hdlportio;

#define _DL_PTR(_f_)  _f_##_t  _f_##_P

    _DL_PTR( DlPortWritePortUchar );
    _DL_PTR( DlPortReadPortUchar );
    _DL_PTR( DlPortWritePortBufferUchar );
    _DL_PTR( DlPortReadPortBufferUchar );
    _DL_PTR( DlPortWritePortUshort );
    _DL_PTR( DlPortReadPortUshort );
    _DL_PTR( DlPortWritePortBufferUshort );
    _DL_PTR( DlPortReadPortBufferUshort );

#undef _DL_PTR

};


и в соответствующем исходнике
Цитата(dlportio_driver.cpp)
dlportio_driver *dlportio_driver::create()
{
#define _DL_LOAD(_f_) \
    do {\
        pdl->_f_##_P = (_f_##_t)GetProcAddress(pdl->hdlportio, #_f_);\
        if(pdl->_f_##_P == NULL) {\
          delete pdl;\
          return NULL;\
      }\
    } while(0)

    dlportio_driver *pdl = new dlportio_driver;

    pdl->hdlportio = LoadLibrary("DLportIO.dll");
    if (pdl->hdlportio == NULL) {
        delete pdl;
        // "Can't load port library\n"
        return NULL;
    }

    _DL_LOAD( DlPortWritePortUchar );
    _DL_LOAD( DlPortReadPortUchar );
    _DL_LOAD( DlPortWritePortBufferUchar );
    _DL_LOAD( DlPortReadPortBufferUchar );
    _DL_LOAD( DlPortWritePortUshort );
    _DL_LOAD( DlPortReadPortUshort );
    _DL_LOAD( DlPortWritePortBufferUshort );
    _DL_LOAD( DlPortReadPortBufferUshort );

    return pdl;

#undef _DL_LOAD
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 27 2005, 12:04
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(ReAl @ Oct 27 2005, 13:43)
Ещё для переваривания :-)
Для неокрепших желудков - осторожно, понемногу :-)
Вопрос вкусовой, но я не люблю писать лишнее, поэтому не стесняюсь писать так:

Цитата(dlportio_driver.h)
#ifndef DLPORTIO_DRIVER_H
#define DLPORTIO_DRIVER_H


typedef WINAPI void (*DlPortWritePortUchar_t) (unsigned port, uint8_t data);
typedef WINAPI uint8_t(*DlPortReadPortUchar_t) (unsigned p);
typedef WINAPI void (*DlPortWritePortBufferUchar_t) (unsigned p, uint8_t * buf, int len);
typedef WINAPI void (*DlPortReadPortBufferUchar_t) (unsigned p, uint8_t * buf, int len);
typedef WINAPI void (*DlPortWritePortUshort_t) (unsigned p, uint16_t data);
typedef WINAPI uint16_t(*DlPortReadPortUshort_t) (unsigned p);
typedef WINAPI void (*DlPortWritePortBufferUshort_t) (unsigned p, uint16_t * buf, int len);
typedef WINAPI void (*DlPortReadPortBufferUshort_t) (unsigned p, uint16_t * buf, int len);

class dlportio_driver : public port_io_driver {
public:
   static dlportio_driver *create();

/* ЛИШНЕЕ ПОСКИПАНО */

protected:
    HINSTANCE hdlportio;

#define _DL_PTR(_f_)   _f_##_t   _f_##_P

    _DL_PTR( DlPortWritePortUchar );
    _DL_PTR( DlPortReadPortUchar );
    _DL_PTR( DlPortWritePortBufferUchar );
    _DL_PTR( DlPortReadPortBufferUchar );
    _DL_PTR( DlPortWritePortUshort );
    _DL_PTR( DlPortReadPortUshort );
    _DL_PTR( DlPortWritePortBufferUshort );
    _DL_PTR( DlPortReadPortBufferUshort );

#undef _DL_PTR

};


и в соответствующем исходнике
Цитата(dlportio_driver.cpp)
dlportio_driver *dlportio_driver::create()
{
#define _DL_LOAD(_f_) \
    do {\
        pdl->_f_##_P = (_f_##_t)GetProcAddress(pdl->hdlportio, #_f_);\
        if(pdl->_f_##_P == NULL) {\
           delete pdl;\
           return NULL;\
       }\
    } while(0)

    dlportio_driver *pdl = new dlportio_driver;

    pdl->hdlportio = LoadLibrary("DLportIO.dll");
    if (pdl->hdlportio == NULL) {
        delete pdl;
        // "Can't load port library\n"
        return NULL;
    }

    _DL_LOAD( DlPortWritePortUchar );
    _DL_LOAD( DlPortReadPortUchar );
    _DL_LOAD( DlPortWritePortBufferUchar );
    _DL_LOAD( DlPortReadPortBufferUchar );
    _DL_LOAD( DlPortWritePortUshort );
    _DL_LOAD( DlPortReadPortUshort );
    _DL_LOAD( DlPortWritePortBufferUshort );
    _DL_LOAD( DlPortReadPortBufferUshort );

    return pdl;

#undef _DL_LOAD
}

*




Ужас.... но буду принимать понемногу smile.gif
По поводу bin я не нашел в IAR возможность записывать константы типа:
0b11111011
В ANSI C такого и нет, вроде, вот я и решил что IAR этот вариант представлени не поддерживает. Т. е. писать константы в hex 0xFB, или в DEC 251 соответственно.
Или может там есть возможность как-то иначе но в поиск по Help ничего не дал.
???
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 28 2005, 05:33
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(&-rey @ Oct 27 2005, 15:04)
Ужас.... но буду принимать понемногу smile.gif
По поводу bin я не нашел в IAR возможность записывать константы типа:
0b11111011
В ANSI C такого и нет, вроде, вот я и решил что IAR этот вариант представлени не поддерживает. Т. е. писать константы в hex 0xFB, или в DEC  251 соответственно.
Или может там есть возможность как-то иначе но в поиск по Help ничего не дал.
???
*

В порядке убывания разумности с моей точки зрения.

1) писать не 0b0010011 и не 0x23, а (1<<ENABLE) | (3<<MODE), а то придётся помнить наизусть значение всех битов всех регистров либо постоянно лазить в документацию. Заодно надо будет меньше комментариев вида
/* ставим в режим MODE3 и разрешаем работу */
писать - оно по самому выражению будет видно.

2) привыкнуть к HEX-формату и не морочить голову об 0bxxxxxxxx

3) поискать по интернету готовый файл с любопытным #define BIN(a), который применяется как
BIN(00010011)
а на самом деле при помощи уже упомянутого 0##a приклеивает к аргументу a
лидирующий 0 для гарантии восьмеричности числа, после чего при помощи операций %8 /8 выделяет отдельные цифры и составляет двоичное число.
Поскольку всё константы - это операция времени компиляции и код эффективный.

4) Поискать по интернету готовый файл с 256-ю #defin-ами вида
#define b00000000 0x00
#define b00000001 0x01
и т.д. (внимание на то, что начинается с b, а не с нуля)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
spf
сообщение Oct 28 2005, 06:12
Сообщение #12


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(ReAl @ Oct 28 2005, 10:33)
3) поискать по интернету готовый файл с любопытным #define BIN(a), который применяется как
BIN(00010011)
*


Зачем же так далеко посылать ;-)

Код
#define BIN2BYTE(a) ( ((0x##a##L>>21) & 0x80) + ((0x##a##L>>18) & 0x40) \
                   + ((0x##a##L>>15) & 0x20) + ((0x##a##L>>12) & 0x10) \
                   + ((0x##a##L>>9) & 0x08) + ((0x##a##L>>6) & 0x04)  \
                   + ((0x##a##L>>3) & 0x02) + (0x##a##L & 0x01))


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 28 2005, 12:11
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(spf @ Oct 28 2005, 09:12)
Цитата(ReAl @ Oct 28 2005, 10:33)
3) поискать по интернету готовый файл с любопытным #define BIN(a), который применяется как
BIN(00010011)
*


Зачем же так далеко посылать ;-)
*


А мне оно ненадо, я в пределах пунктов 1) и 2) работаю. Увидел, идею запомнил, писать в форум из головы влом (а сам макрос не сохранял за ненадобностью).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
grave
сообщение Oct 28 2005, 13:35
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 9-12-04
Из: Odessa
Пользователь №: 1 424



Вот держите заголовочник.


Иногда даже удобней пользоваться записью
#define ______o_ 2
#define ______oo 3
#define _____o__ 4
............
и т.д.

Сообщение отредактировал IgorKossak - Oct 31 2005, 07:49
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 1 2005, 06:28
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Всем Спасибо за ответы, но проблема bin формата для меня не столь важна, просто если бы было, хорошо, а раз нет, то и ладно. Жить можно. В любом случае на примерах посмотрел как пишут макросы.

Вот снова копался в форумах и нашел такое:

от haker fox

Цитата(haker_fox @ Oct 21 2005, 02:26)
#ifndef CONST_H //если константа не определена, то
#define CONST_H //определить константу
//Код хедера
#endif

Когда компилятор будет во-второй раз цеплять хедер, он его не подцепит, т.к. константа CONST_H уже определена (при первом проходе)

Вместо CONST_H соответственно для другого файла - другое имя, например MAIN_H
*


и от IgorKossak

[quote=IgorKossak,Oct 24 2005, 10:55]
Никто почему-то не расскажет ещё об одной технике обьявления/определения переменных в хедерах.
Помимо охранных констант, исключающих повторное включение файла иногда бывает удобно в одном файле и определять и обьявлять переменные (экземпляры класса).
Код
#ifndef _xxx_DEF
...
unsigned int My_Int_Var;
...
#else
...
extern unsigned int My_Int_Var;
...
#endif

Константа _xxx_DEF обьявляется только в одном файле *.c, где происходит выделение под них памяти. Все же остальные файлы включающие данный хедер, будут видеть только обьявления.
При желании можно написать макрос, который сделает всё это автоматически.
*


мне как раз понадобилась данная рекомендация и я в *.h поставил так
Код
#ifndef _*_h
#define _*_h
char a=5;
#else
extern char a;
#endif

но компилятор ругается и говорит что переменная a определяется в 2-х файлах

Но вроде бы должно было быть определение как переменной a только в одном файле, а в другом где подключен *.h уже просто определение как extern.
получается что "защитный код" не работает.

Ложки не существует ? или я что-то не так сделал ???
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 1 2005, 09:56
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



[quote=&-rey,Nov 1 2005, 09:28]
[quote=IgorKossak,Oct 24 2005, 10:55]
Никто почему-то не расскажет ещё об одной технике обьявления/определения переменных в хедерах.
Помимо охранных констант, исключающих повторное включение файла иногда бывает удобно в одном файле и определять и обьявлять переменные (экземпляры класса).
Код
#ifndef _xxx_DEF
...
unsigned int My_Int_Var;
...
#else
...
extern unsigned int My_Int_Var;
...
#endif

Константа _xxx_DEF обьявляется только в одном файле *.c, где происходит выделение под них памяти. Все же остальные файлы включающие данный хедер, будут видеть только обьявления.
При желании можно написать макрос, который сделает всё это автоматически.
*


мне как раз понадобилась данная рекомендация и я в *.h поставил так
Код
#ifndef _*_h
#define _*_h
char a=5;
#else
extern char a;
#endif

но компилятор ругается и говорит что переменная a определяется в 2-х файлах

Но вроде бы должно было быть определение как переменной a только в одном файле, а в другом где подключен *.h уже просто определение как extern.
получается что "защитный код" не работает.

Ложки не существует ? или я что-то не так сделал ???
*

[/quote]
Существует, смотри здесь, в самом конце...
ЗЫ
(на всякий случай подробно) в хидере нужно так сделать:
Код
#ifdef _*_h
char a=5;
#else
extern char a;
#endif

а в модуле перед #include <хидер> вставить:
Код
#define _*_h
.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 1 2005, 11:56
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



И все равно никак sad.gif
Перейдем на конкретный пример
имеем в main.c
Код
#include "Clear.h"
#include "main.h"

__task main( void )
{
 while(1)
 {
   a = 6;
   Clear();
 }
}


В main.h
Код
#include <io8535.h>
#include <avr_macros.h>
#include <inavr.h>

в Clear.c
Код
#include "main.h"
#include "Clear.h"

void Clear(void)
{
 a = 0;
}

и в Clear.h
Код
#ifndef _Clear_h
#define _Clear_h
void Clear(void);
#endif

#ifdef _Clear_h
char a;
#else
extern char a;
#endif


так вот ругается :
Error[e27]: Entry "a" in module Clear ( C:\Clear\Debug\Obj\Clear.r90 ) redefined in module main ( C:\
Clear\Debug\Obj\main.r90 )
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 1 2005, 12:02
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Цитата(&-rey @ Nov 1 2005, 15:56)
Error[e27]: Entry "a" in module Clear ( C:\Clear\Debug\Obj\Clear.r90 ) redefined in module main ( C:\
Clear\Debug\Obj\main.r90 )
*

ИМХО, переменные запихивать в хидеры - это бред.


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 1 2005, 12:19
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(G}{OST @ Nov 1 2005, 15:02)
Цитата(&-rey @ Nov 1 2005, 15:56)
Error[e27]: Entry "a" in module Clear ( C:\Clear\Debug\Obj\Clear.r90 ) redefined in module main ( C:\
Clear\Debug\Obj\main.r90 )
*

ИМХО, переменные запихивать в хидеры - это бред.
*


возможно, я пока начинающий в С.
перенес в Clear.c
и имеем такой вариант:

Error[Pe020]: identifier "a" is undefined C:\Clear\main.c 8
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 1 2005, 12:32
Сообщение #20


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



так в хидере пропиши как extern и включи хидер в тот модуль


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 1 2005, 12:42
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(G}{OST @ Nov 1 2005, 15:32)
так в хидере пропиши как extern и включи хидер в тот модуль
*

ну да, если отдельно то все работает, но вопрос то именно как это сделать через #ifndef
Просто так намного удобнее, и не надо при использовании своих библиотек вспоминать какие переменные как определять. Все автоматом. smile.gif
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 1 2005, 12:48
Сообщение #22


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Цитата(&-rey @ Nov 1 2005, 16:42)
Цитата(G}{OST @ Nov 1 2005, 15:32)
так в хидере пропиши как extern и включи хидер в тот модуль
*

ну да, если отдельно то все работает, но вопрос то именно как это сделать через #ifndef
Просто так намного удобнее, и не надо при использовании своих библиотек вспоминать какие переменные как определять. Все автоматом. smile.gif
*


Лично я делаю проекты так, чтобы использование внешних переменных было только в исключительных случаях. Иначе глюков потом не оберёшься.


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 1 2005, 13:13
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(G}{OST @ Nov 1 2005, 15:48)
Цитата(&-rey @ Nov 1 2005, 16:42)
Цитата(G}{OST @ Nov 1 2005, 15:32)
так в хидере пропиши как extern и включи хидер в тот модуль
*

ну да, если отдельно то все работает, но вопрос то именно как это сделать через #ifndef
Просто так намного удобнее, и не надо при использовании своих библиотек вспоминать какие переменные как определять. Все автоматом. smile.gif
*


Лично я делаю проекты так, чтобы использование внешних переменных было только в исключительных случаях. Иначе глюков потом не оберёшься.
*



Ладно, тогда такой вопрос. Обработчик клавиатуры имеет два регистра
Keyb_flag и Old_Keyb_flag. Макрос сравнивает код клавиши со значением в Keyb_flag и Old_Keyb_flag для принятия решения об нажатии или отжатии.
Как в таком случае должны быть объявлены Keyb_flag и Old_Keyb_flag чтобы макрос мог вызываться из любой другой подпрограммы. ?
Я думаю что для этого они должны быть глобальными, хотя может и нет,
как быть в этом варианте ???
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 1 2005, 13:38
Сообщение #24


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Цитата(&-rey @ Nov 1 2005, 17:13)
Ладно, тогда такой вопрос. Обработчик клавиатуры имеет два регистра
Keyb_flag и Old_Keyb_flag. Макрос сравнивает код клавиши со значением в Keyb_flag и Old_Keyb_flag для принятия решения об нажатии или отжатии.
Как в таком случае должны быть объявлены Keyb_flag и Old_Keyb_flag чтобы макрос мог вызываться из любой другой подпрограммы. ?
Я думаю что для этого они должны быть глобальными, хотя может и нет,
как быть в этом варианте ???
*

Если позволяют ресурсы, лучше сделать процедуру, а не макрос. Иначе, если ресурсов в обрез, сделать внешними эти переменные. Объявить процедуру или переменные можно в хидере, который включается куда надо.


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 1 2005, 13:46
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(G}{OST @ Nov 1 2005, 16:38)
Цитата(&-rey @ Nov 1 2005, 17:13)
Ладно, тогда такой вопрос. Обработчик клавиатуры имеет два регистра
Keyb_flag и Old_Keyb_flag. Макрос сравнивает код клавиши со значением в Keyb_flag и Old_Keyb_flag для принятия решения об нажатии или отжатии.
Как в таком случае должны быть объявлены Keyb_flag и Old_Keyb_flag чтобы макрос мог вызываться из любой другой подпрограммы. ?
Я думаю что для этого они должны быть глобальными, хотя может и нет,
как быть в этом варианте ???
*

Если позволяют ресурсы, лучше сделать процедуру, а не макрос. Иначе, если ресурсов в обрез, сделать внешними эти переменные. Объявить процедуру или переменные можно в хидере, который включается куда надо.
*


Да дело даже не в ресурсах. Например как параметр макроса я задаю код клавиши и указатель на функцию. В этом случае макрос - самое оно.
ReleaseKey(Key,*pFunction)

А обявлять отдельно можно, но я хотел бы как предлагалось IgorKossak, а то еще надо лишний файлик делать, специально для main.c. sad.gif
А хочется именно как описано но вот не работает, а почему непонятно. Создается впечатление что #ifdef вообще никак компилятором не обрабатывается. что у меня не так написано ?
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 1 2005, 13:56
Сообщение #26


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Цитата(&-rey @ Nov 1 2005, 17:46)
А обявлять отдельно можно, но я хотел бы как предлагалось IgorKossak, а то еще надо лишний файлик делать, специально для main.c. sad.gif
А хочется именно как описано но вот не работает, а почему непонятно. Создается впечатление что #ifdef вообще никак компилятором не обрабатывается. что у меня не так написано ?
*

Если #ifdef не обрабатывается компилером, значит на момент обработки препроцессором этой директивы параметр не был задефайнен. cranky.gif


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
TMX
сообщение Nov 1 2005, 13:59
Сообщение #27


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Вообще лучше делать так:
Код
/*
Module name: globals.h
*/
#ifdef __GLOBAL_DECLARATIONS
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN U8 a;

компилятор вообще-то компилирует каждый файл по отдельности, ничего не зная о том,какие макросы уже определены в других файлах.
Поэтому и ругается.
В файле main.c (и только в нем) должно быть определение до включения файла globals.h
Код
/*
Module name: main.c
*/
#define __GLOBAL_DECLARATIONS
#include "globals.h"


Насчет файла globals.h в учебниках пишут прямо противоположное, я в своем стандарте оформления кода требую его использовать в виде, описанном выше.

#ifndef пишется, чтобы не было переопределения макросов в случае вложения заголовочных файлов.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 1 2005, 16:10
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну а не проще ли в файле global.c (и только в нем)объявить необходимые в проекте глобальные переменные, а в
global.h их же продекларировать как external ? Где нужны эти переменные - #include "global.h".
Go to the top of the page
 
+Quote Post
TMX
сообщение Nov 1 2005, 16:58
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(sergeeff @ Nov 1 2005, 19:10)
Ну а не проще ли в файле global.c (и только в нем)объявить  необходимые в проекте глобальные переменные, а в
global.h их же продекларировать как external ? Где нужны эти переменные - #include "global.h".
*

не проще - раньше так и делал, в случае изменений приходится править оба файла.
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 1 2005, 17:55
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(&-rey @ Nov 1 2005, 14:56)
И все равно никак sad.gif
Перейдем на конкретный пример
имеем в main.c
Код
#include "Clear.h"
#include "main.h"

__task main( void )
{
 while(1)
 {
   a = 6;
   Clear();
 }
}


В main.h
Код
#include <io8535.h>
#include <avr_macros.h>
#include <inavr.h>

в Clear.c
Код
#include "main.h"
#include "Clear.h"

void Clear(void)
{
 a = 0;
}

и в Clear.h
Код
#ifndef _Clear_h
#define _Clear_h
void Clear(void);
#endif

#ifdef _Clear_h
char a;
#else
extern char a;
#endif


так вот ругается :
Error[e27]: Entry "a" in module Clear ( C:\Clear\Debug\Obj\Clear.r90 ) redefined in module main ( C:\
Clear\Debug\Obj\main.r90 )
*


Исправь Clear.c:
Код
#include "main.h"
#define _Clear_h
#include "Clear.h"

void Clear(void)
{
a = 0;
}

и Clear.h:
Код
#ifdef _Clear_h
void Clear(void);
char a;
#else
extern char a;
extern void Clear(void);
#endif

и должно заработать rolleyes.gif
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 2 2005, 12:01
Сообщение #31


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



2 TMX
Цитата
компилятор вообще-то компилирует каждый файл по отдельности, ничего не зная о том,какие макросы уже определены в других файлах.
Поэтому и ругается.
В файле main.c (и только в нем) должно быть определение до включения файла globals.h

Да - да - да, я как раз вчера вечером это выяснил методом проб и ошибок.
Цитата
Насчет файла globals.h в учебниках пишут прямо противоположное, я в своем стандарте оформления кода требую его использовать в виде, описанном выше.

#ifndef пишется, чтобы не было переопределения макросов в случае вложения заголовочных файлов.

вот теперь начинаю понимать, а то как-то смысл #ifndef терялся.

2 Old1
Цитата
и должно заработать  rolleyes.gif

Да спасибо, заработало. Осталось понять в чем мой просчет.
Попробую 2 варианта и тогда уже определюсь.

2 All
Извиняйте если кто пытался тоже обьяснить, но дошло только счас...

Вот перевожу свои библиотеки с AB, и возникли еще вопросы:

Первый.
В С нет сдвига через перенос. Как быть?
Я вижу 3 возможных варианта

1
например нужно сделать <a<< и проверить Carry
делаем так:
b = a;
a = a << 1;
и проверяем
if (a>b) то переноса не было
else
перенос был.
2.
второй вариант преобразовать её в int
и проверять как Carry 8 бит
3.
Вставка на асме.

1 и 2 варианты не очень нравятся за счет использования дополнительного регистра
а 3 как то не хочется так как будет потеря совместимости. Да и описание по совместимости какое-то туманное.. Что -то сказали, о чем-то умолчали....


Макросы типа __xxx вроде ненашел...

как быть в данном случае. ??

2 Вопрос.
У меня есть несколько Case()
в некоторых из них код повторяется. В асме это выглядело через rjmp
в С вроде токага безобразия лучьше не делать
Тогда опять же как лучьше.

Вижу 2 варианта
1 макросом
2 функцией
в первом случае большой код
во втором лишние call и ret, да еще сохранение в стек.
Сохранение стек можно отключить __task (наверное) но call и ret ...
или может inline rfr-nj поможет ??
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 2 2005, 12:23
Сообщение #32


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Цитата(&-rey @ Nov 2 2005, 16:01)
В С нет сдвига через перенос. Как быть?
*

Код
// unsigned char a;
// сдвиг влево с переносом старшего бита
if (a&0x80)
 a = (a<<1) |0x01;
else
 a <<= 1;


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
Виктория
сообщение Nov 2 2005, 12:35
Сообщение #33


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Цитата(&-rey @ Nov 2 2005, 16:01)
Вот перевожу свои библиотеки с AB, и возникли еще вопросы:

Первый.
В С нет сдвига через перенос. Как быть?
Я вижу 3 возможных варианта

1
например нужно сделать <a<< и проверить Carry
делаем так:
b = a;
a = a << 1;
и проверяем
if (a>b) то переноса не было
else
перенос был.
2.
второй вариант преобразовать её в int
и проверять как Carry 8 бит
3.
Вставка на асме.
*


4. if(a&0x80) то перенос будет

Цитата
2 Вопрос.
У меня есть несколько Case()
в некоторых из них код повторяется. В асме это выглядело через rjmp
в С вроде токага безобразия лучьше не делать
Тогда опять же как лучьше.


Можно и такую конструкцию использовать
Код
 switch(cond) {
case COND1: func1();
case COND2: func2();
case COND3: func3(); break;
case COND4: func4();
 }


При выполнении условия (cond=COND1) выполняются функции func1, func2, func3; при выполнении (cond=COND2) - func2 и func3; для (cond=COND3) - только func3 и для (cond=COND4) - func4. Вместо функций - любые операторы Си.

Согласитесь, что читабельность программы при такой конструкции значительно улучшается.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 2 2005, 13:06
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(G}{OST @ Nov 2 2005, 15:23)
Цитата(&-rey @ Nov 2 2005, 16:01)
В С нет сдвига через перенос. Как быть?
*

Код
// unsigned char a;
// сдвиг влево с переносом старшего бита
if (a&0x80)
 a = (a<<1) |0x01;
else
 a <<= 1;

*



Спасибо, но это не совсем то что мне сейчас надо. В этом варианте получаем вообще кольцевой сдвиг, а в asm это выглядет иначе
b7 -> Carry
b6 -> b7
b5 -> b6
b4 -> b5
...
Carry -> b0
Но у меня задача сдвинуть влево и проанализировать Carry
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 2 2005, 13:14
Сообщение #35


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Цитата(&-rey @ Nov 2 2005, 17:06)
Спасибо
*

Пожалуйста.


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 2 2005, 13:16
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Vic1 @ Nov 2 2005, 15:35)
Цитата(&-rey @ Nov 2 2005, 16:01)
Вот перевожу свои библиотеки с AB, и возникли еще вопросы:

Первый.
В С нет сдвига через перенос. Как быть?
Я вижу 3 возможных варианта

1
например нужно сделать <a<< и проверить Carry
делаем так:
b = a;
a = a << 1;
и проверяем
if (a>b) то переноса не было
else
перенос был.
2.
второй вариант преобразовать её в int
и проверять как Carry 8 бит
3.
Вставка на асме.
*


4. if(a&0x80) то перенос будет

Цитата
2 Вопрос.
У меня есть несколько Case()
в некоторых из них код повторяется. В асме это выглядело через rjmp
в С вроде токага безобразия лучьше не делать
Тогда опять же как лучьше.


Можно и такую конструкцию использовать
Код
 switch(cond) {
case COND1: func1();
case COND2: func2();
case COND3: func3(); break;
case COND4: func4();
 }


При выполнении условия (cond=COND1) выполняются функции func1, func2, func3; при выполнении (cond=COND2) - func2 и func3; для (cond=COND3) - только func3 и для (cond=COND4) - func4. Вместо функций - любые операторы Си.

Согласитесь, что читабельность программы при такой конструкции значительно улучшается.
*



Согласен так красивее.
Да я читал про работу swich но у меня там есть набор условий в результате которых в одном и том же case нужно либо break либо часть этого общего кода.
я думаю можно анализировать (a&0x80) и выставлять флаг какой - то свой.

Думаю можно T флаг к этому приобщить, только проверить что С его не трогает. Когда раньше дизасемблил С коды видел у С большую к нему любовь.
Go to the top of the page
 
+Quote Post
Виктория
сообщение Nov 2 2005, 13:23
Сообщение #37


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



2 &-rey
Цитата
Да я читал про работу swich но у меня там есть набор условий в результате которых в одном и том же case нужно либо break либо часть этого общего кода.


Для этого есть другая конструкция smile.gif - if(cond) break;
Если она используется в case, то выход (break) будет из блока switch
Go to the top of the page
 
+Quote Post
Виктория
сообщение Nov 2 2005, 13:36
Сообщение #38


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



2 &-rey, далее..
Цитата
я думаю можно анализировать (a&0x80) и выставлять флаг какой - то свой.

Думаю можно T флаг к этому приобщить, только проверить что С его не трогает. Когда раньше дизасемблил С коды видел у С большую к нему любовь.


Это не должно стать правилом excl.gif Это не есть хорошо smile.gif

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

Вообще то, для получения лучших советов выкладывайте законченные куски ассемблерных текстов, которые хотите перевести на Си (или текстовое, смысловое описание задачи, которую программируете). Не сомневаюсь, что профессионалы форума покажут Вам такие трюки smile.gif , что Вы и Си, и среду IAR гораздо быстрее (и с большим интересом) освоите.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 2 2005, 14:03
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



да Вы правы, только сначала лучьше написать, а потом уже оптимизировать.
Совершенству нет предела...
Кроме того я писал в Algorithm Builder а вылаживать это несколько проблемно.
мелкий рисунок без лупы трудно разглядеть smile.gif
Ваши рекомендации понятны, буду совершенствоваться.
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 2 2005, 18:25
Сообщение #40


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(&-rey @ Nov 2 2005, 15:01)
В С нет сдвига через перенос. Как быть?

Попробуй так:
Код
a=a<<1;
if(SREG&1)
a|=1;
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 3 2005, 16:19
Сообщение #41


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Old1 @ Nov 2 2005, 21:25)
Цитата(&-rey @ Nov 2 2005, 15:01)
В С нет сдвига через перенос. Как быть?

Попробуй так:
Код
a=a<<1;
if(SREG&1)
a|=1;

*


Упс, я был не прав, сдвиг через перенос правилнее сделать так:
Код
if(SREG&1)
{
   a=a<<1;
   a++;
}
else
a=a<<1;

только вот вопрос: зачем это нужно, работая с языком высокого уровня?
Go to the top of the page
 
+Quote Post
AVR
сообщение Nov 3 2005, 22:24
Сообщение #42


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



У меня IAR EW AVR 4.11A евалуэйшн версия.
В списке языков доступен лишь C. Возможно ли как-то задействовать и Embedded C++?


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 4 2005, 07:37
Сообщение #43


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(AVR @ Nov 4 2005, 01:24)
У меня IAR EW AVR 4.11A евалуэйшн версия.
В списке языков доступен лишь C. Возможно ли как-то задействовать и Embedded C++?
*

В настройках проекта General Options/Library Configurations/Library следует выбрать Normal DLIB или Full DLIB.
Главное, чтобы такие Library Files существовали. Если их нет (да и в любом случае), закачайте апдейт CPP библиотек с IARа.
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 4 2005, 08:08
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(IgorKossak @ Nov 4 2005, 11:37)
В настройках проекта General Options/Library Configurations/Library следует выбрать Normal DLIB или Full DLIB.
Главное, чтобы такие Library Files существовали. Если их нет (да и в любом случае), закачайте апдейт CPP библиотек с IARа.
*


Прошерстил сайт IAR апдейт ССР библиотек не нашел. Если можно поподробнее.И как правильно эти библиотеки прикрутить.Спасибо.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 4 2005, 08:15
Сообщение #45


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(m16 @ Nov 4 2005, 11:08)
Прошерстил сайт  IAR  апдейт ССР библиотек не нашел. Если можно поподробнее.И как правильно эти библиотеки прикрутить.Спасибо.
*

Скачать можно здесь, а описание как "прикрутить" - в PatchReadme.html
На здоровье.
Go to the top of the page
 
+Quote Post
AVR
сообщение Nov 4 2005, 14:38
Сообщение #46


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(IgorKossak @ Nov 4 2005, 11:37)
Цитата(AVR @ Nov 4 2005, 01:24)
У меня IAR EW AVR 4.11A евалуэйшн версия.
В списке языков доступен лишь C. Возможно ли как-то задействовать и Embedded C++?
В настройках проекта General Options/Library Configurations/Library следует выбрать Normal DLIB или Full DLIB.

Спасибо за подсказку, так открылся доступ к C++.


--------------------
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 4 2005, 14:49
Сообщение #47


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(AVR @ Nov 4 2005, 18:38)
Спасибо за подсказку, так открылся доступ к C++.
*

я тоже посчитал что открылся пока не скомпилил простейшую прогу-куча ошибок. пришлось с иара ССР качать (55метров)
Go to the top of the page
 
+Quote Post
AVR
сообщение Nov 11 2005, 22:14
Сообщение #48


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(m16 @ Nov 4 2005, 18:49) *
я тоже посчитал что открылся пока не скомпилил простейшую прогу-куча ошибок. пришлось с иара ССР качать (55метров)

У меня заработало без установки CCP.


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 15 2005, 08:18
Сообщение #49


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(AVR @ Nov 12 2005, 00:14) *
У меня заработало без установки CCP.

Заработать то оно заработало, но насколько корректно.
ИАРовцы сообщали о критической ошибке в библиотеках, которая состоит в том, что если применяются операции с типом float, то иногда может сброситься флаг разрешения прерываний.
Кроме того в изначальной поставке отсутствуют некоторые (и довольно многие) библиотеки.
Так что на мой взгляд лучше закачать. Затраты на закачку того стОят.
Go to the top of the page
 
+Quote Post
forever failure
сообщение Nov 16 2005, 13:55
Сообщение #50


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Ага: а под версию 3.20D есть такая заплатка ?
а то у меня тоже C++ компилятор абсолютно не работоспособен -
простейшее объявление класса ещё может скомипилять, а стоит подключить какой-нить стандартный заголовок - тут же куча ошибок.
На iar.com ни хрена про ето не нашёл.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2005, 16:46
Сообщение #51


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(forever failure @ Nov 16 2005, 15:55) *
Ага: а под версию 3.20D есть такая заплатка ?
а то у меня тоже C++ компилятор абсолютно не работоспособен -
простейшее объявление класса ещё может скомипилять, а стоит подключить какой-нить стандартный заголовок - тут же куча ошибок.
На iar.com ни хрена про ето не нашёл.

Странно, когда у меня была эта версия, я ни в чём подобном не нуждался.
Хотя проекты были и сложными и большими.
Видимо что-то в Вашем коде не так. wink.gif
Go to the top of the page
 
+Quote Post
forever failure
сообщение Nov 16 2005, 18:27
Сообщение #52


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



че не так ?

// main.cpp:
#include <complex>

int main (void)
{
return 0;
}

всё, курим бамбук .....
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 16 2005, 18:48
Сообщение #53


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(forever failure @ Nov 16 2005, 21:27) *
че не так ?

// main.cpp:
#include <complex>

int main (void)
{
return 0;
}

всё, курим бамбук .....

В чем проблема-то? Если не компилится, то проверь С++ включен или нет, если не включен, то смотри выше как включить...
Go to the top of the page
 
+Quote Post
forever failure
сообщение Nov 16 2005, 18:56
Сообщение #54


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Цитата(Old1 @ Nov 16 2005, 23:48) *
В чем проблема-то? Если не компилится, то проверь С++ включен или нет, если не включен, то смотри выше как включить...


Кгммммм.... Я вообще-то внимательно читаю посты, прежде чем задать такой идиотский вопрос.
"Смотри как включить" не включает - вот в том и проблема.
Go to the top of the page
 
+Quote Post
vet
сообщение Nov 17 2005, 07:02
Сообщение #55


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(forever failure @ Nov 16 2005, 21:56) *
Кгммммм.... Я вообще-то внимательно читаю посты, прежде чем задать такой идиотский вопрос.
"Смотри как включить" не включает - вот в том и проблема.


Посты - это хорошо, но документацию изучать всё-таки нужно.
RTFM: AVR C/C++ Compiler Reference Guide, стр. 11 "Runtime Environment", абзац про CLIB и DLIB;
AVR Embedded Workench User Guide, стр. 53 "Creating a C++ application".


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 17 2005, 07:33
Сообщение #56


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(forever failure @ Nov 16 2005, 21:56) *
Кгммммм.... Я вообще-то внимательно читаю посты, прежде чем задать такой идиотский вопрос.
"Смотри как включить" не включает - вот в том и проблема.

Вопросы нужно задавать корректно, т.е как можно подробнее описать проблему, а у вас из описания только
Цитата
всё, курим бамбук .....

и присоединяюсь к vet
Цитата
прежде чем задать такой идиотский вопрос
не мешало бы изучить мат. часть...
Go to the top of the page
 
+Quote Post
forever failure
сообщение Nov 17 2005, 14:46
Сообщение #57


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Проблема ещё раз :

#include <complex>

int main (void)
{
return 0;
}
/* EOF*/

при компиляции получаю сообщения о 25 ошибках в заголовке <complex>
(см. прикреплённый error.txt)

и ещё, прошу подтвердить или опровергнуть такое предположение, возникшее после
изучения документации:

В IAR поддерживается сильно покоцаный C++, который назван EC++.

И всё равно, как бы там ни было, стандартный заголовок должен компилятся хоть как,
раз он входит в комплект поставки.
Прикрепленные файлы
Прикрепленный файл  error.txt ( 1.62 килобайт ) Кол-во скачиваний: 838
 
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 17 2005, 21:01
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата
при компиляции получаю сообщения о 25 ошибках в заголовке <complex>

В версии 4.11 все компилится без проблем. Версии 3.20 под рукой не оказалось, разыскал древнюю 2.26, там действительно появляются ошибки: ...Error[Pe040]..., но если в настройках компилятора установить режим "Use 64-bit dоubles", то все начинает работать. Попробуйте тоже самое сделать в вашей 3.20, может поможет...
Цитата
В IAR поддерживается сильно покоцаный C++, который назван EC++.

Насчет сильно покоцанный: все на свете относительно... EC++ - это, как я понял, embedded C++ и ИМХО главное его отличие от ANSI С++ это наличие расширений(добавлений) связанных со спецификой ядра AVR...
Go to the top of the page
 
+Quote Post
vet
сообщение Nov 18 2005, 12:39
Сообщение #59


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



forever failure
IAR 4.10B. Создал С++ проект, вставил исходник. Скомпилировалось сразу же, без всякого шаманства, без ошибок и предупреждений.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
forever failure
сообщение Nov 18 2005, 14:10
Сообщение #60


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



с 64 bit double помогло. Однако Большой Бубен, однако, что не говори.

Цитата(Old1 @ Nov 18 2005, 02:01) *
EC++ - это, как я понял, embedded C++ и ИМХО главное его отличие от ANSI С++ это наличие расширений(добавлений) связанных со спецификой ядра AVR...

IMHO, не менее главное отличие ещё и отсутствие почти всех основных средств, предоставляемых C++.
"Спору нет вещица забавная, цены немалой", однако вобще зачем понадобилось исключать
из него например namespaces или templates непонятно.
С таким компилятором на C++ че-то делать особого смысла нет, ну разве что использовать inline и
объявление переменной в любом месте, где допустим оператор.
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 18 2005, 14:40
Сообщение #61


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(forever failure @ Nov 18 2005, 20:10) *
с 64 bit double помогло. Однако Большой Бубен, однако, что не говори.

Цитата(Old1 @ Nov 18 2005, 02:01) *

EC++ - это, как я понял, embedded C++ и ИМХО главное его отличие от ANSI С++ это наличие расширений(добавлений) связанных со спецификой ядра AVR...

IMHO, не менее главное отличие ещё и отсутствие почти всех основных средств, предоставляемых C++.
"Спору нет вещица забавная, цены немалой", однако вобще зачем понадобилось исключать
из него например namespaces или templates непонятно.
С таким компилятором на C++ че-то делать особого смысла нет, ну разве что использовать inline и
объявление переменной в любом месте, где допустим оператор.

ЕС++ не имеет никакого отношения к специфике AVR. Это просто урезанный С++, в нем нет шаблонов, пространств имен, множественного наследования, информации о типе на рантайме, поддержки исключений и поддержки нового синтаксиса кастов.

Из полезного - есть основная фича С++ - классы. Инлайны, как раз, до кучи.

Кстати, в версиях EWAVR 4.xx введена поддержка шаблонов, неймспейсов, новых кастов, т.ч. получается есть почти все, что нужно - RTTI и исключения на AVR уж точно не нужны. Множественное наследование, возможно было бы не лишним, но, имхо, его отсутствие совершенно не мешает жить.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:28
Рейтинг@Mail.ru


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