在我的代码中,我实现了一个状态机,一旦调度程序被触发,da14580就会从传感器获取数据,处理它,然后进入睡眠状态(等待下一个传感器中断的到来)
传感器每20毫秒就中断一次,我的问题是这个代码是随机崩溃的,我想问两个连续的样本之间是否有可能进入睡眠模式(如果它们相隔20毫秒)。
我正在使用PAN1740(在调试环境中)
void WKUP\u QUADEC\u处理程序(void)
{
SetWord16(SET\u FREEZE\u REG,FRZ\u WDOG);
NVIC禁用IRQ(WKUP\U QUADEC\U IRQn);
设置16(CLK\ U AMBA\ U REG,PCLK\ U DIV,0);
设置16(CLK\ U AMBA\ U REG,HCLK\ U DIV,0);
if((GetBits16(CLK\ U PER\ U REG,WAKEUPCT\ U ENABLE)!= 0))
{
设置字16(WKUP\U RESET\U IRQ\U REG,1);
SetBits16(WKUP\u CTRL\u REG,WKUP\u ENABLE\u IRQ,0);
}
if(GetBits16(SYS\u STAT\u REG,PER\u IS \u DOWN))
periph_init();
如果(app\u ble\u ext\u wakeup\u get())
{
app_disable_sleep();
SetBits32(GP\ U CONTROL\ U REG,BLE\ U WAKEUP\ U REQ,1);
如果(当前状态==睡眠)
{
app_ble_ext_wakeup_off();
app_adv_start();
}
}
if(CurrentState==SLEEP&&(PastState==COMPUTING | | PastState==INITILISATION))
{
设置\u状态(验证、睡眠);
}
else if(CurrentState==IDLE&&PastState==VALIDATION)
{
设置\u状态(验证,空闲);
}
else if(CurrentState==IDLE&&PastState==COMPUTING)
{
设置\u状态(计算,空闲);
}
全局\u INT \u STOP();
flip_main_scheduler();//用于与传感器通信和数据处理
全局\u INT \u START()
返回;
}
你好,mohit3112,
是的,您可以在两个中断事件之间进入睡眠模式,如果ble核心没有任何事情要做(连接间隔等),系统将进入睡眠状态。
谢谢你的对话
这意味着如果我的中断是20毫秒,连接间隔是10毫秒,那么当我的中断触发时核心可能已经被唤醒(如果ble中断首先触发)。如果发生冲突,将执行哪个中断,我是否可以将中断优先于ble?或者这将触发系统中的任何断开连接或崩溃(硬故障)。
实际上,我的代码只有在开发调试开启时才会崩溃!!,当我不是在ie#define development#DEBUG 0的开发模式下运行时,代码似乎运行良好,但这不会破坏otp,因为我可能在其中加载代码,而不是在系统ram中加载代码?
你好,mohit3112,
是的,这肯定会发生,BLE事件在外部事件中具有更高的优先级,如果发生这种情况,您的系统应该不会崩溃,而只是延迟来自传感器的中断。此外,不能将外部中断置于更高的优先级,如果内核不提供BLE中断,系统将失败并失去连接。关于OTP,你不能仅仅通过将DEVELOPMENT\u DEBUG设置为0来烧录OTP,这只是GPIO保留等的标志。固件下载到sysram。
谢谢你的对话