你好
我正在使用wiira sdk的社交距离标签示例。
我创建了一个计时器,每1分钟给中断,我测试它与gpio处理的例子,创建了一个单独的任务,当计时器isr处理器给出信号时运行。
同样的任务,我尝试了社会距离的例子,但在整个应用程序没有运行
空白_timer_init(空白)
{
Timer_config CFG = {
.clk_src = HW_TIMER_CLK_SRC_INT,
.prescaler = 0,
.mode = HW_TIMER_MODE_TIMER,
同学们= {
.direction = HW_TIMER_DIR_DOWN,
.reload_val = 1671168,
.free_run = true, /* Timer永不停止计数*/
},
};
hw_timer_init (HW_TIMER2 cfg);
hw_timer_register_int (HW_TIMER2 _timer_overflow_cb);
}
空白_timer_overflow_cb(空白)
{
/*清除TIMER1中断标志*/
hw_timer_clear_interrupt (HW_TIMER2);
printf("分钟+ + ");
hw_gpio_toggle (LED1_PORT LED1_PIN);
OS_EVENT_SIGNAL_FROM_ISR (tempEvent);
}
}
void tempReadTask(void *params)
{
printf("*** TIMER1演示***\ r");
_timer_init ();
hw_timer_enable (HW_TIMER2);
int8_t wdog_id;
/*将ble_multi_link任务注册为看门狗监控*/
wdog_id = sys_watchdog_register(假);
OS_EVENT_CREATE (tempEvent);
(,) {
/*在每个循环中通知watchdog */
sys_watchdog_notify (wdog_id);
sys_watchdog_suspend (wdog_id);
OS_EVENT_WAIT (tempEvent OS_EVENT_FOREVER);
printf (" intrrupt \ r \ n”);
hw_clk_delay_usec (1000000);
/*恢复看门狗*/
sys_watchdog_notify_and_resume (wdog_id);
}
}
我在sys_init函数中创建了计时器任务
static void system_init(void *pvParameters)
{
.........................................
OS_TASK_CREATE(“SDT-Task”,
sdt_ble_events_task,
空,
4096年,
SDT_RANGING_TASK_PRIORITY + 1,
处理);
OS_ASSERT(处理);
OS_BASE_TYPE os_status;
os_status = OS_TASK_CREATE(" temperature task",
tempReadTask,
(void *) 0,
1024年,
OS_TASK_PRIORITY_NORMAL,
temp_task_h);
OS_ASSERT (os_status = = OS_TASK_CREATE_SUCCESS);
.............
}
我尝试从prvsetuhardware()函数创建和启动定时器,而没有创建一个单独的任务,那么整个应用程序也不会运行
如果包含硬件计时器,则社交距离示例不会运行
谢谢你!
Jagath
嗨Jagath,
我已要求支持“社交距离”应用程序的“对话”团队对此进行调查。期待几天后的答复,
/ MHv
嗨Jagath,
很抱歉我们回复晚了,请查看我的反馈如下:
1.您使用的是用于OS-TICK的TIMER2。通过改变这个,你会搞砸所有的FreeRTOS。这在我们的文档中也有描述。你可以使用的TIMER2 PWM为例,但不重新配置它。
你可以使用OS-Timers来代替,这甚至更容易使用,它们将基于TIMER2的滴答触发。
如果您想使用HW定时器,那么您可以使用timer (aka TIMER1)或TIMER3或TIMER4。只有TIMER1和TIMER2在睡眠中可用。请参阅数据表了解更多信息。
2、在void _timer_overflow_cb(void)中,你使用了printf(),这在ISR上下文中是不安全的。你不应该从ISR打印。
3.另外,在void tempReadTask(void *params)中你已经使用了hw_clk_delay_usec(1000000);为什么不使用命令OS_DELAY_MS()来暂停任务,让系统也进入休眠状态呢?hw_clk_delay_usec ();用于在延迟超时小于OS_TICK=2ms时执行循环操作的活动延迟。除此之外,你应该使用FreeRTOS API。
我建议先检查一下UM-B-092: DA1469x软件平台参考手册用户手册,以了解SDK架构和api。
您看到它在标准SDK上运行的“事实”并不能证明什么。如果你尝试使用FreeRTOS retarget,取出应用程序的所有代码并添加你的,它会看起来像工作,因为没有RTOS事件。RTOS和系统不会因为任何其他事情而唤醒,除非你触发它。
谢谢,PM_Dialog