fix bug that phy_enter_critical cannot effect on dual-core
Sometimes, libphy.a call phy_enter_critical() to protect accessing critical sections, such like operating on I2C, but it may not effect when both the CPU core call it. It may cause accessing I2C blocking and cannot recover by esp_restart(), until do HW reboot.
This commit is contained in:
parent
2b2f0d0f28
commit
ea2959af36
1 changed files with 16 additions and 2 deletions
|
@ -67,14 +67,28 @@ static _lock_t s_modem_sleep_lock;
|
||||||
/* time stamp updated when the PHY/RF is turned on */
|
/* time stamp updated when the PHY/RF is turned on */
|
||||||
static int64_t s_phy_rf_en_ts = 0;
|
static int64_t s_phy_rf_en_ts = 0;
|
||||||
|
|
||||||
|
static DRAM_ATTR portMUX_TYPE s_phy_int_mux = portMUX_INITIALIZER_UNLOCKED;
|
||||||
|
|
||||||
uint32_t IRAM_ATTR phy_enter_critical(void)
|
uint32_t IRAM_ATTR phy_enter_critical(void)
|
||||||
{
|
{
|
||||||
return portENTER_CRITICAL_NESTED();
|
if (xPortInIsrContext()) {
|
||||||
|
portENTER_CRITICAL_ISR(&s_phy_int_mux);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
portENTER_CRITICAL(&s_phy_int_mux);
|
||||||
|
}
|
||||||
|
// Interrupt level will be stored in current tcb, so always return zero.
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IRAM_ATTR phy_exit_critical(uint32_t level)
|
void IRAM_ATTR phy_exit_critical(uint32_t level)
|
||||||
{
|
{
|
||||||
portEXIT_CRITICAL_NESTED(level);
|
// Param level don't need any more, ignore it.
|
||||||
|
if (xPortInIsrContext()) {
|
||||||
|
portEXIT_CRITICAL_ISR(&s_phy_int_mux);
|
||||||
|
} else {
|
||||||
|
portEXIT_CRITICAL(&s_phy_int_mux);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t esp_phy_rf_get_on_ts(void)
|
int64_t esp_phy_rf_get_on_ts(void)
|
||||||
|
|
Loading…
Reference in a new issue