学习ARM开发(19)

使用TICK中断


经过许多天的努力,总算可以使用中断了,但为了让RTOS可以使用定时中断,那么在S3C44B0里有什么样的中断可以实现呢?在S3C44B0里有两种方法可以实现这样中断,一种是通过定时器中断,一种是通RTCTICK定时中断。由于S3C44B0片内已经有提供给RTOS的中断,就应使用它作为RTOS的中断,这样可以使时间片跟RTC时钟是时间同步。RTOS调度任务是通过设置时间片中断实现的。当时间片到达时,就向CPU发出中断信号,CPU就会把当前任务状态保存下来,然后转到中断进程运行,并且在中断里放着的是进行优先选择运行任务的程序,接着从中断返回时就可以运行不同的任务了。既然这个中断那么重要,就需要详细地了解TICK中断实现。

 

S3C44B0的内部有一个实时日历时钟(RTC)单元,它只需要外接一个32.768kHz的晶振即可工作。当然要对它进行编程初始化才能工作的,下面就来看看是怎么样初始化的。

首先,通过RTCCON寄存器的第0位来表示要“读”还是“写”RTC的寄存器。当设置第0位为1时,就允许读写所有寄存器。当设置第0位为0时,就只允许读,不允许写所有寄存器。

其次,通过TICNT寄存器来控制产生TICK中断。这个寄存器的第7位是表示是否启用TICK中断。当启用时,就设置为1。第06位表示中断计数值,要多久才中断,是通过下面的公式计算得到的:

时间片 n+1/128 秒,

其中n是需要设置的数值,它的范围是从1127

从上面的公式可以看出来,当设置n值越大时,时间片就越大,当设置为127时,就时一秒钟中断一次了。设置为最小值1时,就是15.625ms

最后,下面这段程序就是设置TICK中断,这样就要以供RTOS使用了。

 

///////////////////////////////////////////////////////////////////////////////

//函数名称:   TickIntEnable

//函数功能:   打开Tick中断。

//输入参数:   nTickCount---分频系数。

//输出参数:

// :   

//开发人员:   蔡军生

//    :   2006/02/13

//修改说明:  

//

///////////////////////////////////////////////////////////////////////////////

void TickIntEnable(unsigned int nTickCount)

{

  //  

  I_ISPC |= (unsigned int)0x01 << 20;

 

  //

  //清除屏蔽位。

  INTMSK &= ~(BIT_GLOBAL|BIT_TICK);

 

  RTCCON = (unsigned char)1;

  TICINT = (unsigned char)(nTickCount | 0x80);

  RTCCON = (unsigned char)0;

 

}

 

如果中断寄存器已经设置好,那么这个RTOS的时间片中断,就已经可以工作了。接着最重要的工作,就是怎么样在中断子程序里进行RTOS的任务切换,这个比较复杂,需要很长时间去了解和实验,并且要对ARM的汇编比较好。这个时间片设置长短,也跟不同的应用有关系的,如果需要快速实时的中断,就需要设置它短一点,这样检查任务切换就及时一点,但也有一个坏处,就是浪费在任务切换上的CPU资源比较多。如果任务调试不需要太及时,就可以设置大一点,这样浪费在任务切换上的CPU资源就减少了。

 

 

posted @ 2006-02-21 13:26  ajuanabc  阅读(137)  评论(0编辑  收藏  举报