时钟中断是rt-thread的线程调度器的驱动力
来源:互联网 发布:js 监听键盘事件 编辑:程序博客网 时间:2024/06/01 10:21
1 系统时钟中断驱动引擎
rt-thread操作系统中当线程时间片耗尽,或是当线程sleep一段时间后唤醒再被调度,此过程又是如何进行的呢?到底是谁来驱动这一过程的呢?
答案是时钟中断源。且来看看时钟中断例程:
在bsp/stm32f20x/drivers/board.c源文件中存在这么一个时钟中断例程代码:(这里以stm32f20x的MCU为例)
其中rt_tick_increase的函数如下定义:rt_thread_yield函数已在之前的文章http://blog.csdn.net/flydream0/article/details/8584362一文的第7章已有介绍,而rt_timer_check函数在http://blog.csdn.net/flydream0/article/details/8570841#t4一文中第3.3节也已有介绍。
由上述代码可见,一旦系统产生时钟中断,在中断例程中,系统首先将检查当前正在运行的线程剩余时间片是否耗尽,如果耗尽则将其从调度器就绪队列中取出放到末尾,然后再重新调度线程,接着检查是否有休眠的线程时间到达,如果有,则触发其时钟超时回调函数,这个时钟超时回调函数在之前的文章http://blog.csdn.net/flydream0/article/details/8584362#t2一文中的2.1节介绍初始化线程函数_rt_thread_init时有如下代码:
可见在线程初始化时,就设置了线程内部时钟的超时回调函数rt_thread_timeout函数,关键就是这个函数会进行一些线程调度的操作,其源码如下定义:可见,其会将当前挂起的线程加入到调度器就绪队列,然后重新调度。
2 系统时钟中断引擎小结
综上所述,当系统产生时钟中断时,首先检查当前正在运行的线程是否还有剩余时间片,如果耗尽则从就绪队列中移除放到末尾再重新调度,接着检查是否存在挂起的线程有时间到达的,如果有,则加入到调度器就绪队列中,然后重新调度。
3 软件定时器模式下的驱动引擎
此外,需要注意地是,如果用户设置使用软件软件定时器方式,则系统中还存在一时钟线程timer_thread,见http://blog.csdn.net/flydream0/article/details/8570841一文,此线程专门随时系统时钟tick的增加来检查定时器是否时间到达,这其中就包含线程的定时器,一旦线程对应的定时器时间到达,则将加入到线程调度器就绪队列中进行调度。由此可见,在设置了软件定时器模式时(默认情况下,rt-thread使用硬件定时器),这个timer_thread线程也是rt_thread操作系统线程调度的驱动引擎.
4 如何设置系统时钟中断间隔
查看rt-thread操作系统的用户手册时,上面有提到rt_thead操作系统的时钟每个tick的默认间隔为10ms,那么这个10 ms双是如何来的呢?
答案是在/bsp/stm32f20x/drivers/board.c源文件中,且看SysTick_Configuration函数的实现:
由上述代码可见,rt_thread的系统tick是由RT_TICK_PER_SECOND这个宏来配置的,RT_TICK_PER_SECOND在头文件rtconfig.h文件中定义,如下:此参数的含义是1秒包含多少个tick, 这里默认是100,则默认情况下1秒包含100个tick,那么即每个tick为10ms,现在明白了吧?
如果我们要修改每个tick的时间隔,则只需要修改RT_TICK_PER_SECOND这个宏的值即可.
- 时钟中断是rt-thread的线程调度器的驱动力
- 时钟中断是rt-thread的线程调度器的驱动力
- rt-thread线程调度器源码分析
- RT-thread内核之线程调度器
- rt-thread线程调度器源码分析
- rt-thread的位图调度算法分析
- rt-thread的位图调度算法分析
- rt-thread的位图调度算法分析
- Thread线程的中断
- rt-thread的空闲线程源码分析
- RT-Thread的线程间同步
- rt-thread的空闲线程源码分析
- RT-Thread的线程(任务)处理
- RT-Thread内核之线程调度(二)
- RT-Thread内核之线程调度(三)
- RT-Thread内核之线程调度(四)
- RT-Thread内核之线程调度(五)
- RT-Thread内核之线程调度(六)
- ASP.NET多线程下使用HttpContext.Current为null解决方案
- web的优化
- 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
- URAL 1297Palindrome
- 【操作系统】 Windows 10 中常用的快捷键
- 时钟中断是rt-thread的线程调度器的驱动力
- mysql系列之9.mysql日志&存储引擎
- 数据链路层-2 VLAN
- java 线程总结
- HDU 1556 Color the ball
- 百度360一起搜
- leetcode scramble string
- javascript控制HTML5的全屏操控,浏览器兼容问题
- java生成zip文件打包操作代码(包括解压缩)