最近、あるCPUを使用して計算処理(主にlong型の除算)が意外なほど長くかかっていることに気付きarduinoでも試してみようと思いました
※ 入門編としてまだ先まで考えていましたが放置し過ぎて何をやろうとしていたのか忘れたので入門編終了です
int t[2];
int time;
float s1;
float s2;
float cal;
t[0] = micros();
cal = s1 / s2;
t[1] = micros();
time = t[1] - t[0];
long lst1,lst2; //入力値long
float fst1,fst2; //入力値float
boolean ksf,s1; //実行,符号
char jjt = 0; //受信判定状態
float kss; //小数点以下受信用
void setup(){
Serial.begin(115200);
}
void loop(){
if(Serial.available() > 0){
char dat = Serial.read();
if(dat == '<'){
jjt = 0; //どの状態でも'<'は必ず先頭とする
}
switch(jjt){
case 0: //未受信('<'待ち)
if(dat == '<'){
jjt++;
lst1 = 0;
lst2 = 0;
fst1 = 0;
fst2 = 0;
s1 = 0;
}
break;
case 1: //数値1符号待ち
if(dat == '-'){
s1 = 1;
}else if((dat >= '0') && (dat <= '9')){
lst1 = lst1 * 10 + (dat & 0x0F);
fst1 = lst1;
}else{
Serial.println("NG");
jjt = 0 - 1;
}
jjt++;
break;
case 2: //数値1整数待ち
if((dat >= '0') && (dat <= '9')){
lst1 = lst1 * 10 + (dat & 0x0F);
fst1 = lst1;
}else if(dat == '.'){
jjt++;
kss = 0.1;
}else if(dat == ','){
if(s1){
lst1 *= -1;
fst1 = lst1;
}
s1 = 0;
jjt = 4;
}else{
Serial.println("NG");
jjt = 0;
}
break;
case 3: //数値1小数待ち
if((dat >= '0') && (dat <= '9')){
fst1 += kss * (dat & 0x0F);
kss /= 10;
}else if(dat == ','){
if(s1){
lst1 *= -1;
fst1 *= -1;
}
s1 = 0;
jjt = 4;
}else{
Serial.println("NG");
jjt = 0;
}
break;
case 4: //数値2符号待ち
if(dat == '-'){
s1 = 1;
}else if((dat >= '0') && (dat <= '9')){
lst2 = lst2 * 10 + (dat & 0x0F);
fst2 = lst2;
}else{
Serial.println("NG");
jjt = 0 - 1;
}
jjt++;
break;
case 5: //数値2整数待ち
if((dat >= '0') && (dat <= '9')){
lst2 = lst2 * 10 + (dat & 0x0F);
fst2 = lst2;
}else if(dat == '.'){
jjt++;
kss = 0.1;
}else if(dat == '>'){
if(s1){
lst2 *= -1;
fst2 = lst2;
}
jjt = 0;
ksf = 1;
}else{
Serial.println("NG");
jjt = 0;
}
break;
case 6: //数値2小数待ち
if((dat >= '0') && (dat <= '9')){
fst2 += kss * (dat & 0x0F);
kss /= 10;
}else if(dat == '>'){
if(s1){
lst2 *= -1;
fst2 *= -1;
}
jjt = 0;
ksf = 1;
}else{
Serial.println("NG");
jjt = 0;
}
break;
}
}
if(ksf){
//計算・測定
int t[9];
long lk[4];
float fk[4];
t[0] = micros();
lk[0] = lst1 + lst2;
t[1] = micros();
fk[0] = fst1 + fst2;
t[2] = micros();
lk[1] = lst1 - lst2;
t[3] = micros();
fk[1] = fst1 - fst2;
t[4] = micros();
lk[2] = lst1 * lst2;
t[5] = micros();
fk[2] = fst1 * fst2;
t[6] = micros();
lk[3] = lst1 / lst2;
t[7] = micros();
fk[3] = fst1 / fst2;
t[8] = micros();
//excelで読み込みを考慮した1行出力
int tx[8];
tx[0] = t[1] - t[0]; //加算時間long
tx[1] = t[2] - t[1]; //加算時間float
tx[2] = t[3] - t[2]; //減算時間long
tx[3] = t[4] - t[3]; //減算時間float
tx[4] = t[5] - t[4]; //乗算時間long
tx[5] = t[6] - t[5]; //乗算時間float
tx[6] = t[7] - t[6]; //除算時間long
tx[7] = t[8] - t[7]; //除算時間float
Serial.print(fst1); //数値1float
Serial.print(",");
Serial.print(fst2); //数値2float
Serial.print(",,");
Serial.print(lk[0]); //加算結果long
Serial.print(",");
Serial.print(tx[0]); //加算時間long
Serial.print(",");
Serial.print(fk[0]); //加算結果float
Serial.print(",");
Serial.print(tx[1]); //加算時間float
Serial.print(",");
Serial.print(((float)tx[0] / (float)tx[1])); //long計算時間 / float計算時間
Serial.print(",,");
Serial.print(lk[1]); //減算結果long
Serial.print(",");
Serial.print(tx[2]); //減算時間long
Serial.print(",");
Serial.print(fk[1]); //減算結果float
Serial.print(",");
Serial.print(tx[3]); //減算時間float
Serial.print(",");
Serial.print(((float)tx[2] / (float)tx[3])); //long計算時間 / float計算時間
Serial.print(",,");
Serial.print(lk[2]); //乗算結果long
Serial.print(",");
Serial.print(tx[4]); //乗算時間long
Serial.print(",");
Serial.print(fk[2]); //乗算結果float
Serial.print(",");
Serial.print(tx[5]); //乗算時間float
Serial.print(",");
Serial.print(((float)tx[4] / (float)tx[5])); //long計算時間 / float計算時間
Serial.print(",,");
Serial.print(lk[3]); //除算結果long
Serial.print(",");
Serial.print(tx[6]); //除算時間long
Serial.print(",");
Serial.print(fk[3]); //除算結果float
Serial.print(",");
Serial.print(tx[7]); //除算時間float
Serial.print(",");
Serial.println(((float)tx[6] / (float)tx[7])); //long計算時間 / float計算時間
ksf = 0;
}
}