Странная ошибка
- Войдите на сайт для отправки комментариев
При компиляции скетча в arduino 1.6 возникает следующее сообщение:
Arduino: 1.6.0 (Windows XP), Плата"atmega168 (16 MHz)"
Build options changed, rebuilding all
Using library SPI in folder: d:\arduino-1.6\hardware\arduino\avr\libraries\SPI
Using library EEPROM in folder: d:\arduino-1.6\hardware\arduino\avr\libraries\EEPROM
d:\arduino-1.6/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_A168_16MHZ -DARDUINO_ARCH_AVR -Id:\arduino-1.6\hardware\arduino\avr\cores\arduino -Id:\arduino-1.6\hardware\arduino\avr\variants\standard -Id:\arduino-1.6\hardware\arduino\avr\libraries\SPI -Id:\arduino-1.6\hardware\arduino\avr\libraries\EEPROM D:\Temp\build4405339386464470727.tmp\drv12lib.cpp -o D:\Temp\build4405339386464470727.tmp\drv12lib.cpp.o
d:\arduino-1.6/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_A168_16MHZ -DARDUINO_ARCH_AVR -Id:\arduino-1.6\hardware\arduino\avr\cores\arduino -Id:\arduino-1.6\hardware\arduino\avr\variants\standard -Id:\arduino-1.6\hardware\arduino\avr\libraries\SPI -Id:\arduino-1.6\hardware\arduino\avr\libraries\EEPROM D:\Temp\build4405339386464470727.tmp\DRV12_400.cpp -o D:\Temp\build4405339386464470727.tmp\DRV12_400.cpp.o
DRV12_400.ino: In function 'int calc5(int)':
DRV12_400.ino:320:1: error: unable to find a register to spill in class 'POINTER_REGS'
DRV12_400.ino:320:1: error: this is the insn:
(insn 54 53 56 3 (set (reg:SF 69 [ D.4519 ])
(mem:SF (post_inc:HI (reg:HI 16 r16 [orig:62 ivtmp.157 ] [62])) [2 MEM[base: _1, offset: 0B]+0 S4 A8])) DRV12_400.ino:316 99 {*movsf}
(expr_list:REG_INC (reg:HI 16 r16 [orig:62 ivtmp.157 ] [62])
(nil)))
DRV12_400.ino:320: confused by earlier errors, bailing out
Ошибка компиляции.
Код:
int calc5 (int tc) { tc = tc-tnorm; float x = (float)tc; float x2=x*x; int res = 0; for (int i=1; i<5; i++) { res+=tbl.f[i]*x2; x2*=x; } return res; } // line 320
В версии 1.0.5 все компилируется и работает.
Вроде как использывание старых библиотек проблемно на новых версиях ардуино, надо залезть в библиотеку и чегото поменять.
DeGlucker, это не полный скетч. Покажите полный.
Спасибо за ответы, Похоже это фичи компилятора, библиотеки родные из дистрибутива.
Меня вполне устраивает в этом проекте версия 1.0.5
Выкладываю минимальный некомпилируемый скетч.
Ошибка:
Arduino: 1.5.7 (Windows XP), Board: "Arduino Uno"
Build options changed, rebuilding all
TEST.ino: In function 'int calc5(int)':
TEST.ino:24:1: error: unable to find a register to spill in class 'POINTER_REGS'
TEST.ino:24:1: error: this is the insn:
(insn 50 49 52 3 (set (reg:SF 65 [ D.3824 ])
(mem:SF (post_inc:HI (reg:HI 16 r16 [orig:62 ivtmp.15 ] [62])) [2 MEM[base: _1, offset: 0B]+0 S4 A8])) TEST.ino:20 99 {*movsf}
(expr_list:REG_INC (reg:HI 16 r16 [orig:62 ivtmp.15 ] [62])
(nil)))
TEST.ino:24: confused by earlier errors, bailing out
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
В чем проблема ??? (на версии 1.0.5 компилируется и работает)
Возможно в этом
float
x = (
float
)tc;
Не слишком ли "лихо" приведен тип? И вобще зачем здесь приведение типа?Нет. Проверил, проблема не в этом.
int tbl[] = {0.8, 0.64, 0.51, 0.41, 0.33};
http://arduino.ru/Reference/Array
Вот что пишут про это - https://github.com/MarlinFirmware/Marlin/issues/1523.
В общем ошибка компилятора. Если сильно нужно - добавте в цикл безобидное asm ( "nop \n\t"); после первой или второй строки и компилятор попустит. Проверено на 1.6.3 перед самым его сносом :)
Спасибо, помогло.
Кто пробовал, на 1.6.4 эту багу пофиксили?