代码架构问题(随机崩溃)

5个职位/ 0个新
最后发表
mohit3112
离线
最后看到:8个月1周前
专家
加入:2014-08-04一点
代码架构问题(随机崩溃)

在我的代码中,我正在实现一个状态机,一旦调度程序被触发,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 ()

返回;

设备:
MT_dialog
离线
最后看到:1个月6天前
工作人员
加入:2015-06-08 34
嗨mohit3112,

嗨mohit3112,

是的,你可以在两个中断事件之间进入睡眠模式,如果ble核心没有任何事情要做(连接间隔等),系统将进入睡眠。

由于MT_dialog

mohit3112
离线
最后看到:8个月1周前
专家
加入:2014-08-04一点
这意味着如果我

这意味着如果我的中断是20ms,连接间隔是10ms,那么当我的中断触发时,内核可能已经唤醒了(如果ble中断首先触发)。如果发生冲突,将执行哪个中断,我能优先考虑我的中断而不是ble吗?或者这会触发系统中的任何断开或崩溃(硬崩溃)。

mohit3112
离线
最后看到:8个月1周前
专家
加入:2014-08-04一点
实际上我的代码崩溃了

实际上,我的代码只有在开发调试时才会崩溃!!,当我不是在开发模式,ie #define DEVELOPMENT_DEBUG 0代码似乎运行良好,但这不会破坏otp,因为我可能正在加载代码在它不是在系统ram ?

MT_dialog
离线
最后看到:1个月6天前
工作人员
加入:2015-06-08 34
嗨mohit3112,

嗨mohit3112,

是的,这肯定会发生,并且BLE事件相对于外部事件具有更高的优先级,如果发生这种情况,您的系统不应该崩溃,而只是延迟来自传感器的中断。此外,您不能将外部中断放在更高的优先级,如果内核不提供BLE中断,系统将失败并失去连接。关于OTP,你不能通过将DEVELOPMENT_DEBUG设置为0来烧毁OTP,这只是GPIO预留等的标志。固件下载到sysram。

由于MT_dialog