注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

蓝瑟

人生苦短,及时行乐

 
 
 

日志

 
 

时钟中断  

2009-12-28 14:57:11|  分类: 学习心得 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

平台:BF561-uCLinux

在BF561中有12个公用的通用定时器,每个核另外还有一个独立的核心定时器和看门狗定时器

在uCLinux中使用第一个通用定时器,即Timer0来作为时钟中断的定时器。

时钟中断的内核安装过程如下:

start_kernel->time_init->time_sched_init

static void __init
time_sched_init(irqreturn_t(*timer_routine) (int, void *)) //传入的参数为timer_intereupt函数指针
{
#if defined(CONFIG_IPIPE)
 setup_system_timer0(); //1.关闭核心定时器TCNTL 2.使用set_gptimer系列函数初始化第一个通用定时器Timer0
 bfin_timer_irq.handler = timer_routine; //设置时钟中断处理函数为传进来的timer_interrupt函数
 setup_irq(IRQ_TIMER0, &bfin_timer_irq);//将通用定时器Timer0的中断设置为时钟中断
#else
 setup_core_timer();
 bfin_timer_irq.handler = timer_routine;
 setup_irq(IRQ_CORETMR, &bfin_timer_irq);
#endif
}

 

12个通用定时器被分成8-4的两组,每组通用定时器都会公用一个状态寄存器,比如Timer0-7为一组,共用的状态寄存器是TMRS8_STATUS,用于控制8个定时器的interrupt,overflow,slave enable status。另外每个通用定时器还单独涉及到4个寄存器,名称和功能分别如下:

1.Timer Configuration Register(TIMERx_CONFIG)

2.Timer Counter Register(TIMERx_COUNT)

3.Timer Period Register(TIMERx_PERIOD)

4.Timer Pulse Width Register(TIMERx_WIDTH)

分别通过像如下的过程进行设置和操作:

void __init setup_system_timer0(void)
{
 /* Power down the core timer, just to play safe. */
 bfin_write_TCNTL(0);   //关闭核心定时器

 disable_gptimers(TIMER0bit); //使Timer0通用定时器失效
 set_gptimer_status(0, TIMER_STATUS_TRUN0); /*设置第一组通用定时器的状态寄存器中关于TIMER0的部分内容,该函数使得该状态寄存器的bit[12]清零(TIMER_STATUS_TRUN0),表示的意义就是:TIMER0 is not running,虽然set_函数,但执行的效果却是清零,值得注意*/

while (get_gptimer_status(0) & TIMER_STATUS_TRUN0)
  udelay(10);   //确保TIMER0 没有开始运行

//设置TIMER0的私有寄存器信息
 set_gptimer_config(0, 0x59); /* IRQ enable, periodic, PWM_OUT, SCLKed, OUT PAD disabled */
 set_gptimer_period(TIMER0_id, get_sclk() / HZ);
 set_gptimer_pwidth(TIMER0_id, 1);
 SSYNC();
 enable_gptimers(TIMER0bit);
}

在TIMER0定时器设定好了以后,最后完成的就是timer_interrupt中断函数的调用了。

在timer_interrupt中的工作主要有一下几个方面

获得墙上时间并更新时钟,调用和体系结构无关的时钟中断处理程序do_timer,统计计算资源利用情况并进行负载平衡,调用函数scheduler_tick()(通过update_process_times)判断被中断进程的时间片是否用完。如果用完设置该进程描述中的调度标记,在中断处理完毕、中断返回时系统会检查该标记;如果设置了该标记,系统会重新调度选择合适的进程运行。

  评论这张
 
阅读(437)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017