程序運(yùn)行死機(jī)有可能是什么原因造成的

用的CH573,有時候程序跑幾分鐘就死機(jī),有時候跑幾個小時死機(jī),請問有可能是什么原因造成的程序死機(jī)

原因其實很多,


下面就是一個例子:

代碼里面的"while(1)"

在ble的例程里面,如果使用內(nèi)部32K RC時鐘,在做RC時鐘校準(zhǔn)時,需要用到當(dāng)前芯片溫度的函數(shù),函數(shù)如下:

(該代碼 位于CH573 EVT的EXAM\BLE\HAL\MCU.c 文件中,不同版本EVT 可能存在差異,下面代碼來源于CH573 EVT 1.7 )

uint16?HAL_GetInterTempValue(?void?)
{
??uint8?sensor,?channel,?config,?tkey_cfg;
??uint16?adc_data;
??
??tkey_cfg?=?R8_TKEY_CFG;
??sensor?=?R8_TEM_SENSOR;
??channel?=?R8_ADC_CHANNEL;
??config?=?R8_ADC_CFG;
??ADC_InterTSSampInit();
??R8_ADC_CONVERT?|=?RB_ADC_START;
??while(?R8_ADC_CONVERT?&?RB_ADC_START?)
????;
??adc_data?=?R16_ADC_DATA;
??R8_TEM_SENSOR?=?sensor;
??R8_ADC_CHANNEL?=?channel;
??R8_ADC_CFG?=?config;
??R8_TKEY_CFG?=?tkey_cfg;
??return?(?adc_data?);
}

這里很明顯,有個while,

如果,我們在別處更高優(yōu)先級(比如中斷)里使用了這個外設(shè),恰好在

??R8_ADC_CONVERT?|=?RB_ADC_START;

之后,

??while(?R8_ADC_CONVERT?&?RB_ADC_START?)

之前?

那么,當(dāng)我們在回到這里后,由于硬件狀態(tài)機(jī)已經(jīng)被中斷改變,可能就會出現(xiàn)while 永遠(yuǎn)不會跳出的現(xiàn)象了.

解決方式有兩種:

1,上述代碼加原子操作(執(zhí)行開始前關(guān)閉全局中斷,結(jié)束后開全局中斷)

2,不要在中斷中 使用ADC;






只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频