嗨,对话框:
你看,我不能在操作系统准备好之前使用app_timer_set()和发送消息函数(例如:ke_msg_send_basic())。
但我怎么知道Os已经准备好了呢?
谢谢李阳。
嗨,李阳,
我不确定我理解,你不能通过kernel_timer发送一个基本的消息,因为操作系统还没有准备好?因为ble是打开的,所以操作系统总是准备就绪。如果你在BLE开启时设置你的计时器,那么你从计时器发送的消息将被服务。也许你在BLE不开启且计时器从不发生的时候设置了计时器?
你能不能看看这个常见问题解答,也许它会帮助你http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。
由于MT_dialog
嗨,MT_dialog,
你是对的,操作系统总是准备好,因为ble是打开的。然后我就可以用计时器了像往常一样,当DA重启时,在ble打开之前,如果我使用定时器或发送消息,定时器将永远不会发生,它没有效果。但是我的情况很特殊。当DA重新启动时,在ble打开之前,GPIO2外部中断出现,在GPIO2_Handler()中我发送一条消息,然后程序中断。方案如下:
空白GPIO2_Handler(空白){NVIC_DisableIRQ (GPIO2_IRQn);/ /关闭中断
/**外周域si下降,则这是唤醒程序。需要调用外围的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开启时设置你的计时器,那么你从计时器发送的消息将被服务。也许你在BLE不开启且计时器从不发生的时候设置了计时器?
你能不能看看这个常见问题解答,也许它会帮助你http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。
由于MT_dialog
嗨,MT_dialog,
你是对的,操作系统总是准备好,因为ble是打开的。然后我就可以用计时器了
像往常一样,当DA重启时,在ble打开之前,如果我使用定时器或发送消息,定时器将永远不会发生,它没有效果。
但是我的情况很特殊。当DA重新启动时,在ble打开之前,GPIO2外部中断出现,在GPIO2_Handler()中我发送一条消息,然后程序中断。
方案如下:
空白GPIO2_Handler(空白)
{
NVIC_DisableIRQ (GPIO2_IRQn);/ /关闭中断
/*
*外周域si下降,则这是唤醒程序。需要调用外围的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,
好的,谢谢你的帮助。
谢谢李阳。