经过许多天的努力,总算可以使用中断了,但为了让RTOS可以使用定时中断,那么在S 3C 44B0里有什么样的中断可以实现呢?在S 3C 44B0里有两种方法可以实现这样中断,一种是通过定时器中断,一种是通RTC的TICK定时中断。由于S 3C 44B0片内已经有提供给RTOS的中断,就应使用它作为RTOS的中断,这样可以使时间片跟RTC时钟是时间同步。RTOS调度任务是通过设置时间片中断实现的。当时间片到达时,就向CPU发出中断信号,CPU就会把当前任务状态保存下来,然后转到中断进程运行,并且在中断里放着的是进行优先选择运行任务的程序,接着从中断返回时就可以运行不同的任务了。既然这个中断那么重要,就需要详细地了解TICK中断实现。
S 3C 44B0的内部有一个实时日历时钟(RTC)单元,它只需要外接一个32.768kHz的晶振即可工作。当然要对它进行编程初始化才能工作的,下面就来看看是怎么样初始化的。
首先,通过RTCCON寄存器的第0位来表示要“读”还是“写”RTC的寄存器。当设置第0位为1时,就允许读写所有寄存器。当设置第0位为0时,就只允许读,不允许写所有寄存器。
其次,通过TICNT寄存器来控制产生TICK中断。这个寄存器的第7位是表示是否启用TICK中断。当启用时,就设置为1。第0到6位表示中断计数值,要多久才中断,是通过下面的公式计算得到的:
时间片 = (n+1)/128 秒,
其中n是需要设置的数值,它的范围是从1到127。
从上面的公式可以看出来,当设置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资源就减少了。