刚毕业第一个工作,开始单片机开发的时候,就想学习ucos,最开始买了邵贝贝的那本书,对操作系统的调度和一些基础有了认识,不过没有使用过操作系统,在第二份工作后,开始接触和使用VxWorks驱动开发,再后来进行linux驱动开发。最近闲着没事,翻出了刚开始再第一个公司工作时买的飞思卡尔的开发板,移植下ucos玩一下。说来惭愧,对照着书本修改了下,结果程序一跑就飞。
1. 开发板使用的时龙丘的HCS12DG128的开发板, 参照《嵌入式系统--使用HCS12微控制器的设计与应用》书中的代码,开两个任务,一个1hz, 一个2hz 分别对portb的 gpio0 和gpio1 进行点灯。结果总是在系统开始后跑飞,通过调试发现系统不停的进入系统的定时器中断,或者在osstart后跑飞。
2. 在网上搜了一下,飞思卡尔的问题不是很多,大部分都是关于stm32单片机的讨论,没有什么实质性的结果,不过对这款单片机的移植步骤基本上是明确的,移植代码也没有太大问题,基本上是按照书中拷贝的,后来从网上下了分这本书的光盘,对比代码发现,在系统时钟的中断服务程序中, 需要先关中断,服务程序退出前再打开中断。修改后调试ok。
__interrupt 7 void OSTickISR(void) //16为定时器中断
{
DisableInterrupts; //关中断
/* test */
// CRGFLG_RTIF=1; //向CRGFLG_RTIF 写1 清除标志位
// sci_sendchar('1');
#if 1
asm {
ldaa PPAGE;
psha
}
OSIntEnter(); /* 进入中断 */
OS_SAVE_SP(); /* 保存堆栈 */
/* user code */
OSTimeTick();
g_intcnt++;
//TFLG2 = 0x80;
CRGFLG_RTIF=1; //向CRGFLG_RTIF 写1 清除标志位
OSIntExit();
asm {
pula
staa PPAGE;
rti
}
#endif
EnableInterrupts; //开中断
}
__interrupt 4 void OSCtxSw(void)
{
DisableInterrupts; //关中断
asm {
ldaa PPAGE;
psha;
nop;
ldx OSTCBCur;
STS 0, x;
}
OSTaskSwHook();
OSTCBCur = OSTCBHighRdy;
OSPrioCur = OSPrioHighRdy;
asm {
ldx OSTCBCur;
lds 0, x
pula
staa PPAGE;
rti;
}
EnableInterrupts; //开中断
}