Непонятности с IAR EW2.28

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Сегодня решил все-таки перейти на более современный софт для
программирования AVR, а именно, с IAR EW 1.40C на 2.28A. Взял
простенький работающий проект из трех файлов (процессор 4414), подправил
описания обработчиков прерываний, и...
Фокус заключается в том, что в 1.40 все компилируется, а в 2.28
линковщик выдает:
Error[e46]: Undefined external "NEXTCRC(unsigned int, unsigned char)"
referred in uart ( D:\Projects\motor\out\uart.r90 )


Файл motor.c - там функция main()
В файле uart.c содержится следующая строчка:
extern unsigned int NEXTCRC(unsigned int CRC, unsigned char D);
Далее по тексту эта функция несколько раз вызывается.

Файл CRC16.s90:

NAME  CRC16
RSEG  CODE
PUBLIC  NEXTCRC
;  unsigned int NextCRC(unsigned int CRC, unsigned char D)
;  r16,r17 - privious CRC
;  r20     - data byte D
;  return: r16:r17 - new CRC
NEXTCRC:
    eor    r16,r20
    ldi    r22,0x01
    ldi    r23,0xA0
    ldi    r21,9
Loop:  
    dec    r21
    breq   Stop
    lsr    r17
    ror    r16
    brcc   Loop
    eor    r16,r22
    eor    r17,r23
    rjmp   Loop
Stop:
    ret
END

Помогите, кто-нибудь, а? Перепробовал всевозможные настройки, все
бестолку, объектники генерятся,
в мапе функция присутствует. Какой то этот EC++ неприветливый.
Благодарю всех кто правильно ткнет носом.


Непонятности с IAR EW2.28


AK> Файл motor.c - там функция main()
AK> В файле uart.c содержится следующая строчка:
AK> extern unsigned int NEXTCRC(unsigned int CRC, unsigned char D);
AK> Далее по тексту эта функция несколько раз вызывается.

AK> Файл CRC16.s90:

AK> NAME  CRC16
AK> RSEG  CODE
AK> PUBLIC  NEXTCRC
AK> ;  unsigned int NextCRC(unsigned int CRC, unsigned char D)
AK> ;  r16,r17 - privious CRC
AK> ;  r20     - data byte D
AK> ;  return: r16:r17 - new CRC
AK> NEXTCRC:
AK>     eor    r16,r20
AK>     ldi    r22,0x01
AK>     ldi    r23,0xA0
AK>     ldi    r21,9
AK> Loop:
AK>     dec    r21
AK>     breq   Stop
AK>     lsr    r17
AK>     ror    r16
AK>     brcc   Loop
AK>     eor    r16,r22
AK>     eor    r17,r23
AK>     rjmp   Loop
AK> Stop:
AK>     ret
AK> END

    У тебя, по ходу, режим С++ включен. А значит и кодирование имен в объектных
файлах (для типобезопасного связывания, перегрузки). Чтобы избежать проблем,
нужно либо выключить С++ режим, либо объявить функцию явно с С-связыванием:

extern "С" unsigned int NEXTCRC(unsigned int CRC, unsigned char D);


...so long!

### Варфоломеевская ночь, утро стрелецкой казни... Что-то будет днем!..



Site Timeline