完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
比如我用stm32,systick 1ms中断一次 |
|
相关推荐
3个回答
|
|
可以搜下:rt_schedule();,这是执行调度的,
|
|
|
|
是在内核滴答计时器的中断中进行判断和线程的调度的。
内核滴答计时器中断的处理函数如下: /* libraries/HAL_Drivers/drv_common.c */ void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); HAL_IncTick(); rt_tick_increase(); // 检查线程的状态进行调度;检查定时器列表的状态 /* leave interrupt */ rt_interrupt_leave(); } rt_tick_increase() 的源码如下:里面判断了是否有就绪的线程有的话进行调度器的调度,最后查看了定时器列表查看是都有定时器到时,有的话执行定时器的回调函数。 /* rt-thread/src/clock.c */ void rt_tick_increase(void) { struct rt_thread *thread; rt_base_t level; level = rt_hw_interrupt_disable(); /* increase the global tick */ #ifdef RT_USING_SMP rt_cpu_self()->tick ++; #else ++ rt_tick; #endif /* RT_USING_SMP */ /* check time slice */ thread = rt_thread_self(); // 获取当前运行的线程 -- thread->remaining_tick; // 剩余的时间片计数自减1 if (thread->remaining_tick == 0) // 剩余的时间片计数检查 { /* change to initialized tick */ thread->remaining_tick = thread->init_tick; thread->stat |= RT_THREAD_STAT_YIELD; rt_hw_interrupt_enable(level); rt_schedule(); // 调度器 } else { rt_hw_interrupt_enable(level); } /* check timer */ rt_timer_check(); // 定时器列表检查 } rt_schedule() 的源码如下:进行线程优先级的判断进行调度。 /* rt-thread/src/scheduler.c */ void rt_schedule(void) { ...... /* 关中断 */ level = rt_hw_interrupt_disable(); ...... /* 获取优先级最高的线程 */ to_thread = _get_highest_priority_thread(&highest_ready_priority); ...... /* 如果当前线程的优先级低于获取到线程的优先级,则让出处理器资源 */ rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; need_insert_from_thread = 1; ...... /* 开启切换 */ rt_current_priority = (rt_uint8_t)highest_ready_priority; from_thread = rt_current_thread; rt_current_thread = to_thread; ...... /* 将要切换线程从ready队列移除 */ rt_schedule_remove_thread(to_thread); /* 将要切换线程的状态设为运行状态 */ to_thread->stat = RT_THREAD_RUNNING | (to_thread->stat & ~RT_THREAD_STAT_MASK); ...... /* 栈溢出检查 */ _rt_scheduler_stack_check(to_thread); ...... /* 这里假设是正常的切换,不是中断触发,所以进入该分支 */ rt_hw_context_switch((rt_ubase_t)&from_thread->sp, (rt_ubase_t)&to_thread->sp); ...... } |
|
|
|
几种调度方式。
线程时间片耗尽,这个时候是在 systick 中断里进行的调度。时间片轮换式。 线程等待资源自动挂起,这个时候可能出现在任何时间,不一定是 systick 中断。让出 cpu 资源给低优先级线程,比如 idle。 其它外设中断里,资源可用,引起线程调度,可能出现挂起当前线程,转向更高优先级线程。抢占式。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
517 浏览 0 评论
【英飞凌PSoC 6 RTT开发板试用】串口测试标准输入输出重定向
633 浏览 0 评论
2240 浏览 0 评论
1202 浏览 0 评论
【英飞凌PSoC 6 RTT开发板试用】以搭积木方式实现简单的互联型家庭网关
922 浏览 0 评论
13994 浏览 21 评论
【参与有奖】激扬代码,千元现金!RT-Thread主题征文大赛
55097 浏览 88 评论
4952 浏览 21 评论
野火 ISO STM32资料合集(程序、原理图、项目初高级篇)
16291 浏览 37 评论
13482 浏览 41 评论
173432 浏览 42 评论
228142 浏览 57 评论
11380 浏览 43 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 粤ICP备14022951号 )
GMT+8, 2023-8-26 05:20 , Processed in 0.636501 second(s), Total 67, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:粤 B2-20160233 工商网监 湘ICP备2023018690号