尝试验证代码时出现一些错误([-Waggressive-loop-optimizations])(仅覆盖相关通道)
Getting some errors when trying verify the code ([-Waggressive-loop-optimizations]) (only relevant channels are overridden)
我正在尝试用这段代码制作平衡机器人 https://github.com/mahowik/BalancingWii 我看到了很多关于这个项目和相同代码的教程视频,但是在 Arduino IDE 中验证代码时没有人得到这个错误所以我认为问题不在代码中,而是在我身上。
我尝试了旧版本的 Arduino IDE (1.6.12) 但它仍然给出同样的错误。
sketch\RX.cpp: In function 'computeRC()':
sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Waggressive-loop-optimizations]
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
~~~~~~~~~~~~~^
sketch\RX.cpp:412:25: note: within this loop
for (chan = 0; chan < RC_CHANS; chan++) {
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Waggressive-loop-optimizations]
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
^
sketch\RX.cpp:412:25: note: within this loop
for (chan = 0; chan < RC_CHANS; chan++) {
^
Sketch uses 14300 bytes (46%) of program storage space. Maximum is 30720 bytes.
Global variables use 1022 bytes (49%) of dynamic memory, leaving 1026 bytes for local variables. Maximum is 2048 bytes.
代码有很多文件,所以我将跳过错误部分
/**************************************************************************************/
/*************** compute and Filter the RX data ********************/
/**************************************************************************************/
void computeRC() {
static uint16_t rcData4Values[RC_CHANS][4], rcDataMean[RC_CHANS];
static uint8_t rc4ValuesIndex = 0;
uint8_t chan,a;
#if !defined(OPENLRSv2MULTI) // dont know if this is right here
#if defined(SBUS)
readSBus();
#endif
rc4ValuesIndex++;
if (rc4ValuesIndex == 4) rc4ValuesIndex = 0;
for (chan = 0; chan < RC_CHANS; chan++) {
#if defined(FAILSAFE)
uint16_t rcval = readRawRC(chan);
if(rcval>FAILSAFE_DETECT_TRESHOLD || chan > 3 || !f.ARMED) { // update controls channel only if pulse is above FAILSAFE_DETECT_TRESHOLD
rcData4Values[chan][rc4ValuesIndex] = rcval; // In disarmed state allow always update for easer configuration.
}
#else
rcData4Values[chan][rc4ValuesIndex] = readRawRC(chan);
#endif
#if defined(SPEKTRUM) || defined(SBUS) // no averaging for Spektrum & SBUS signal
rcData[chan] = rcData4Values[chan][rc4ValuesIndex];
#else
rcDataMean[chan] = 0;
for (a=0;a<4;a++) rcDataMean[chan] += rcData4Values[chan][a];
rcDataMean[chan]= (rcDataMean[chan]+2)>>2;
if ( rcDataMean[chan] < (uint16_t)rcData[chan] -3) rcData[chan] = rcDataMean[chan]+2;
if ( rcDataMean[chan] > (uint16_t)rcData[chan] +3) rcData[chan] = rcDataMean[chan]-2;
#endif
//if (chan<8 && rcSerialCount > 0) { // rcData comes from MSP and overrides RX Data until rcSerialCount reaches 0
//rcSerialCount --;
#if defined(FAILSAFE)
failsafeCnt = 0;
#endif
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
//}
}
#endif
}
发生此错误是因为索引 chan
(一直到 RC_CHANS
)大于数组 rcSerial
(即 8)的大小。
错误行周围的部分检查if (chan<8
,但被注释掉了。我想你可以把它加回去看看代码是否有效。
试试这个:
视频 => https://youtu.be/pnIWtPeqc0o
代码=> https://create.arduino.cc/projecthub/rinotronik/uno-minimal-system-read-rc-sbus-to-servo-signals-with-oled-d308aa
我正在尝试用这段代码制作平衡机器人 https://github.com/mahowik/BalancingWii 我看到了很多关于这个项目和相同代码的教程视频,但是在 Arduino IDE 中验证代码时没有人得到这个错误所以我认为问题不在代码中,而是在我身上。
我尝试了旧版本的 Arduino IDE (1.6.12) 但它仍然给出同样的错误。
sketch\RX.cpp: In function 'computeRC()':
sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Waggressive-loop-optimizations]
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
~~~~~~~~~~~~~^
sketch\RX.cpp:412:25: note: within this loop
for (chan = 0; chan < RC_CHANS; chan++) {
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Waggressive-loop-optimizations]
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
^
sketch\RX.cpp:412:25: note: within this loop
for (chan = 0; chan < RC_CHANS; chan++) {
^
Sketch uses 14300 bytes (46%) of program storage space. Maximum is 30720 bytes.
Global variables use 1022 bytes (49%) of dynamic memory, leaving 1026 bytes for local variables. Maximum is 2048 bytes.
代码有很多文件,所以我将跳过错误部分
/**************************************************************************************/
/*************** compute and Filter the RX data ********************/
/**************************************************************************************/
void computeRC() {
static uint16_t rcData4Values[RC_CHANS][4], rcDataMean[RC_CHANS];
static uint8_t rc4ValuesIndex = 0;
uint8_t chan,a;
#if !defined(OPENLRSv2MULTI) // dont know if this is right here
#if defined(SBUS)
readSBus();
#endif
rc4ValuesIndex++;
if (rc4ValuesIndex == 4) rc4ValuesIndex = 0;
for (chan = 0; chan < RC_CHANS; chan++) {
#if defined(FAILSAFE)
uint16_t rcval = readRawRC(chan);
if(rcval>FAILSAFE_DETECT_TRESHOLD || chan > 3 || !f.ARMED) { // update controls channel only if pulse is above FAILSAFE_DETECT_TRESHOLD
rcData4Values[chan][rc4ValuesIndex] = rcval; // In disarmed state allow always update for easer configuration.
}
#else
rcData4Values[chan][rc4ValuesIndex] = readRawRC(chan);
#endif
#if defined(SPEKTRUM) || defined(SBUS) // no averaging for Spektrum & SBUS signal
rcData[chan] = rcData4Values[chan][rc4ValuesIndex];
#else
rcDataMean[chan] = 0;
for (a=0;a<4;a++) rcDataMean[chan] += rcData4Values[chan][a];
rcDataMean[chan]= (rcDataMean[chan]+2)>>2;
if ( rcDataMean[chan] < (uint16_t)rcData[chan] -3) rcData[chan] = rcDataMean[chan]+2;
if ( rcDataMean[chan] > (uint16_t)rcData[chan] +3) rcData[chan] = rcDataMean[chan]-2;
#endif
//if (chan<8 && rcSerialCount > 0) { // rcData comes from MSP and overrides RX Data until rcSerialCount reaches 0
//rcSerialCount --;
#if defined(FAILSAFE)
failsafeCnt = 0;
#endif
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
//}
}
#endif
}
发生此错误是因为索引 chan
(一直到 RC_CHANS
)大于数组 rcSerial
(即 8)的大小。
错误行周围的部分检查if (chan<8
,但被注释掉了。我想你可以把它加回去看看代码是否有效。
试试这个: 视频 => https://youtu.be/pnIWtPeqc0o 代码=> https://create.arduino.cc/projecthub/rinotronik/uno-minimal-system-read-rc-sbus-to-servo-signals-with-oled-d308aa