app_easy_timer错误

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
11个帖子/ 0新
最后一篇
Chris0409.
离线
最后一次露面:3年10个月前
加入:2017-01-11 05:59
app_easy_timer错误

嗨,每年,
我使用了App_easy定时器进行LED闪烁功能。但是,在将代码闪烁到SPI Flash后,设备重新启动持续。我调试代码,并查看Porram进入闪烁函数和调用的app_easy_timer函数。
该程序永远不会前进到代码(req-> delay = delay; req-> timer_id = timer_id; ke_msg_send(req);)
突出代码后(struct create_new_timer_struct * req = ke_msg_alloc(app_create_new_timer,task_app,task_app,create_new_timer_struct);

这是否意味着内存Alloc错误,并且通过这个原因reboot是reboot?我以前从未遇到过这种现象

设备:
wi_dialog.
离线
最后一次露面:1天17小时前
职员
加入:2014-01-03 16:21
你好,

你好,
您是否尝试使用SDK5中的App_easy_Timer功能运行“Prox_Reporter”参考软件?您所描述的观察不能得出结论问题是由于“app_easy_timer”功能。需要更多信息,例如如何运行测试,在软件上,....
问候,

Chris0409.
离线
最后一次露面:3年10个月前
加入:2017-01-11 05:59
嗨,wl_dialog,

嗨,wl_dialog,
我知道app_easy_timer是问题,因为在我添加LED眨眼代码之前,我还有一个使用应用程序易于计时器的进程的DSPS主机项目,它可以正常工作。
我想知道的是,我只是用一个应用程序易于计时器来切换LED引脚,为什么我在代码处块
struct create_new_timer_struct * req = ke_msg_alloc(app_create_new_timer,task_app,task_app,create_new_timer_struct);
遵循是LED.c的源代码

#include“LED.H”
#include“app_easy_timer.h”

/ * LED控制结构* /
typedef struct {
uint8_t todo;/ *闪烁循环留下* /
uint8_t%;/ *循环百分比* /
uint16_t期间;/ *开/关循环时间(msec)* /
UINT32_T接下来;/ *下次更改的时间* /
LEDCONTROL_T;

/ ***************************************************************************************************
*全局变量
*************************************************************************************************** /

静态LEDCONTROL_T LEDCTRL __ATtribute __((部分(“保留_mem_area0”),ZERO_INIT));

/ ***************************************************************************************************
*本地功能
*************************************************************************************************** /
静电voidedupdate(空白);

/ ***************************************************************************************************
*函数 - API
*************************************************************************************************** /

/ ***************************************************************************************************
* @fn ledinit.
*
* @brief初始化LED服务
*
* @param init - 指向包含初始化值的void
*
* @return none
*************************************************************************************************** /
void LedInit(空白)
{
LED_INIT();
}

/ ***************************************************************************************************
* @fn ledblink.
*
* @brief闪烁LED
*
* @param LED - 要闪烁的LED的位屏蔽值
* numblinks - 闪烁的数量
*百分比 - LED的每个时期的百分比
*将在
*周期 - 每个周期的长度为毫秒
*
* @return none
*************************************************************************************************** /
void legblink(UInt8_t numblinks,uint8_t%,uint16_t句号)
{
LEDCTRL.TODO = 2 * NUMBLINKS-1;
LEDCTRL.percent =百分比;
LEDCTRL.PERIOD =期间;
LED_OFF();
if(百分比&&期)
{
if(百分比<100)
{
app_easy_timer(1,Ledupdate);
}
别的
{
带领();
}
}
别的
{
//关
LED_OFF();
}
}

/ ***************************************************************************************************
* @fn ledupdate.
*
* @brief更新LED使用眨眼
*
* @param none
*
* @return none
*************************************************************************************************** /
静止voidedupdate(空白)
{
LED_Toggle();
Ledctrl.todo--;
if(ledctrl.todo / * || LED_STATE()* /)
{
if(led_state())
{
LEDCTRL.NEXT = LEDCTRL.PERIOD *(100-LEDCTRL.percent);
}
别的
{
LEDCTRL.NEXT = LEDCTRL.PERIOD * LEDCTRL.PERCENT;
}
app_easy_timer(LEDCTRL.NEXT/10 lexpdate);
}
}
你能帮我检查代码的一些错误,我真的找不到原因。
其他更多,我刚刚使用LEDINIT来启动LED端口和LEDBLINK(20,35,1000)来在System_init()中进行测试。

Chris0409.
离线
最后一次露面:3年10个月前
加入:2017-01-11 05:59
更多,我发现了

一点稍微,我发现我在system_init中调用ledblink(),我将在闪存到闪存后连续重启。但是,如果我在system_init()之后在main_func()中调用LeDblink(),那么这种现象不会发生,但我从来没有能够调用Ledupdate()。此外,当按下按钮时,我也开始了一个计时器,我可以在计时器过期时收到调用此计时器的回调。这真的很困惑我,任何建议都会受到欣赏!

wi_dialog.
离线
最后一次露面:1天17小时前
职员
加入:2014-01-03 16:21
你好,

你好,
您的问题与您将“LEDBLINK(20,35,1000)”声明的妥善相关。它是因为app_easy_timer和malloc()需要内核计时器和堆服务。只有在内核初始化并激活后,才能调用您的函数。建议在System_Init()之后放入您的语句,并使您的LEDBLink函数闪烁永远以缓解您的调试。

int main_func(void)
{
sleep_mode_t sleep_mode;

//全球初始化
system_init();

LEDBLINK(20,35,1000);

/ *
************************************************************************************
*平台初始化
************************************************************************************
* /
而(1)
{
.....
}
}

问候,

Chris0409.
离线
最后一次露面:3年10个月前
加入:2017-01-11 05:59
我已经完成了你

我在建议时已经完成了,但我仍然无法让LED眨眼。现在我在设备连接事件上调用LeDBlink,LED闪烁右侧。所以它是因为睡眠是睡眠,这样我们无法启动计时器?

wi_dialog.
离线
最后一次露面:1天17小时前
职员
加入:2014-01-03 16:21
你好,

你好,

在进入睡眠模式之前,它被认为没有更多的活动,包括LED闪烁。无论在扩展或深度睡眠模式下,所有I / O块都将关闭,包括定时器服务。因此,禁用LED闪烁定时器服务。

为了缓解新驱动程序或功能的调试,简单的方法是将一个语句添加如下以禁用进入睡眠模式但空闲模式,以给出对软件行为的最小影响。

//获取允许的睡眠模式
//从rwip_power_down()到wfi()的时间必须尽可能短!!
sleep_mode = rwip_power_down();
/ *语句添加* / sleep_mode = mode_idle;

然后你应该连续看到你的LED眨眼。

问候,

wi_dialog.
离线
最后一次露面:1天17小时前
职员
加入:2014-01-03 16:21
你好,

你好,

修复了错误,如下所示:
//获取允许的睡眠模式
//从rwip_power_down()到wfi()的时间必须尽可能短!!
sleep_mode = rwip_power_down();
/ *声明添加* /
if((sleep_mode == mode_ext_sleep)||(sleep_mode == mode_deep_sleep)))
{
sleep_mode = mode_idle;
}

问候,

Chris0409.
离线
最后一次露面:3年10个月前
加入:2017-01-11 05:59
困惑我是:

困惑我是:
我在system_init()之后调用LeDblink(),当时kernal已上升时。在LeDBlink()中,我已经设置了一个将唤醒ble的计时器,因此为什么我的计时器回调仍然无法触发?如果我第一次在LeDBlink()中创建计时器时,如果这是真的,如果这是真的?我想我可以在第一次创建计时器之前强制唤醒。我已经尝试了api arch_ble_force_wakeup(),arch_ble_ext_wakeup_on()等。但仍然不能闪烁。这些API可以真正强制设备唤醒?

wi_dialog.
离线
最后一次露面:1天17小时前
职员
加入:2014-01-03 16:21
你好,

你好,
可以通过简单地迫使leep_mode进入mode_ext_sleep或mode_deep_sleep来完成验证您的LEDBLink()函数及其行为的技术。要集成LED闪烁功能,并让它在您预期的行为中表现,您需要了解软件的结构。
在实际应用中,有两个(2)个线程独立运行,BLE堆栈和用户应用程序运行。内核仅提供服务和用户应用程序需要管理和监督所有资源使用情况并监视所有活动以确定设备可以进入睡眠模式。

int main_func(void)
{
sleep_mode_t sleep_mode;

//全球初始化
system_init();

/ *
************************************************************************************
*平台初始化
************************************************************************************
* /
而(1)
{
做 {
//安排所有待处理的事件
schedule_hile_ble_on();
}
while(app_asynch_proc()!= goto_sleep);//授予控件到应用程序,尝试掉电
//如果应用程序返回goto_sleep
.....
}
}

App_Asynch_Proc()函数是用户应用程序的检查,无论是否发生任何活动,都会阻止设备进入睡眠模式,而BLE堆栈线程已准备好进入睡眠状态。

typedef枚举{
goto_sleep = 0,
keep_powered.
} arch_main_loop_callback_ret_t;

在您的情况下,只要LED闪烁不允许设备睡眠即可,就可以返回“KEEP_POWERED”。

静态内联void schedule_whle_ble_on(void)
{
// BLE时钟已启用
while(ble_is_powered())
{
//设置了BLE事件结束。条件RF校准可以运行。
UINT8_T BLE_EVT_END_SET = KE_EVENT_GET(KE_EVENT_BLE_EVT_END);

//执行消息和事件
Rwip_schedule();

if(ble_evt_end_set)
{
uint32_t sleep_duration = 0;
rcx20_read_freq();

//如果您有足够的时间运行收音机的温度校准
if(lld_sleep_check(&sleep_duration,4))// 6插槽 - > 3.750 ms
//检查时间和温度以运行无线电校准。
条件_run_radio_cals();
}

//授予对申请的控制,尝试睡觉
//如果应用程序返回goto_sleep
if(app_asynch_trm()!= goto_sleep)
{
继续;// rwip_schedule()再次调用
}
别的
{
ARCH_PRINTF_PROCESS();
休息;
}
}
}

app_asynch_trm()函数在运行ble堆栈时处理用户应用程序。RWIP_Schedule()将处理队列中的所有消息,直到完成,并且控件将传递给App_Asynch_trm()函数,并基于返回的值“Keep_Powered”或“Goto_Sleep”来决定保持活动或相应地睡眠。

请注意,没有功能可以跟踪任何软件计时器运行。软计时器的所有者的责任是跟踪其活动。

要在SDK5中开发您的应用程序,建议研究以下结构,并了解它是如何运行的,因为它是SDK5结构的关键。

struct arch_main_loop_callbacks {
void(* app_on_init)(空白);
ARCH_MAIN_LOOP_CALLBACK_RET_T(* APP_ON_BLE_POWERED)(void);
ARCH_MAIN_LOOP_CALLBACK_RET_T(* APP_ON_SYSTEM_POWERED)(VOID);
void(* app_before_sleep)(void);
sleep_mode_t(* app_validate_sleep)(sleep_mode_t sleep_mode);
void(* app_gen_to_sleep)(sleep_mode_t sleep_mode);
void(* app_resume_from_sleep)(void);
};

static const struct arch_main_loop_callbacks user_app_main_loop_callbacks = {
.app_on_init = default_app_on_init,

//默认情况下,系统唤醒时重新加载并恢复监视程序。
//用户必须考虑看门狗定时器处理(请保持运行,
//冻结它,重新加载,恢复IT等),当App_On_ble_Powered()正在呈现时
//调用并可能可能影响主循环。
.app_on_ble_powered = null,

//默认情况下,系统唤醒时重新加载并恢复监视程序。
//用户必须考虑看门狗定时器处理(请保持运行,
//冻结它,重新加载,恢复IT等),当app_on_system_powered()是
//调用并可能可能影响主循环。
.app_on_system_powered = null,

.app_before_sleep = null,
.app_validate_sleep = null,
.app_ging_to_sleep = null,
.app_resume_from_sleep = null,
};

问候,

Chris0409.
离线
最后一次露面:3年10个月前
加入:2017-01-11 05:59
非常感谢,

非常感谢,有用的建议