你好
我使用社交距离标签的例子与Wira sdk。
我创建了一个定时器,每1分钟给中断一次,我用gpio处理示例测试它,创建了一个单独的任务,当定时器isr处理程序给出信号时运行。
我用社交距离的例子尝试了相同的任务,但在整个应用程序中没有运行
空白_timer_init(空白)
{
Timer_config CFG = {
.clk_src = HW_TIMER_CLK_SRC_INT,
.prescaler = 0,
.mode = HW_TIMER_MODE_TIMER,
.timer = {
.direction = HW_TIMER_DIR_DOWN,
.reload_val = 1671168,
.free_run = true, /*定时器从未停止计数*/
},
};
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
{
printf("*** TIMER1 demo ***\n\r");
_timer_init ();
hw_timer_enable (HW_TIMER2);
int8_t wdog_id;
/*注册看门狗监控的ble_multi_link任务*/
Wdog_id = sys_watchdog_register(false);
OS_EVENT_CREATE (tempEvent);
For (;;) {
/*在每个循环中通知看门狗*/
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函数中创建了定时器任务
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("温度任务",
tempReadTask,
(void *) 0,
1024年,
OS_TASK_PRIORITY_NORMAL,
temp_task_h);
OS_ASSERT(os_status == OS_TASK_CREATE_SUCCESS);
.............
}
我尝试创建和启动定时器从prvSetupHardware()函数没有创建一个单独的任务,然后整个应用程序也没有运行
如果包含硬件定时器,那么社交距离示例将不会运行
谢谢你!
Jagath
嗨Jagath,
我已经要求支持社交距离应用程序的Dialog团队调查此事。几天内就会有答复,
/ MHv
嗨Jagath,
很抱歉我们回复晚了-请查看我的反馈如下:
1.您正在使用用于OS-TICK的TIMER2。改变了这个,你就把FreeRTOS都搞砸了。这在我们的文档中也有描述。例如,您可以将TIMER2用于PWM,但不能重新配置它。
你可以使用操作系统定时器来代替,这更容易使用,它们也会根据TIMER2的滴答声被触发。
如果你想使用HW定时器,那么你可以使用定时器(又名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重定向为例,拿出应用程序的所有代码,并添加你的,它将看起来像工作,因为没有RTOS事件。RTOS和系统将不会为其他任何事情而唤醒,除非您触发它。
谢谢,PM_Dialog