《线程》中讨论的其他部件:BOOSTXL-音频, ABS
我有一个代码,用于计算神经网络的一些数学系数。 在调试过程中,我有一个需要为“双”数据类型的变量。 当我在特定位置的代码中使用它时,代码在调试过程中会崩溃。 我使用 BOOSTXL-AUDIO Playback 示例作为参考。 在过去的几天里,我测试了不同的案例,以观察发生这种碰撞的案例。 在我发现的两种情况中,在一种情况下,当我使用“双”数据类型声明变量时,代码工作正常,并继续执行,但在另一种情况下, 完全相同的代码无法执行,并进入“永久锁定”状态,或者只关闭代码并将其分支到“boot.c”文件中。 我完全不知道为什么它对完全相同的代码会有不同的行为,除了一个变量被定义为“双变量”而不是“浮点”的更改。
PS。 根据函数定义,变量需要为“双”格式。
下面是发生崩溃的代码的一部分。 我正在从项目中添加“主.c”和“应用程序.c”文件。
int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer initClock(); initGpio(); PM5CTL0 &= ~LOCKLPM5; // Clear lock bit // vm1010 mode pin (P6.1), o/p, low at start for normal mode P6OUT &= ~BIT1; // vm1010 P6DIR |= BIT1; // vm1010 // vm1010 mic power on (P6.2) P6OUT |= BIT2; // vm1010 P6DIR |= BIT2; // vm1010 // vm1010 mode pin, o/p, high for WoS mode P6OUT |= BIT1; // vm1010 P5IFG &= ~BIT6; // Clear interrupt on P5.6 P5IE |= BIT6; // Enable interrupt on P5.6 P5IFG &= ~BIT5; // Clear interrupt on P5.5 P5IE |= BIT5; // Enable interrupt on P5.5 // vm1010 P5IFG &= ~BIT7; // Clear interrupt on P5.7 P5IE |= BIT7; // Enable interrupt on P5.7 // Enable Switch interrupt GPIO_clearInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN); GPIO_enableInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN); // Initialize DAC DAC8311_init(); // Set the DAC to low power mode with output high-Z DAC8311_setLowPowerMode(DAC8311_OUTPUT_HIGHZ); __bis_SR_register(GIE); // Starts the application. It is a function that never returns. runApplication(); return 1; }
void runApplication(void) { while(1) { P5IE &= ~BIT7; // Disable interrupt on P5.7 // vm1010 P5IE &= ~BIT6; // Disable interrupt on P5.6 P5IE &= ~BIT5; // Disable interrupt on P5.5 // Disable button interrupt GPIO_disableInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN); switch(applicationMode) { volatile uint16_t j; case RECORD: * runRecord(); * amplify_data(); * fft_init(); while(window_number < 64) { fft_cal(); } window_number=0; for(j = 1; j < (VECTOR_SIZE / 2); j++) // vm1010 { // vm1010 real = fft_res[2 * j] << 2; imag = fft_res[2 * j + 1] << 2; if(real < 0) { real_abs = ~real + 1; } else { real_abs = real; } if(imag < 0) { imag_abs = ~imag + 1; } else { imag_abs = imag; } if(real_abs >= imag_abs) { max = real_abs; min = imag_abs; } else { max = imag_abs; min = real_abs; } mag = max + 3 * (min >> 3); FFT_data[j] = mag << 1; } break; default: break; } // Toggle app mode applicationMode = DEFAULT; P6OUT &= ~BIT1; // vm1010 // Set a Switch debounce to 500ms __delay_cycles(0.5 * __SYSTEM_FREQUENCY_MHZ__); P5IFG &= ~BIT6; // Clear interrupt on P5.6 P5IE |= BIT6; // Enable interrupt on P5.6 P5IFG &= ~BIT5; // Clear interrupt on P5.5 P5IE |= BIT5; // Enable interrupt on P5.5 P5IFG &= ~BIT7; // Clear interrupt on P5.7 // vm1010 P5IE |= BIT7; // Enable interrupt on P5.7 // vm1010 // vm1010 mode pin, o/p, high for WoS mode P6OUT |= BIT1; // vm1010 GPIO_clearInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN); // Clear the interrupt flag GPIO_enableInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN); // Re-enable the interrupt // Enter low power mode * __bis_SR_register(LPM4_bits + GIE); float mfcc_result; float mfcc_value[13]; float mfcc_features_f[12]; * if(FFT_data[1] != 0) { // MFCC Calculations can be included here double spectrum[512]; // when double changes to float - the code runs correctly int i; for(i=0;i<512;i++) { spectrum[i] = (double)FFT_data[i]; }
我还在第二个文件中标记了我的调试点的位置“*”。 我尝试查看详细描述数据类型和声明行为的不同文档,但我找不到这种行为的原因。 在 另一个项目中单独执行时,如果使用完全相同的逻辑(包括“双”声明)执行,则系数的计算工作正常。 如果我能对这里可能出现的问题有任何想法,我可以尝试一下。 如果需要更多详细信息来帮助更好地理解问题,请告诉我。