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

Oct 20, 2003 2 Replies

Сегодня решил все-таки перейти на более современный софт для программирования 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++ неприветливый. Благодарю всех кто правильно ткнет носом.


Mon, 20 Oct 2003 17:27:12 +0000 (UTC) Arcady Korotkevitch wrote

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!

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required