嗨,每年,
我使用了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?我以前从未遇到过这种现象
设备:
你好,
您是否尝试使用SDK5中的app_easy_定时器功能运行“prox_reporter”参考软件?您所描述的观察结果无法断定问题是由于“app_easy_定时器”功能造成的。需要更多信息,如您如何运行测试、使用什么软件等。。。。
问候,
嗨,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”
#include“app_easy_timer.h”
/*LED控制结构*/
类型定义结构{
uint8_t todo;/*左闪烁周期*/
uint8_t%;/ *循环百分比* /
uint16_t期间;/ *开/关循环时间(msec)* /
uint32\u t下一步;/*下一次改变的时间到了*/
LEDCONTROL_T;
/***************************************************************************************************
*全局变量
***************************************************************************************************/
静态LedControl\u t ledCtrl\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
/***************************************************************************************************
*本地功能
***************************************************************************************************/
静电voidedupdate(空白);
/***************************************************************************************************
*函数 - API
***************************************************************************************************/
/***************************************************************************************************
* @fn ledinit.
*
*@brief初始化LED服务
*
*@param init-指向包含初始化值的void的指针
*
* @return none
***************************************************************************************************/
void LedInit(空白)
{
LED_INIT();
}
/***************************************************************************************************
* @fn ledblink.
*
*@短暂闪烁LED
*
* @param LED - 要闪烁的LED的位屏蔽值
*numBlinks-闪烁次数
*百分比-led指示灯点亮的每个时段的百分比
*将在
*period—每个周期的长度(毫秒)
*
* @return none
***************************************************************************************************/
无效LED闪烁(8个链接,8个百分比,16个周期)
{
LEDCTRL.TODO = 2 * NUMBLINKS-1;
ledCtrl.percent=百分比;
LEDCTRL.PERIOD =期间;
LED_OFF();
如果(百分比和期间)
{
如果(百分比<100)
{
app_easy_timer(1,Ledupdate);
}
别的
{
LED_ON();
}
}
别的
{
//关掉
LED_OFF();
}
}
/***************************************************************************************************
*@fn-leddate
*
* @brief更新LED使用眨眼
*
*@param-none
*
* @return none
***************************************************************************************************/
静态void更新(void)
{
LED_开关();
Ledctrl.todo--;
如果(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()中进行测试。
还有一点,我发现我在system_init()中调用了LedBlink(),在我将代码闪存到闪存中之后,我会持续重新启动。但是如果我在system_init()之后在main_funct()中调用了LedBlink(),这种现象将不会发生,但我永远无法得到LEDDUpdate()调用。我还启动了一个定时器时,按下一个按钮,我可以得到这个定时器调用时,定时器过期回调。这真的让我困惑,任何建议将不胜感激
你好,
你的问题与你把“LedBlink(20,35,1000)”放在哪里有关。这是因为app_easy_timer和malloc()需要内核计时器和堆服务。只有在内核初始化和激活后才能调用函数。建议将语句放在system_init()之后,并让LedBlink函数永远闪烁,以简化调试。
int main_func(void)
{
睡眠模式\u t睡眠模式;
//全局初始化
system_init ();
莱德布林(20,351000);
/*
************************************************************************************
*平台初始化
************************************************************************************
* /
而(1)
{
.....
}
}
问候,
我已经按照你的建议做了,但我还是不能让led闪烁。现在我在设备连接事件中调用了led闪烁,led向右闪烁。那是因为ble是睡眠,所以我们不能启动计时器?
你好,
在进入睡眠模式之前,假定没有更多活动处于活动状态,包括LED闪烁。无论处于延长睡眠模式还是深度睡眠模式,所有I/O块都将关闭,包括计时器服务。因此,LED闪烁计时器服务被禁用。
为了简化对新驱动程序或函数的调试,最简单的方法是添加一条语句,如下所示,以禁用进入睡眠模式但禁用空闲模式,从而对软件行为产生最小的影响。
//获取允许的睡眠模式
//从rwip_power_down()到wfi()的时间必须尽可能短!!
sleep_mode = rwip_power_down();
/ *语句添加* / sleep_mode = mode_idle;
然后你应该连续看到你的LED眨眼。
问候,
你好,
修复了错误,如下所示:
//获取允许的睡眠模式
//从rwip_power_down()到wfi()的时间必须尽可能短!!
sleep_mode = rwip_power_down();
/*添加的声明*/
if((sleep_mode == mode_ext_sleep)||(sleep_mode == mode_deep_sleep)))
{
睡眠模式=模式空闲;
}
问候,
让我困惑的是:
我在system_init()之后调用LeDblink(),当时kernal已上升时。在LeDBlink()中,我已经设置了一个将唤醒ble的计时器,因此为什么我的计时器回调仍然无法触发?如果我第一次在LeDBlink()中创建计时器时,如果这是真的,如果这是真的?我想我可以在第一次创建计时器之前强制唤醒。我已经尝试了api arch_ble_force_wakeup(),arch_ble_ext_wakeup_on()等。但仍然不能闪烁。这些API可以真正强制设备唤醒?
你好,
验证LedBlink()函数及其行为的技术可以通过简单地强制睡眠模式不进入模式ext\U sleep或模式deep\U sleep来完成。要集成LED闪烁功能并使其按预期运行,您需要了解软件的结构。
在实际应用中,有两个(2)个线程独立运行,BLE堆栈和用户应用程序运行。内核仅提供服务和用户应用程序需要管理和监督所有资源使用情况并监视所有活动以确定设备可以进入睡眠模式。
int main_func(void)
{
睡眠模式\u t睡眠模式;
//全局初始化
system_init ();
/*
************************************************************************************
*平台初始化
************************************************************************************
* /
而(1)
{
做{
//安排所有未决事件
在启动()时计划启动;
}
while(app_asynch_proc()!=GOTO_SLEEP)//授予应用程序控制权,尝试关闭电源
//如果应用程序返回GOTO_SLEEP
.....
}
}
app_asynch_proc()函数是一个检查用户应用程序是否有任何活动正在进行,防止设备进入睡眠模式,而BLE堆栈线程准备进入睡眠。
typedef枚举{
GOTO_SLEEP = 0,
keep_powered.
}拱门、主回路、回叫回路;
在你的情况下,这个函数可以返回“KEEP_POWERED”,只要LED是闪烁的,不允许设备进入睡眠。
静态内联void schedule_whle_ble_on(void)
{
//可编程时钟已启用
而(ble_通电()
{
//已设置可恢复事件结束。可以运行条件射频校准。
uint8_t ble_evt_end_set=ke_event_get(ke_event_ble_evt_end);
//执行消息和事件
Rwip_schedule();
if(ble_evt_end_set)
{
uint32睡眠时间=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();
打破
}
}
}
函数的作用是:在BLE堆栈运行时处理用户应用程序。rwip_schedule()将处理队列中的所有消息,直到完成,控制将传递给app_asynch_trm()函数,并根据返回值“KEEP_POWERED”或“GOTO_SLEEP”来决定保持活动或相应进入睡眠。
请注意,没有跟踪任何软件计时器是否正在运行的功能。软定时器的所有者有责任跟踪其活动。
要在SDK5中开发您的应用程序,建议研究以下结构,并了解它是如何运行的,因为它是SDK5结构的关键。
struct arch_main_loop_callbacks {
无效(*初始应用程序)(无效);
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);
睡眠模式(*应用程序验证睡眠)(睡眠模式睡眠模式);
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 =零,
//默认情况下,系统唤醒时重新加载并恢复监视程序。
//用户必须考虑看门狗定时器处理(请保持运行,
//冻结它,重新加载,恢复IT等),当app_on_system_powered()是
//调用并可能可能影响主循环。
.app_on_system_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,
};
问候,
非常感谢,有用的建议