《线程》中讨论的其他部件: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];
}
我还在第二个文件中标记了我的调试点的位置“*”。 我尝试查看详细描述数据类型和声明行为的不同文档,但我找不到这种行为的原因。 在 另一个项目中单独执行时,如果使用完全相同的逻辑(包括“双”声明)执行,则系数的计算工作正常。 如果我能对这里可能出现的问题有任何想法,我可以尝试一下。 如果需要更多详细信息来帮助更好地理解问题,请告诉我。