2024/11/10

[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#使用事件通知临时修改定时时间]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值