Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于能源效率的Arduino(基于C语言)编程_C_Performance_Arduino_Processing Efficiency - Fatal编程技术网

用于能源效率的Arduino(基于C语言)编程

用于能源效率的Arduino(基于C语言)编程,c,performance,arduino,processing-efficiency,C,Performance,Arduino,Processing Efficiency,我有一个问题,我还没有找到这个问题的答案 我最近启动了一个项目,建立一个Arduino板,控制各种LED从红色到黄色,从黄色到绿色的光谱转换, 绿色到青色,青色到蓝色,蓝色到洋红,洋红到红色。 使用指针映射整个光谱的每个RGB值,基于 关闭255个索引数组 我的问题是关于编写节能代码。我需要它尽可能有效,因为我的项目将运行4个可充电AA电池(1.5V AA每个) 如何编写节能代码?或者这是一个徒劳的问题 我的假设(可能非常不准确)是,设置完成后,在循环过程中消耗的能量会减少 有关守则如下: in

我有一个问题,我还没有找到这个问题的答案

我最近启动了一个项目,建立一个Arduino板,控制各种LED从红色到黄色,从黄色到绿色的光谱转换, 绿色到青色,青色到蓝色,蓝色到洋红,洋红到红色。 使用指针映射整个光谱的每个RGB值,基于 关闭255个索引数组

我的问题是关于编写节能代码。我需要它尽可能有效,因为我的项目将运行4个可充电AA电池(1.5V AA每个)

如何编写节能代码?或者这是一个徒劳的问题

我的假设(可能非常不准确)是,设置完成后,在循环过程中消耗的能量会减少

有关守则如下:

int const RED = 3 /* Pin 3 */, BLUE = 5 /* Pin 5 */, GREEN = 6 /* Pin 6 */;
int* _RED[1536];
int* _GREEN[1536];
int* _BLUE[1536];
int RGB[256];


void setup() {
    for (int i = 0; i<256;++i){
        RGB[i] = i;
    }
//RED TO YELLOW
    for (int i = 0 ; i<256;++i){
        _RED[i] = &RGB[255];
        _GREEN[i] = &RGB[i];
        _BLUE[i] = &RGB[0];
    }
 //YELLOW TO GREEN
    for (int i = 256;i < 512; ++i){
        _RED[i] = &RGB[511-i];
        _GREEN[i] = &RGB[255];
        _BLUE[i] = &RGB[0];
    }
 //GREEN TO TEAL
    for (int i = 512; i <768;++i){
        _RED[i] = &RGB[0];
        _GREEN[i] = &RGB[255];
        _BLUE[i] = &RGB[255+(i-767)];
    }
 //TEAL TO BLUE
    for (int i = 768; i < 1024; ++i){
        _RED[i] = &RGB[0];
        _GREEN[i] = &RGB[1023-i];
        _BLUE[i] = &RGB[255];
    }
 //BLUE TO MAGENTA
    for (int i = 1024; i < 1280; ++i){
        _RED[i] = &RGB[(255+(i-1279))];
        _GREEN[i] = &RGB[0];
        _BLUE[i] = &RGB[255];
    }
 //MAGENTA TO RED
    for (int i = 1280; i < 1536; ++i){
        _RED[i] = &RGB[255];
        _GREEN[i] = &RGB[0];
        _BLUE[i] = &RGB[1535-i];
    }
 //COMPLETES FULL SPECTRUM EXCLUDING WHITE AND BLACK
}

