嵌入式技术william hill官网
直播中

万物死

9年用户 1332经验值
擅长:MEMS/传感技术
私信 关注
[问答]

请问通过rt_timer_create创建的定时器是否在进入临界区后还在运行呢

请问在调用rt_enter_critical()进入临界区后,通过rt_timer_create创建的定时器是否还在运行呢?在文档里看到默认创建的是硬件定时器,此时进入临界区后定时器超时函数应该还能执行吧,但是如果通过RT_TIMER_FLAG_SOFT_TIMER设置为软件定时器的话,文档中说会创建一个timer线程,此时rt_enter_critical()之后停止线程调度,timer线程应该不会执行了吧,但是实测的话定时器还是可以正常执行超时函数

回帖(3)

李鑫

2022-8-31 14:14:33
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

万物死

2022-8-31 14:14:50
但是实际测试中,就算设置为软件定时器,还是一样会执行超时函数,是我哪里设置错了吗,代码如下

#include "sys.h"
#include "rtthread.h"
#include
rt_timer_t One_Sec_Timer;
rt_thread_t Test_thread;
void mdelay_ms(uint32_t ms)
{
    uint32_t time = rt_tick_get();
    while(rt_tick_get() - time < ms){}
}
static void One_Sec_TimeOut(void *parameter)
{   
    rt_kprintf("1srn");
}
static void Test_thread_entry(void* params)
{
    while(1)
    {
        rt_enter_critical();
        rt_kprintf("ENTERrn");
        mdelay_ms(5000);
        rt_exit_critical();
        rt_kprintf("EXITrn");
        rt_thread_mdelay(5000);
    }
}
int thread(void)
{
    Test_thread = rt_thread_create("Test_thread", Test_thread_entry, RT_NULL, 128, 15, 15);
    if(Test_thread != RT_NULL)
        rt_thread_startup(Test_thread);
    return 0;
}
int main(void)
{
    thread();
    One_Sec_Timer = rt_timer_create("One_Sec_Timer", One_Sec_TimeOut,
                                    RT_NULL, 1000,
                                    RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);
    if(One_Sec_Timer != RT_NULL)
    {
        rt_timer_start(One_Sec_Timer);
        rt_kprintf("One_Sec_Timer create successrn");
    }
}
运行结果如图

1.jpg
举报

万物死

2022-8-31 14:14:55
已解决,忘记在rtconfig中开启软件定时器相关宏定义
举报

更多回帖

发帖
×
20
完善资料,
赚取积分