应用程序\u轻松\u计时器错误

⚠️
您好,谢谢您来到论坛。令人兴奋的消息!我们正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
11个员额/0个新员额
最后一篇文章
克里斯0409
离线
最后一次见到:3年10个月前
加入:2017-01-11 05:59
应用程序\u轻松\u计时器错误

大家好,
我使用了app_easy timer来执行Led闪烁功能。但在我将代码闪烁到spi flash后,设备会继续重新启动。我调试了代码,并查看了程序包进入闪烁功能和调用的app_easy_timer功能。
程序从不前进到代码(req->delay=delay;req->timer\u id=timer\u id;ke\u msg\u send(req);)
执行代码后(struct create_new_timer_struct*req=KE_MSG_ALLOC(APP_create_new_timer,TASK_APP,TASK_APP,create_new_timer_struct);

这是不是意味着内存分配错误,重启是由这个原因引起的?我以前从未遇到过这种现象

设备:
WI_对话框
离线
最后一次见到:1天23小时前
工作人员
加入:2014-01-03 16:21
你好

你好
您是否尝试使用SDK5中的app_easy_定时器功能运行“prox_reporter”参考软件?您所描述的观察结果无法断定问题是由于“app_easy_定时器”功能造成的。需要更多信息,如您如何运行测试、使用什么软件等。。。。
问候,

克里斯0409
离线
最后一次见到:3年10个月前
加入:2017-01-11 05:59
嗨,wl_dialog,

嗨,wl_dialog,
我知道app_easy_定时器是个问题,因为在我将led闪烁部分的代码添加到dsps主机项目之前,我还有一个使用app easy定时器的过程,它工作正常。
我想知道的是,我只是使用一个应用程序轻松定时器切换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”
#包括“app\u easy\u timer.h”

/*LED控制结构*/
类型定义结构{
uint8_t todo;/*左闪烁周期*/
uint8_t百分比;/*周期百分比*/
uint16_t期间;/*开/关周期时间(毫秒)*/
uint32\u t下一步;/*下一次改变的时间到了*/
}LED控制;

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

静态LedControl\u t ledCtrl\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

/***************************************************************************************************
*局部函数
***************************************************************************************************/
静态void更新(void);

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

/***************************************************************************************************
*@fn-LedInit
*
*@brief初始化LED服务
*
*@param init-指向包含初始化值的void的指针
*
*@returnnone
***************************************************************************************************/
void LedInit(void)
{
LED_INIT();
}

/***************************************************************************************************
*@fn-ledbink
*
*@短暂闪烁LED
*
*@param LED-要闪烁的LED的位掩码值
*numBlinks-闪烁次数
*百分比-led指示灯点亮的每个时段的百分比
*将在
*period—每个周期的长度(毫秒)
*
*@returnnone
***************************************************************************************************/
无效LED闪烁(8个链接,8个百分比,16个周期)
{
ledCtrl.todo=2*1;
ledCtrl.percent=百分比;
ledCtrl.period=期间;
LED_OFF();
如果(百分比和期间)
{
如果(百分比<100)
{
应用程序简易计时器(1,LED更新);
}
其他的
{
LED_ON();
}
}
其他的
{
//关掉
LED_OFF();
}
}

/***************************************************************************************************
*@fn-leddate
*
*@简短更新LED以使用闪烁
*
*@param-none
*
*@returnnone
***************************************************************************************************/
静态void更新(void)
{
LED_开关();
ledCtrl.todo--;
如果(ledCtrl.todo/*| | LED_STATE()*/)
{
如果(LED_状态())
{
LEDCTRL.NEXT = LEDCTRL.PERIOD *(100-LEDCTRL.percent);
}
其他的
{
ledCtrl.next=ledCtrl.period*ledCtrl.percent;
}
应用程序简易计时器(LED控制下一步/10,LED更新);
}
}
你能帮我检查一下代码是否有错误,我真的找不到原因。
另外,我只是使用LedInit初始化LED端口,并使用LedBlink(20,351000)在System_Init()中进行测试。

克里斯0409
离线
最后一次见到:3年10个月前
加入:2017-01-11 05:59
再多一点,我发现

还有一点,我发现我在system_init()中调用了LedBlink(),在我将代码闪存到闪存中之后,我会持续重新启动。但是如果我在system_init()之后在main_funct()中调用了LedBlink(),这种现象将不会发生,但我永远无法得到LEDDUpdate()调用。我还启动了一个定时器时,按下一个按钮,我可以得到这个定时器调用时,定时器过期回调。这真的让我困惑,任何建议将不胜感激

WI_对话框
离线
最后一次见到:1天23小时前
工作人员
加入:2014-01-03 16:21
你好

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

int main_func(无效)
{
睡眠模式\u t睡眠模式;

//全局初始化
system_init();

莱德布林(20,351000);

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

问候,

克里斯0409
离线
最后一次见到:3年10个月前
加入:2017-01-11 05:59
我已经和你一样做了

我已经按照你的建议做了,但我还是不能让led闪烁。现在我在设备连接事件中调用了led闪烁,led向右闪烁。那是因为ble是睡眠,所以我们不能启动计时器?

WI_对话框
离线
最后一次见到:1天23小时前
工作人员
加入:2014-01-03 16:21
你好

你好

在进入睡眠模式之前,应该没有其他活动,包括LED闪烁。无论处于延长睡眠模式还是深度睡眠模式,所有I/O块都将关闭,包括计时器服务。因此,LED闪烁计时器服务被禁用。

为了简化对新驱动程序或函数的调试,最简单的方法是添加一条语句,如下所示,以禁用进入睡眠模式但禁用空闲模式,从而对软件行为产生最小的影响。

//获取允许的睡眠模式
//从rwip\U断电()到WFI()的时间必须尽可能短!!
睡眠模式=rwip\U断电();
/*添加语句*/sleep\u mode=mode\u idle;

然后你会看到你的LED灯持续闪烁。

问候,

WI_对话框
离线
最后一次见到:1天23小时前
工作人员
加入:2014-01-03 16:21
你好

你好

修正错误如下:
//获取允许的睡眠模式
//从rwip\U断电()到WFI()的时间必须尽可能短!!
睡眠模式=rwip\U断电();
/*添加的声明*/
如果((睡眠模式==模式外部睡眠);(睡眠模式==模式深度睡眠))
{
睡眠模式=模式空闲;
}

问候,

克里斯0409
离线
最后一次见到:3年10个月前
加入:2017-01-11 05:59
困惑我是:

困惑我是:
我在system_init()之后调用了LedBlink(),在计时器内核启动时,。在LedBlink()中,我设置了一个计时器,它将唤醒BLE,那么为什么我的计时器回调仍然无法触发?如果我第一次在LedBlink()中创建计时器时BLE处于睡眠状态,如果这是真的?我想我可以在第一次创建计时器之前强制ble唤醒。我已经尝试过API arch_ble_force_wakeup()、arch_ble_ext_wakeup_on()等,但仍然不能闪烁。这些API真的可以强制设备唤醒吗?

WI_对话框
离线
最后一次见到:1天23小时前
工作人员
加入:2014-01-03 16:21
你好

你好
验证LedBlink()函数及其行为的技术可以通过简单地强制睡眠模式不进入模式ext\U sleep或模式deep\U sleep来完成。要集成LED闪烁功能并使其按预期运行,您需要了解软件的结构。
在实际应用程序中,有两(2)个线程独立运行,分别为BLE堆栈和用户应用程序。内核仅提供服务和用户应用程序所需的服务,以管理和监督所有资源使用情况,并监控所有活动,以确定设备是否可以进入睡眠模式。

int main_func(无效)
{
睡眠模式\u t睡眠模式;

//全局初始化
system_init();

/ *
************************************************************************************
*平台初始化
************************************************************************************
*/
而(1)
{
做{
//安排所有未决事件
在启动()时计划启动;
}
while(app_asynch_proc()!=GOTO_SLEEP)//授予应用程序控制权,尝试关闭电源
//如果应用程序返回GOTO_SLEEP
.....
}
}

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

类型定义枚举{
goto_sleep = 0,
保持动力
}拱门、主回路、回叫回路;

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

启用时的静态内联作废明细表(作废)
{
//可编程时钟已启用
而(ble_通电()
{
//已设置可恢复事件结束。可以运行条件射频校准。
uint8_t ble_evt_end_set=ke_event_get(ke_event_ble_evt_end);

//执行消息和事件
rwip_计划();

if(可编程evt结束集)
{
uint32睡眠时间=0;
rcx20_read_freq();

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

//将控制权授予应用程序,尝试进入睡眠状态
//如果应用程序返回GOTO_SLEEP
如果(app\u asynch\u trm()!=GOTO\u SLEEP)
{
继续;//所以再次调用rwip_schedule()
}
其他的
{
arch_printf_process();
打破
}
}
}

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

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

要在SDK5中开发应用程序,建议学习以下结构并了解其工作原理,因为它是SDK5结构的关键。

结构arch\u main\u loop\u回调{
无效(*初始应用程序)(无效);
拱门、主回路、回叫、回叫(*应用程序已通电)(无效);
拱门、主回路、回叫、回叫(*系统上的应用、通电)(无效);
无效(*睡眠前的应用程序)(无效);
睡眠模式(*应用程序验证睡眠)(睡眠模式睡眠模式);
无效(*应用程序进入睡眠)(睡眠模式睡眠模式);
无效(*应用程序从睡眠恢复)(无效);
};

静态常量结构arch\u main\u loop\u回调用户\u app\u main\u loop\u回调={
.app_on_init=默认的_app_on_init,

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

//默认情况下,系统唤醒时会重新加载并恢复看门狗定时器。
//用户必须考虑看门狗定时器处理(保持其运行,
//冻结它、重新加载它、恢复它,等等),当应用程序启动时
//调用,可能会影响主循环。
.app\u on\u system\u powered=NULL,

.app_before_sleep=NULL,
.app\u validate\u sleep=NULL,
.app_going_to_sleep=NULL,
.app\u resume\u from\u sleep=NULL,
};

问候,

克里斯0409
离线
最后一次见到:3年10个月前
加入:2017-01-11 05:59
真的非常感谢,

真的非常感谢,有用的建议