MM32操作系统移植总结

1. 移植过程

2.编译成功 ,烧录到单片机上,一旦调用freeRtos的API会使得单片机卡死。

原因:堆栈溢出,需按照datasheet来配置小于datasheet SARAM的的大小,能用的大小为全局变量的余量。

3.初始化时钟时一旦完成初始化会使得整个系统卡死。

void SysTick_Handler(void)  //cpu 中断来源 汇编语言编写
{
	//xPortSysTickHandler();
	static char print_cont1 ,print_cont=0;
	//test
	static uint32_t systickCount = 0;
    systickCount>645352?(systickCount=0):(systickCount++);
	 if (systickCount % (8000) == 0) { // 每100次打印一次,减少日志量
        printf("SysTick Handler Called %d times\r\n", systickCount);
    }
//	 
	 if (Rtos_count != 0x00) {
		printf("Rtos_count %d \r\n", Rtos_count);
        Rtos_count--;
    }
	
	#if SYSTICK_MODE == USE_INTERRUPT_MODE
	if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
		if(print_cont==0)
		{
			printf("RTOS time running...\r\n");
			print_cont++;
			
		}
       xPortSysTickHandler();
    }
    else
    {
		if(print_cont1==0)
		{
			printf("snake arm running...\r\n");
			print_cont1++;
		}
		TimingDelayDecrement();//BOARD_Delay_Decrement();
	}
	#endif
}
#endif

原因:在操作系统的任务没有被创建的时候,就开始了操作系统的心跳,该心跳会区遍历任务链表的任务。

应当怎加判断条件,在操作系统没有工作的的时候用CPU的心跳 ,在创建任务之后操作系统再去接管CPU的心跳。

4.延时函数在操作系统工作以后不能用。也会出现卡死。

打开延时函数的定义,会发现延时函数在等在一个变量减少为1,而裸机的心跳会使得变量递减,操作系统接管之后,需要重新定义延时函数。

    sTimingDelay = count;

    while(sTimingDelay != 0); 

增加修改代码如下:

extern uint32_t SystemCoreClock;
void delay_us(u32 nus)
{		
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*SystemCoreClock; 						//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};										    
}  
void delay_ms_Rtos(u32 count)
{
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=count*SystemCoreClock/2;     //ticks=count*SystemCoreClock;						//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};		
	

5.在创建的任务中。如果调用临界区,不能再使用延时函数。否则也会卡死

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值