你好
我正在Wira sdk中使用社交距离标记示例。
我创建了一个计时器,它每1分钟提供一次intrrupt,并使用gpio处理示例对其进行了测试,创建了一个单独的任务,该任务在计时器isr处理程序发出信号时运行。
我在社交距离示例中尝试了相同的任务,但在整个应用程序中没有运行
void _timer _init(void)
{
计时器\u配置cfg={
.clk_src=HW_TIMER_clk_src_INT,
.预分频器=0,
.mode=HW\u定时器\u mode\u定时器,
.计时器={
.direction=HW_定时器_DIR_向下,
.reload_val=1671168,
.free_run=true,/*计时器从不停止计数*/
},
};
硬件定时器初始化(硬件定时器R2和cfg);
硬件定时器寄存器内部(硬件定时器R2,硬件定时器溢出cb);
}
无效\u计时器\u溢出\u cb(无效)
{
/*清除定时器1中断标志*/
计时器清除中断(计时器2);
printf(“分钟++”);
hw_gpio_开关(LED1_端口,LED1_引脚);
来自ISR的操作系统事件信号(临时事件);
}
}
void tempReadTask(void*params)
{
printf(“***定时器1演示***\n\r”);
_计时器_init();
硬件定时器启用(硬件定时器2);
int8_t wdog_id;
/*注册看门狗监视的ble_多链路任务*/
wdog_id=系统看门狗寄存器(假);
操作系统事件创建(临时事件);
对于(;;){
/*在每个循环中通知看门狗*/
系统看门狗通知(wdog\U id);
系统看门狗暂停(wdog\U id);
操作系统事件等待(临时事件,操作系统事件永远);
printf(“获得intrrupt\r\n”);
hw_clk_delay_usec(1000000);
/*恢复监督*/
系统看门狗通知和恢复(wdog id);
}
}
我在sys_init函数中创建了计时器任务
静态void系统_init(void*pvParameters)
{
.........................................
操作系统任务创建(“SDT任务”,
sdt可执行事件任务,
无效的
4096,
SDT_测距_任务_优先级+1,
手柄);
OS_断言(句柄);
操作系统基本类型操作系统状态;
操作系统状态=操作系统任务创建(“温度任务”,
临时阅读任务,
(无效*)0,
1024,
操作系统任务优先级正常,
临时任务);
操作系统断言(操作系统状态==操作系统任务创建成功);
.............
}
我尝试从prvSetupHardware()函数创建并启动计时器,但没有创建单独的任务,然后整个应用程序也没有运行
如果包含硬件计时器,则社交距离示例未运行
非常感谢。
贾加特

你好,贾加特,
我已经要求支持社交距离应用程序的Dialog团队对此进行调查。期待几天内得到答复,
/MHv
你好,贾加特,
对于我们迟来的回复表示歉意-请参阅下面我的反馈:
1.您使用的是用于OS-TICK的TIMER2。更改此选项会使所有FreeRTO变得一团糟。我们的文档中也介绍了这一点。例如,您可以将定时器R2用于PWM,但不能对其进行重新配置。
您可以使用操作系统计时器,而操作系统计时器更易于使用,它们也会根据计时器2的滴答声触发。
如果你想使用HW定时器,那么你可以使用定时器(又名定时器1)或定时器3或定时器4。定时器1和定时器2是睡眠中唯一可用的。有关更多信息,请参阅数据表。
2、在代码中的void\u timer\u overflow\u 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和系统不会因为任何其他原因而唤醒,除非你触发它。
谢谢,下午好