ucos在飞思卡尔hcs12dg128上的移植

刚毕业第一个工作,开始单片机开发的时候,就想学习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;			           //开中断
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值