ke_timer_set不执行,为什么?

8个职位/ 0个新职位
最后发表
YuanhangWu
离线
最后看到:5年2个月前
专家
加入:2015-03-25 08:19
ke_timer_set不执行,为什么?

我有一个问题,ke_time不是每次都成功执行。

详细:
在SDK 3.0.6中,我使用了一个按钮P23来启动系统。

空白app_button_enable(空白)
{
wkupct_register_callback (app_button_press_cb);

/ /如果!(GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN))) //按钮是p23
Wkupct_enable_irq (0x80000, 0, 1, 10);// P2_3,极性低,1 0x40000

在app_button_press_cb(空白)
我添加这个:

havekey_flag = 1;

如果(keytimescn > = 1)
{
keytimescn = 0;
ke_timer_clear (SCAN_KEY_TIMER TASK_APP);

keytimescn + +;

if(PW_ON_OFF!=0) //关闭电源
{
/ / ke_timer_init ();

GPIO_SetInactive (GPIO_TI_LED_PORT GPIO_TI_LED_PIN);//进入这里,led是亮的

ke_timer_set (SOTF_PW_TIMER TASK_APP 200);//只在这里调用SOTF_PW_TIMER的函数
/ / app_force_active_mode ();

其他的
{//搜索400MS_key
GPIO_SetInactive (GPIO_ALERT_LED_PORT, GPIO_ALERT_LED_PIN);//进入这里,led是亮的
button_type = BUTTONTYPE_400MS;
ke_timer_set (SCAN_KEY_TIMER TASK_APP 40);
/ / app_force_active_mode ();

这里我加了味精
enum APP_MSG
{
APP_MODULE_INIT_CMP_EVT = KE_FIRST_MSG (TASK_APP),

SOTF_PW_TIMER,
............
............

/*默认状态处理器定义。*/
EXTERN const struct ke_msg_handler app_default_state[] =
{
(ke_msg_func_t) poweron_soft_handler}, {SOTF_PW_TIMER
(ke_msg_func_t) gapm_device_ready_ind_handler}, {GAPM_DEVICE_READY_IND
.............
...........

在处理函数:

Int poweron_soft_handler(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
GPIO_SetInactive (GPIO_ALERT_LED_PORT GPIO_ALERT_LED_PIN);//在这里输入。led亮着

{//soft poweron是第一优先级
PW_ON_OFF = 0;
been_tip_flag = 0;

app_adv_start ();

led_been_loop = TIP_LOOP_LEDON;
ke_timer_set (LEN_BEEN_TIP_TIMER TASK_APP 1);

ke_timer_clear (SOTF_PW_TIMER TASK_APP);

返回(KE_MSG_CONSUMED);

I press key P23 to high one time last 6s {greater than in set here (ke_timer_set(SOTF_PW_TIMER,TASK_APP,200) 2s};
已进入步骤:
GPIO_SetInactive (GPIO_TI_LED_PORT GPIO_TI_LED_PIN);//进入这里,led是亮的

但有时这一步并不在:
GPIO_SetInactive (GPIO_ALERT_LED_PORT GPIO_ALERT_LED_PIN);//在这里输入。led亮着

所以系统不是每次都是开机的。

我的问题是:
ke_timer_set (SOTF_PW_TIMER TASK_APP 200);//只在这里调用SOTF_PW_TIMER的函数

但有时这个函数
poweron_soft_handler

不是叫成功。

为什么?

附加:
我看到了这个
http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。

但在3.0.6没有这个味精

struct create_new_timer_struct *req = KE_MSG_ALLOC(APP_CREATE_NEW_TIMER, TASK_APP, TASK_APP,

create_new_timer_struct);

create_new_timer_struct

APP_CREATE_NEW_TIMER
不包括在我使用的SDK(3.0.6)。

关键词:
设备:
summer20100514
离线
最后看到:4年8个月前
大师
加入:2014-12-30 05:01
你可以照着这些做

你可以遵循以下步骤:

  1. 在app_api.h中添加APP_CREATE_NEW_TIMER
  2. 在app_task_handlers.h中添加{APP_CREATE_NEW_TIMER, (ke_msg_func_t) APP_CREATE_NEW_TIMER}
  3. 添加struct create_new_timer_struct
    {
    uint16_t延迟;
    uint16_t task_id;
    uint16_t timer_id;
    };
    在app.h

希望它可以帮助。

YuanhangWu
离线
最后看到:5年2个月前
专家
加入:2015-03-25 08:19
或者有时输入KE_timer

或有时输入KE_timer任务函数是延时大于15秒;
或者KE_timer任务函数根本不是动作。

请帮帮我。
非常感谢。

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨YuanhangWu

嗨YuanhangWu

你的设备不工作的最可能的原因是,你正试图设置一个ke_timer,而设备还没有被唤醒。当你通过唤醒计时器唤醒你的设备时,没有人保证BLE核心是清醒的,软件计时器是BLE核心的一部分。即使你强制你的BLE唤醒它也不确定定时器是否设置正确,因为它需要一些时间来唤醒核心。作为一个工作,你可以尝试的是首先通过使用app_check_BLE_active()函数来检查BLE是否处于活动状态,然后按照描述设置计时器http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。在这里。您可以添加结构和消息,因为它是由summer20100514描述的。通过这种方式,您将向应用程序发送一条关于创建计时器的消息,并且您肯定地知道,当您调用ke_timer_set时,BLE将被唤醒。

由于MT_dialog

YuanhangWu
离线
最后看到:5年2个月前
专家
加入:2015-03-25 08:19
谢谢MT_dialog,

谢谢MT_dialog,
谢谢summer20100514。

在每个ke_timer_set()函数之前,我都要添加这个

如果(app_ble_force_wakeup ())
app_ble_ext_wakeup_off ();

目前没有发现问题。
这样处理的话,隐藏了什么风险?

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨YuanhangWu,

嗨YuanhangWu,

我们不能确定这将导致的副作用,解决问题的方法是上面描述的。可能发生的情况是,即使执行了app_ble_force_wakeup(),并且BLE启动了唤醒,它也需要一些时间,直到BLE唤醒,这可能会导致与之前相同的问题。这个解决方案的目的是确保当ke_timer_set()被调用时BLE是清醒的,这就是为什么首先要向内核发送一条消息来设置ke_timer。

由于MT_dialog

YuanhangWu
离线
最后看到:5年2个月前
专家
加入:2015-03-25 08:19
谢谢MT_dialog

谢谢MT_dialog summer20100514。

我使用ke_timer_set()作为你之前给出的建议;
当按键按下时,我间隔100ms读取GPIO管脚。
如果也按下,则keytimescn++;
所以我调用ke_timer_set()在ke_timer_func;回调了几次。

但测试结果如下:
有时,ke_timer_set()不运行;

所以我用systick来解决它。
但这不是在睡眠中工作,所以,什么时候按压,我就会醒来直到按压完成。
这样处理的话,隐藏了什么风险?

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨YuanhangWu,

嗨YuanhangWu,

如果我的理解是正确的,你将在唤醒处理程序中保持da直到你的按钮被释放,在唤醒处理程序中,你将设置systick并开始计数。我能想到的唯一一件事是,你应该确保你的时钟被正确地设置,这样系统就能正确地馈电。否则,你的时机就会不准确。

由于MT_dialog