Странная ошибка

DeGlucker
Offline
Зарегистрирован: 23.07.2014

При компиляции скетча в 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 все компилируется и работает.

vov4ik
Offline
Зарегистрирован: 10.09.2013

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

toc
Offline
Зарегистрирован: 09.02.2013

DeGlucker, это не полный скетч. Покажите полный.

DeGlucker
Offline
Зарегистрирован: 23.07.2014

Спасибо за ответы, Похоже это фичи компилятора, библиотеки родные из дистрибутива.

Меня вполне устраивает в этом проекте версия 1.0.5

DeGlucker
Offline
Зарегистрирован: 23.07.2014

Выкладываю минимальный некомпилируемый скетч.

float tbl[] = {+0.80, -2.86E-4, -6.52E-7, -2.02E-10, -3.92E-14, 3.47E-5, 1.555E-1, 0.93E-5, 7.748E-1};
//		 x	x^2	  x^3	    x^4	       x^5	 C1	  C2	    C3	     C4

void setup() {

  Serial.begin(115200);
  Serial.println(calc5(100));
}

void loop() {}

// ------------------------------------------- //
int calc5 (int tc) {

  float x = (float)tc;
  float x2=x*x;
  int res = 0;

  for (int i=1; i<5; i++) {
    res+=tbl[i]*x2;
    x2*=x;
  }
  return res;
}

Ошибка:

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 компилируется и работает)

 

Logik
Offline
Зарегистрирован: 05.08.2014

Возможно в этом float x = (float)tc; Не слишком ли "лихо" приведен тип? И вобще зачем здесь приведение типа?

Нет. Проверил, проблема не в этом.

vov4ik
Offline
Зарегистрирован: 10.09.2013

int tbl[] = {0.8, 0.64, 0.51, 0.41, 0.33};

http://arduino.ru/Reference/Array

Logik
Offline
Зарегистрирован: 05.08.2014

Вот что пишут про это - https://github.com/MarlinFirmware/Marlin/issues/1523.

В общем ошибка компилятора. Если сильно нужно - добавте в цикл безобидное asm ( "nop \n\t"); после первой или второй строки и компилятор попустит. Проверено на 1.6.3 перед самым его сносом :)

DeGlucker
Offline
Зарегистрирован: 23.07.2014

Спасибо, помогло.

Logik
Offline
Зарегистрирован: 05.08.2014

Кто пробовал, на 1.6.4 эту багу пофиксили?