[windows] 如何查看系统是ARM64还是X64架构
[!question]
下载某些软件的时候,看到后缀有arm64和x64,不知道如何选择版本
[!success] 打开
cmd
,输入systeminfo
查看即可
systeminfo
System Boot Time: 2024/11/8, 22:29:23
System Manufacturer: ASUSTeK COMPUTER INC.
System Model: ROG Zephyrus G14 GA401IV_GA401IV
System Type: x64-based PC
[RT-Thread] 定时器超时函数中堵塞
[!bug]
想要修改定时器的超时时间,在定时器的超时函数里使用rt_time_control()函数进行配置,发现堵塞
%% 堵塞情况 %%
[3005]tm2_callback running..
%% 未堵塞情况 %%
[66005]tm2_callback running..
[69005]tm2_callback running..
[72005]tm2_callback running..
[75005]tm2_callback running..
[78005]tm2_callback running..
[81005]tm2_callback running..
[84005]tm2_callback running..
[87005]tm2_callback running..
以下是出现问题的原先代码
void tm2_callback(void *parameter)
{
rt_tick_t timeout = 1000;
rt_timer_control(&tm2, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); // 修改触发tick
rt_kprintf("[%u]tm2_callback running..\n", rt_tick_get());
}
int main()
{
// 静态创建定时器
rt_timer_init(&tm2, "tm2_demo", tm2_callback, NULL, 3000,
RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
rt_timer_start(&tm2); // 开启timer2
return 0;
}
[!success] 通过论坛得知,定时器在运行的过程中, 是不能直接通过
control
接口函数直接进行修改的, 应当先stop
停止定时器之后, 再进行control
相关控制进行配置修改, 随后start
发现其实在timer2的超时回调函数中进行
先关后改再启动
的配置步骤, 依旧会发生堵塞
void tm2_callback(void *parameter)
{
rt_tick_t timeout = 1000;
rt_timer_stop(&tm2); // 关闭timer2
rt_timer_control(&tm2, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); // 修改触发tick
rt_timer_start(&tm2); // 开启
rt_kprintf("[%u]tm2_callback running..\n", rt_tick_get());
}
int main()
{
// 静态创建定时器
rt_timer_init(&tm2, "tm2_demo", tm2_callback, NULL, 3000,
RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
rt_timer_start(&tm2); // 开启timer2
return 0;
}
对于以上情况, 可以
使用事件通知控制线程
:在定时器的回调函数中,仅发送一个事件通知控制线程。在控制线程中处理定时器的控制操作,避免在回调函数中直接调用rt_timer_control
。
// 超时函数
void tm2_callback(void *parameter)
{
rt_kprintf("[%u]tm2_callback running..\n", rt_tick_get());
// 向控制线程发送事件,通知修改定时器
rt_event_send(&timer_event, 0x01);
}
// 线程执行函数
void timer_control_thread(void *parameter)
{
rt_uint32_t event;
rt_tick_t timeout = 500; // 想要修改的超时时间
while (1)
{
// 等待事件触发
if (rt_event_recv(&timer_event, 0x01, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
RT_WAITING_FOREVER, &event) == RT_EOK)
{
// 修改定时器的超时时间(先停再改后启动)
rt_timer_stop(&tm2);
rt_timer_control(&tm2, RT_TIMER_CTRL_SET_TIME, (void *)&timeout);
rt_timer_start(&tm2);
}
}
}
[!note] 详见文档[[📯ROUTINE#使用事件通知临时修改定时时间]]