嵌入式技术论坛
直播中

ss

6年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[问答]

用rt_thread_suspend函数强行挂起空闲线程会对整个系统造成什么影响

如题,若用rt_thread_suspend函数强行挂起空闲线程一段时间会对整个系统造成什么影响?
我遇到的问题是在硬件定时器的超时回调函数(中断上下文环境)中使用rt_thread_delay函数挂起当前线程,其实就是空闲线程,然后一个软件定时器中的超时回调函数(线程上下文环境)就无法使用rt_thread_delay函数挂起当前线程(即timer线程)。
代码如下:
static rt_timer_t timer1;
static struct rt_timer timer2;
static void timer1_callback(void *parameter){
    rt_kprintf("[%u]timer1
", rt_tick_get());
    rt_thread_delay(10000);
}
static void timer2_callback(void *parameter){
    rt_kprintf("[%u]timer2
", rt_tick_get());
    rt_thread_mdelay(10000);
}
static int tick_sample(void){
    timer1 = rt_timer_create("tm1",
                            timer1_callback,
                            RT_NULL,
                            3000,
                            RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_HARD_TIMER);
    if(!timer){
        return -RT_ENOMEM;
    }
    rt_timer_init(&timer2,
                  "tm2",
                  timer2_callback,
                  NULL,
                  1000,
                  RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);   
    rt_timer_start(timer1);      
    rt_timer_start(&timer2);            
    return RT_EOK;               
}
INIT_APP_EXPORT(tick_sample);
打印结果:





可以看到timer2软件定时器超时回调函数后面一直按设定的超时间隔打印,并没有挂起10s。
PS:此次仅为学习过程中的测试,我知道最好不要在超时回调函数中使用rt_thread_delay函数。

回帖(3)

ss

2022-3-16 09:31:44
定时器中断处理函数不要使用 rt_thread_mdelay() 函数
中断处理函数要保证快进快出
空闲线程挂起来,那万一其它任务都挂起了,调度器还去干啥呢?
举报

ss

2022-3-16 09:32:50
中断并不属于线程上下文哦,在中断里是不能挂起当前线程的
举报

ss

2022-3-16 09:35:36
你是在定时回调函数中增加延时,挂起当前中断吗?
举报

更多回帖

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