void loop(){
for(int i = 0; i <1536; ++i){
    analogWrite(RED,*_RED[i]);
    analogWrite(GREEN,*_GREEN[i]);
    analogWrite(BLUE,*_BLUE[i]);
    delay(100);
}

}
int const红色=3/*插脚3*/,蓝色=5/*插脚5*/,绿色=6/*插脚6*/;
国际红新月会[1536];
国际绿色组织[1536];
int*_蓝[1536];
int-RGB[256];
无效设置(){

对于(int i=0;i这两个程序的能耗大致相等(相当高),就像Arduino
delay()
函数不会将处理器置于睡眠状态。如果功耗很重要,您需要自己将处理器置于睡眠模式。不幸的是,Arduino框架没有公开任何方法来实现这一点;您需要使用适当的AVR寄存器和内部函数来实现这一点


另一个问题是,第一个程序需要为您的四个阵列提供大约10 KB的RAM,这比大多数AVR微控制器上可用的内存要多得多。一般来说,在这个平台上应该避免使用大型查找表。

这两个程序的内存大致相等(而且相当高)能源使用,如Arduino
delay()
函数不会将处理器置于睡眠状态。如果功耗很重要,您需要自己将处理器置于睡眠模式。不幸的是,Arduino框架没有公开任何方法来实现这一点;您需要使用适当的AVR寄存器和内部函数来实现这一点



另一个问题是,第一个程序需要为您的四个阵列提供大约10 KB的RAM,这比大多数AVR微控制器上可用的内存要多得多。一般来说,在这个平台上应该避免使用大型查找表。

绝对不是第一个,您有一个指针阵列,这会额外消耗间接内存开启(浪费的CPU周期=浪费的电源),并且您试图存储的数据无论如何都比指针小。我很确定这完全取决于您的电路板的细节。例如,这里有一些关于Arduino零功率管理的有趣信息:谢谢@Gene我能得到的所有信息都会有帮助。Ben我假设使用指针和1个整数而不是3个整数会有帮助更少的空间LED功耗是“能源效率”的一部分吗?@Brett:“脉冲波调制”…利用人类视觉皮层中的“视觉持久性”,对LED功率进行简单的线性控制。(它不会避免视觉中的非线性,只会避免LED中的非线性)。不要尝试使用计算机视觉(光电晶体管/光电二极管)因为它们不会经历视觉的持久性。绝对不是第一个,你有一个指针数组,这会花费你额外的间接性(浪费的CPU周期=浪费的电源),并且您试图存储的数据无论如何都比指针小。我很确定这完全取决于您的电路板的细节。例如,这里有一些关于Arduino零功率管理的有趣信息:谢谢@Gene我能得到的所有信息都会有帮助。Ben我假设使用指针和1个整数而不是3个整数会有帮助更少的空间LED功耗是“能源效率”的一部分吗?@Brett:“脉冲波调制”…利用人类视觉皮层中的“视觉持久性”,对LED功率进行简单的线性控制。(它不会避免视觉中的非线性,只会避免LED中的非线性)。不要尝试使用计算机视觉(光电晶体管/光电二极管)因为它们没有视觉的持久性。我不知道
analogWrite
功能的效率有多低,也许它确实使两者相等。但是OP的代码在操作循环中的操作数(甚至不计算设置)在第一个版本中要高得多。这段代码将在arduino 101或zero上运行,两者都有28-32KB的ram。也就是说,我开始认为,与正在使用的板相比,这段代码的影响更小。@BenVoigt这里的操作数无关紧要。处理器100%的时间都处于运行模式,如
 delay()
是一个spinloop。@Daskwuff:是的……spinloop可能没有与典型应用程序代码相同的电源特性,但即使它节省了一点(因为例如SIMD和FPU晶体管不切换,当然这些Atmel处理器没有任何电源特性)它最多可以节省几十%的电量,而不是睡眠模式下的98%。而且在某些处理器上,紧密循环可能比平均消耗量更高。@BrettReinhard顺便说一句,在那些主板上,它实际上更接近20KB。
int
指针在AVR上是16位,在ARM上是32位。不管怎样,这都是浪费时间内存。我不知道
analogWrite
函数的效率有多低,也许它确实使两者相等。但是OP的代码在操作循环中的操作数(甚至不包括计数设置)在第一个版本中要高得多。这段代码将在arduino 101或zero上运行,两者都有28-32KB的ram。也就是说,我开始认为,与正在使用的板相比,这段代码的影响更小。@BenVoigt这里的操作数无关紧要。处理器100%的时间都处于运行模式,如
 延迟()
int const Red = 3,  /* Pin 3 */ Blue = 5, /* Pin 5 */ Green = 6; /* Pin 6 */
void RGB(int R, int G, int B) {
analogWrite(Red,R); analogWrite(Green,G); analogWrite(Blue,B); delay(25);}
void setup() {}
void loop() {
int r=0,g=0,b=0;
r = 255;g = 0;b = 0; for (int i = 0; i < 256; ++i){RGB(r,i,b);}
r = 255; g = 255;b = 0; for (int i = 255; i >= 0; --i){RGB(i,g,b); } 
r = 0;g = 255;b = 0; for (int i = 0; i < 256; ++i){RGB(r,g,i);}
r = 0;g = 255;b = 255; for (int i = 255; i >= 0; --i){RGB(r,i,b);}
r = 0;g = 0;b = 255; for (int i = 0; i < 256; ++i){RGB(i,g,b);}
r = 255;g = 0;b = 255; for (int i = 255; i >= 0; --i){RGB(r,g,i);}
delay(1000);
     }