嗨,对话框:
你看,在操作系统准备好之前,我不能使用app_timer_set()和发送消息函数(例如:ke_msg_send_basic())。
但我怎么知道Os已经准备好了呢?
谢谢李阳。
嗨,李阳,
我不确定我是否理解,你不能通过kernel_timer发送一个基本的消息,因为操作系统还没有准备好?操作系统总是准备好了,因为祝福是。如果你在BLE开启时设置计时器,那么你从计时器发送的消息将会被服务。也许您设置定时器时,BLE不开和定时器从来没有发生?
你能看看这个FAQ吗,也许它会对你有帮助http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。
由于MT_dialog
嗨,MT_dialog,
你是对的,操作系统总是准备好了,因为祝福是。然后我就可以用计时器了像往常一样,当DA重启时,在ble开启之前,如果我使用定时器或发送消息,定时器将永远不会发生,它没有影响。但我的情况很特殊。当DA重新启动时,在ble打开之前,GPIO2外部中断到来,在GPIO2_Handler()中,我发送一条消息,然后程序中断。方案如下:
空白GPIO2_Handler(空白){NVIC_DisableIRQ (GPIO2_IRQn);/*①关闭中断*/
/**外围域关闭,这是唤醒过程。需要调用peripher_init()。*/Gbext2IrqIsComeFlg = true;/ *防重入开始ly150925 * /如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))periph_init ();Gbext2IrqIsComeFlg = false;/ *防重入结束ly150925 * /
GLOBAL_INT_STOP ();/**将FIFO中数据先取出*/adxl362FifoRead(adxl362DataBuf, FIFO_NUM_SET * 6);/*②清除362 IRQ引脚*/GLOBAL_INT_START ();
#如果(CFG_LED_CTL)if (LED_UNACTIVE == __tGledCtlHandler.eLedActive) {setSleepOn ();}# endif / / CFG_LED_CTL
/ /唤醒祝福SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);// BLE醒来了app_ble_ext_wakeup_off ();
ke_msg_send_basic (ADXL362_WAKEUP_MSG TASK_APP TASK_APP);
SetWord16(GPIO_RESET_IRQ_REG, 1 << (GPIO2_IRQn-GPIO0_IRQn));/*③清除MCU IRQ引脚*/
NVIC_EnableIRQ (GPIO2_IRQn);/*打开中断*/}
程序会崩溃。这是真的吗?
在你的中断处理程序中,你唤醒ble核心,然后你发送消息。正常情况下,消息应该在队列中,一旦准备好,操作系统将立即提供它。如果您遇到任何问题,可能是由于您调用的中断例程和INT_START/STOP。如果在ISR中设置一个标志,并在app_async_trm函数中处理中断事件,可能会更好。
好的,谢谢你的帮助。
嗨,李阳,
我不确定我是否理解,你不能通过kernel_timer发送一个基本的消息,因为操作系统还没有准备好?操作系统总是准备好了,因为祝福是。如果你在BLE开启时设置计时器,那么你从计时器发送的消息将会被服务。也许您设置定时器时,BLE不开和定时器从来没有发生?
你能看看这个FAQ吗,也许它会对你有帮助http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。
由于MT_dialog
嗨,MT_dialog,
你是对的,操作系统总是准备好了,因为祝福是。然后我就可以用计时器了
像往常一样,当DA重启时,在ble开启之前,如果我使用定时器或发送消息,定时器将永远不会发生,它没有影响。
但我的情况很特殊。当DA重新启动时,在ble打开之前,GPIO2外部中断到来,在GPIO2_Handler()中,我发送一条消息,然后程序中断。
方案如下:
空白GPIO2_Handler(空白)
{
NVIC_DisableIRQ (GPIO2_IRQn);/*①关闭中断*/
/*
*外围域关闭,这是唤醒过程。需要调用peripher_init()。
*/
Gbext2IrqIsComeFlg = true;/ *防重入开始ly150925 * /
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
Gbext2IrqIsComeFlg = false;/ *防重入结束ly150925 * /
GLOBAL_INT_STOP ();
/*
*将FIFO中数据先取出
*/
adxl362FifoRead(adxl362DataBuf, FIFO_NUM_SET * 6);/*②清除362 IRQ引脚*/
GLOBAL_INT_START ();
#如果(CFG_LED_CTL)
if (LED_UNACTIVE == __tGledCtlHandler.eLedActive) {
setSleepOn ();
}
# endif / / CFG_LED_CTL
/ /唤醒祝福
SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);// BLE醒来了
app_ble_ext_wakeup_off ();
ke_msg_send_basic (ADXL362_WAKEUP_MSG TASK_APP TASK_APP);
SetWord16(GPIO_RESET_IRQ_REG, 1 << (GPIO2_IRQn-GPIO0_IRQn));/*③清除MCU IRQ引脚*/
NVIC_EnableIRQ (GPIO2_IRQn);/*打开中断*/
}
程序会崩溃。这是真的吗?
谢谢李阳。
嗨,李阳,
在你的中断处理程序中,你唤醒ble核心,然后你发送消息。正常情况下,消息应该在队列中,一旦准备好,操作系统将立即提供它。如果您遇到任何问题,可能是由于您调用的中断例程和INT_START/STOP。如果在ISR中设置一个标志,并在app_async_trm函数中处理中断事件,可能会更好。
由于MT_dialog
嗨,MT_dialog,
好的,谢谢你的帮助。
谢谢李阳。