我有3个定时器声明的app_easy_time。一个周期是1秒,第二个在某些情况下被调用,最后一个在随机时间每30秒调用一次。
有了这三个定时器,第二个定时器回调函数不会被正确调用,我相信它是由第一个定时定时器调用的。
如果我只使用前两个计时器,一切似乎都好。
更新:一些简化的代码演示了我的计时器设置,错误触发处理程序的问题是我的错,但另一个问题发生了。
Static void app_watchdog_second_timer_handler() //每秒调用一次,
{
second_coun + +;
APP_WATCHDOG_SECOND_TIMER = app_easy_timer(100, app_watchdog_second_timer_handler);/ / 1000毫秒
如果(second_count = = 10)
{
Uint32_t delay = (co_rand_byte() % 20) * 10 + 30;
APP_SEND_DATA_TIMER = app_easy_timer(delay, sendSensorDataHandler);
}
如果(second_count == 30) // period = 30秒
{
second_coun = 0;
}
}
void sendSensorDataHandler(void) //每段时间调用一次
{
APP_SEND_DATA_TIMER = EASY_TIMER_INVALID_TIMER;//这行解决我之前的问题,现在计时器触发正确的处理程序
}
void resetSendData(void) //在某些情况下触发
{
如果(APP_SEND_DATA_TIMER != EASY_TIMER_INVALID_TIMER) //这行解决我之前的问题,现在计时器触发正确的处理程序
{
// ----------这里出现了另一个问题,这个函数只删除了我的APP_WATCHDOG_SECOND_TIMER,导致没有计时器运行,我检查timer_callbacks[APP_TIMER_MAX_NUM],空
APP_SEND_DATA_TIMER = app_easy_timer_modify(APP_SEND_DATA_TIMER, RESET_SEND_DATA_TIME + (co_rand_byte() % 20) * 10);
}
}
嗨toughworld,
你能给我讲讲你的装置吗?我设置了3个计时器1)60秒,2)30秒和3)增加延迟。他们似乎都准时离开了。在您的测试中,如果我理解正确,似乎一个计时器触发了错误的处理程序,这是正确的吗?
由于MT_dialog
谢谢,我已经上传了一些简化的代码,演示了我的定时器设置,错误触发处理程序的问题是我的错,但另一个问题发生了,
顺便说一下,在CSR api中,回调有timerid参数来避免赛车coditon,在easy timer中,没有这个是可以的吗?
Typedef void(* timer_callback_arg)(timer_id const)
timer_id TimerCreate (uint32 const time,bool const relative,timer_callback_arg handler)
嗨toughworld,
如果我理解正确的app_easy_timer_modify();不是修改你的定时器,而是删除另一个定时器?您是否能够验证传递给app_easy_timer_modify的值,并检查传递给function的处理程序的id。我试过app_easy_timer_modify,它没有取消计时器。你可以尝试实现一些更简单的东西,像这样尝试:
空白testing_timer_handler1(空白)
{
testing_timer1 = EASY_TIMER_INVALID_TIMER;
如果(testing_timer ! = EASY_TIMER_INVALID_TIMER)
{
testing_timer = app_easy_timer_modify(testing_timer, RESET_SEND_DATA_TIME + (co_rand_byte()%20)*10);
}
testing_timer1 = app_easy_timer (60, testing_timer_handler1);
}
空白testing_timer_handler(空白)
{
如果(testing_timer ! = EASY_TIMER_INVALID_TIMER)
{
testing_timer = EASY_TIMER_INVALID_TIMER;
arch_set_pxact_gpio ();
}
}
由于MT_dialog
你好,
我在DA14583DEVKT-B板上使用SDK 5.0.3软件。
我使用了“ble_app_peripheral”(给出的BLE示例项目)。
修改为支持两个特性。需要每10毫秒和30毫秒分别通过特征1和特征2向移动端发送数据。
在每一个循环操作中,我需要获得1个数据包的数据I和3个数据包的数据ii(即持续时间为30毫秒)。但是我收到1包数据-1和2包数据- ii。
“app_easy_timer (APP_PERIPHERAL_CTRL_TIMER_DELAY DataVal1TimerCbHandler)”和app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY2, DataVal2TimerCbHandler)用来触发定时调用。
请帮我解决这个问题。
问候,
Mahesh Chandana。
嗨的卖方,
请查看下面的帖子http://support.dialog-semiconductor.com/whats-kernel-timer-accuracy.
由于MT_dialog
你好,
我使用“ble_app_peripheral”(给出的BLE示例项目)代码。
我需要以下有用的信息
1.到目前为止,我只能达到最少10毫秒。是否有可能增加内核计时器的调度频率(即app_easy_timer())。
2.我希望在我的应用程序中使用队列实现。请指导我如何创建和使用队列。
3.根据我的应用需求,我需要将传感器数据发送到Kernel(通过BLE传输),只要数据可用。我是否可以调用“ke_msg_send(req)”当我有传感器数据。是否存在任何约束和限制。发送到内核的两个连续包或消息之间所需的最小时间是多少?
问候,
Mahesh Chandana。
嗨的卖方,
1.我不明白你所说的调度频率是什么意思,当代码在主循环中通过rwip_schedule()时,所有消息都被调度。目前还没有办法增加内核计时器的分辨率,如果这是你的意思的话。
2.您可以在RW- bt - kernel - sw - fs中找到有关RW内核的信息。
3.正如上面我已经提到,信息通过rwip_schedule内核将(),这个函数如何频繁执行取决于循环,如果系统决定去睡觉或不的functionallity app_asynch_trm()函数(app_on_ble_powered)。如果app_on_ble_powered返回GOTO_SLEEP,设备将继续,进行适当的睡眠检查并进入睡眠,如果它返回KEEP_POWERED,这将迫使调度程序再次运行。
由于MT_dialog
你好,
感谢您的快速回复。
是否可能在单个连接间隔内发送多个(即多个)通知数据。
问候,
Mahesh Chandana。
嗨的卖方,
是的,这是可能的,你不需要做任何特殊的事情,只要在你想要的时间间隔发送通知,如果队列中有多个通知可用,堆栈将发送多个包。关于在一个连接间隔中可以发送多少数据包,请检查下一个线程http://support.dialog-semiconductor.com/number-packets-connection-event.
由于MT_dialog
你好,
当我发送启用通知(即。(即写请求。1值)从手机到服务器),它在服务器端可接收(即在user_catch_rest_hndl())。但当我发送禁用通知(即写请求(即0值)从移动到服务器),我不能在服务器端接收(即user_catch_rest_hndl())。
我需要指示(在服务器端),当我收到禁用通知。我怀疑它是在内核级别本身处理的。
如何识别接收的禁用通知。
问候,
Mahesh Chandana。
嗨的卖方,
当对某个特征进行集中写操作时,您在应用程序中得到指示,例如在ble_app_peripheral项目中,您应该能够捕获user_catch_rest_hndl()函数中的CUST1_IDX_ADC_VAL_1_NTF_CFG情况,当您的应用程序得到这个指示时,您可以检查参数的值是否具有PRF_CLI_START_NTF或PRF_CLI_STOP_NTFIND。
由于MT_dialog