μcosii内核心跳的设计

近些天在学习μ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()也可以实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值