在我的代码中,我正在实现一个状态机,一旦调度程序被触发,da14580从传感器获取数据,处理它,并进入睡眠(等待下一个传感器中断)
传感器给中断每20ms,我的问题是,这段代码是随机崩溃,我想问是否有可能进入睡眠模式之间的两个连续样本(如果他们是20ms间隔)。
我使用PAN1740(在调试环境中)
空白WKUP_QUADEC_Handler(空白)
{
SetWord16 (SET_FREEZE_REG FRZ_WDOG);
NVIC_DisableIRQ (WKUP_QUADEC_IRQn);
SetBits16 (CLK_AMBA_REG PCLK_DIV 0);
SetBits16 (CLK_AMBA_REG HCLK_DIV 0);
if(GetBits16(CLK_PER_REG, WAKEUPCT_ENABLE) != 0)
{
SetWord16 (WKUP_RESET_IRQ_REG, 1);
SetBits16 (WKUP_CTRL_REG WKUP_ENABLE_IRQ 0);
}
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
如果(app_ble_ext_wakeup_get ())
{
app_disable_sleep ();
SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);
if(CurrentState == SLEEP)
{
app_ble_ext_wakeup_off ();
app_adv_start ();
}
}
if(CurrentState == SLEEP && (CurrentState == COMPUTING || PastState == initializing)) / /当前状态
{
set_state(验证、睡眠);
}
else if(CurrentState == IDLE && PastState == VALIDATION) {CurrentState == IDLE}
{
set_state(验证、闲置);
}
else if(CurrentState == IDLE && PastState == COMPUTING)
{
set_state(计算、闲置);
}
GLOBAL_INT_STOP ();
flip_main_scheduler ();//与传感器通信,数据处理
GLOBAL_INT_START ()
返回;
}
嗨mohit3112,
是的,你可以在两个中断事件之间进入睡眠模式,如果ble核心没有任何事情要做(连接间隔等),系统将进入睡眠。
由于MT_dialog
这意味着如果我的中断是20ms,连接间隔是10ms,那么当我的中断触发时,内核可能已经唤醒了(如果ble中断首先触发)。如果发生冲突,将执行哪个中断,我能优先考虑我的中断而不是ble吗?或者这会触发系统中的任何断开或崩溃(硬崩溃)。
实际上,我的代码只有在开发调试时才会崩溃!!,当我不是在开发模式,ie #define DEVELOPMENT_DEBUG 0代码似乎运行良好,但这不会破坏otp,因为我可能正在加载代码在它不是在系统ram ?
嗨mohit3112,
是的,这肯定会发生,并且BLE事件相对于外部事件具有更高的优先级,如果发生这种情况,您的系统不应该崩溃,而只是延迟来自传感器的中断。此外,您不能将外部中断放在更高的优先级,如果内核不提供BLE中断,系统将失败并失去连接。关于OTP,你不能通过将DEVELOPMENT_DEBUG设置为0来烧毁OTP,这只是GPIO预留等的标志。固件下载到sysram。
由于MT_dialog