ke\ u timer\ u set不执行,为什么?

8个职位/0个新职位
最后一篇文章
元航务
离线
最后一次见到:4年9个月前
专家
已加入:2015-03-25 08:19
ke\ u timer\ u set不执行,为什么?

我有个问题,每次都不是成功执行的时候。

具体内容:
在sdk3.0.6中,我使用了一个按钮P23来打开系统。

void应用程序\按钮\启用(void)
{
wkupct注册回调(app按钮按下cb);

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

应用内按钮按下cb(无效)
我补充说:

havekey\u flag=1;

如果(keytimescn>=1)
{
keytimescn=0;
清除计时器(扫描键计时器,任务应用程序);
}

keytimescn++;

如果(PW开\U关!=0)//关机到开机
{
//ke_timer_init();

GPIO_SetInactive(GPIO_TI_LED_PORT,GPIO_TI_LED_PIN);//fot tip在此处输入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);//fot tip在此处输入LED亮起
button_type = buttontype_400ms;
KEU定时器设置(扫描键定时器,任务应用程序,40);
// app_force_active_mode();
}

在这里我有没有添加msg
枚举应用程序消息
{
APP\u MODULE\u INIT\u CMP\u EVT=KE\u FIRST\u MSG(任务应用程序),

sotf_pw_timer,
............
............
}

/*默认状态处理程序定义。*/
extern const struct ke_msg_handler app_default_state [] =
{
{SOTF\u PW\u TIMER,(ke\u msg\u func\t)poweron\u soft\u handler},
{GAPM\u DEVICE\u READY\u IND,(ke\u msg\u func\t)GAPM\u DEVICE\u READY\u IND\u handler},
.............
...........
}

在处理函数中:

int poweron\u soft\u handler(ke\u msg\u id\u t const msgid,
void const*参数,
任务id常量目标id,
Keu任务\u id \u t const src \u id)
{
GPIO_SetInactive(GPIO_ALERT_LED_PORT,GPIO_ALERT_LED_PIN);//在此处输入提示。led亮起

{//soft poweron是第一个prio
PW\u ON\u OFF=0;
been\u tip\u flag=0;

app_adv_start();

LED_BEEN_LOOP = TIP_LOOP_LEDON;
keu timer\u set(LEN\u BEEN\u TIP\u timer,TASK\u APP,1);
}

清除计时器(SOTF\u PW\u timer,TASK\u APP);

返回(已消耗的消息);
}

我按P23键高一次,最后6秒{比这里设置的时间长(keu timer\u set(SOTF\u PW\u timer,TASK\u APP,200)2s};
已输入步骤:
GPIO_SetInactive(GPIO_TI_LED_PORT,GPIO_TI_LED_PIN);//fot tip在此处输入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\u软\u处理程序

不打电话成功。

为什么?

额外的:
我有这个看法
http://support.dialog.com/faq/how use ketimer during wakeu。。。

但是在3.0.6中没有这个消息

struct create\u new\u timer\u struct*req=KE\u MSG\u ALLOC(APP\u create\u new\u timer,TASK\u APP,TASK\u APP,

create_new_timer_struct);

创建新的计时器结构

app_create_new_timer.
不包括在我使用的SDK(3.0.6)中。

关键词:
设备:
夏季20100514
离线
最后一次见到:4年2个月前
格鲁鲁
已加入:2014-12-30 05:01
你可以遵守这些

您可以执行以下步骤:

  1. 在APP\u api.h中添加APP\u CREATE\u NEW\u计时器
  2. 在APP\u task\u handlers.h中添加{APP\u CREATE\u NEW\u TIMER,(ke\u msg\u func\t)APP\u CREATE\u NEW\u TIMER}
  3. 添加struct create_new_timer_struct.
    {
    uint16\t延迟;
    uint16任务id;
    uint16_t timer_id;
    };
    附录h中

希望有帮助。

元航务
离线
最后一次见到:4年9个月前
专家
已加入:2015-03-25 08:19
或者有时输入ke_timer

或有时进入克尤定时器任务功能是延时15秒以上;
或者keu timer任务函数根本就不是动作。

请给我你的帮助。
非常感谢。

MT\u对话框
离线
最后一次见到:1周1天前
工作人员
已加入:2015-06-08 11:34
你好,袁杭武

你好,袁杭武

您的设备无法正常工作的最可能原因是您尝试在设备尚未唤醒时设置Ke_Timer。当您通过唤醒定时器唤醒您的设备时,无人保证BLE核心是清醒的,软件定时器是BLE核心的一部分。即使你迫使你的ble醒来,它是不确定的,如果定时器将被正确设置,因为核心需要一些时间醒来。作为在您可以尝试的过程中,如果使用app_check_ble_active()函数,则首先检查首先,然后按照描述设置计时器http://support.dialog.com/faq/how use ketimer during wakeu。。。在这里。您可以添加summer20100514所描述的结构和消息。这样,您将向应用程序发送一条关于创建计时器的消息,并且您确信当您调用keu timer\u set时,BLE将被唤醒。

谢谢你的对话

元航务
离线
最后一次见到:4年9个月前
专家
已加入:2015-03-25 08:19
谢谢你的对话,

谢谢你的对话,
谢谢summer20100514。

在每个ke\u timer\u set()函数之前,我添加

如果(app\u ble\u force\u wakeup())
app_ble_ext_wakeup_off();

目前没有发现问题。
那么这样一来,隐藏了什么风险呢?

MT\u对话框
离线
最后一次见到:1周1天前
工作人员
已加入:2015-06-08 11:34
你好,袁杭武,

你好,袁杭武,

我们不能确定这将导致的副作用,解决问题的方法就是上面描述的方法。可能发生的情况是,即使执行app\u ble\u force\u wakeup(),ble开始唤醒,也需要时间直到ble唤醒,这可能会导致与以前相同的问题。解决方法的原因是确保在调用ke\u timer\u set()时BLE肯定是唤醒的,这就是为什么首先向内核发送消息来设置ke\u计时器的原因。

谢谢你的对话

元航务
离线
最后一次见到:4年9个月前
专家
已加入:2015-03-25 08:19
谢谢你的对话

谢谢你的对话,summer20100514。

我使用了keu timer\u set()作为您之前的建议;
按键时,我每隔100毫秒读取GPIO引脚。
如果同时按下,则按keytimescn++;
所以我在ke\u timer\u func中调用了ke\u timer\u set();回调了好几次。

但测试结果如下:
有时,也没有每次运行非常准确;有时,ke_timer_set()未运行;

所以我用systick来解决。
但它不是在睡眠中工作的,所以,当是压力,我醒来,直到压力是现实。
那么这样一来,隐藏了什么风险呢?

MT\u对话框
离线
最后一次见到:1周1天前
工作人员
已加入:2015-06-08 11:34
你好,袁杭武,

你好,袁杭武,

如果我的理解是正确的,您在唤醒处理程序中按住da直到您的按钮被释放,在唤醒处理程序中您正在设置systick并开始计数。我唯一能想到的是,你应该确保你的时钟是正确的设置,以便系统是正确的饲料。如果不是的话,你的时间就不准确了。

谢谢你的对话