近些天在学习μcosii内核的移植,基本上能正常工作,现在大概来梳理一下,以做备忘,主要是内核心跳这一块。
1 首先在OS_CPU.H中做OS_TICKS_PER_SEC的宏定义,如#define OS_TICKS_PER_SEC 100表示内核一秒钟内有100个心跳
2 心跳主要是用硬件定时器TIMER0来支持,所有要对TIMER0设置:
void Timer0Init(void)
{
// 定时器设置
rTCON = rTCON & (~0xf) ;// clear manual update bit, stop Timer0
rTCFG0 &= 0xffffff00;// set Timer 0&1 prescaler 0
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= 0xfffffff0;// set Timer 0 MUX 1/4
rTCFG1 |= 0x00000001;// set Timer 0 MUX 1/4
rTCNTB0 = (PCLK / (4 * (15 + 1) * OS_TICKS_PER_SEC)) - 1; //这个计算公式我不是太确定,主要有两点,一个是15+1还是15,另一个最后要不要减一,不过我觉得这 //个影响不大
rTCON = rTCON & (~0xf) |0x02; // updata
rTCON = rTCON & (~0xf) |0x09; // star
}
3 因为是利用TIMER0的中断来实现心跳,所以还要对TIMER0的中断进行配置:
void ISRInit(void)
{
// 设置中断控制器
rPRIORITY = 0x00000000;// 使用默认的固定的优先级
rINTMOD = 0x00000000;// 所有中断均为IRQ中断
pISR_TIMER0= (INT32U) OSTickISR; //安装中断函数
rINTMSK &= ~(1<<10);// 打开TIMER0中断允许
}
需要主意的是,在多任务启动之前,不能开启时钟节拍中断,因为系统在开始第一个任务之前,时钟节拍中断服务程序就会执行,而此时的系统处于未知状态,当然应用程序会崩溃。
另外,关于任务切换的实现,我没有用软中断,也没有用TRAP指令,直接将宏OS_TASK_SW() 定义成任务切换函数OSCtxSw()的宏 ,即#define OS_TASK_SW() OSCtxSw(),不知道这样处理是否合理,是不是一定要使用软中断或TRAP等,我觉得不是一定,我的理解是中断是为了将低优先级任务现场入栈,高优先级现场出栈,直接调用函数OSCtxSw()也可以实现。