⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_c.c

📁 在M16上动行的Small RTOS
💻 C
字号:

#define  IN_OS_CPU_C
//#include "config.h"
#include "../CONFIG/config.h"
           

#if EN_SP2 > 0
uint8  Sp2[Sp2Space];                     // 高级中断堆栈           
#endif

#if EN_OSStkChk>0
uint16 OS_Stk_Null=0xffff;
uint16 OS_Stk_Min_Null=0xffff;
#endif



//#if OS_MAX_TASKS < 9            
//uint8 OSFastSwap = 0xff;                   // 任务是否可以快速切换 
//#else
//uint16 OSFastSwap = 0xffff;
//#endif

#define 	STACK_END 		(uint8 *)&OS_STACK[0];
#define 	STACK_START 	(uint8 *)&OS_STACK[OS_STACK_SIZE-1];


uint8 	  OS_STACK[OS_STACK_SIZE];
uint8  *  OSTaskStackBottom[OS_MAX_TASKS + 2];


    void OSIdle(void)
{
    while(1)
    {
	   MCUCR &= ~((1 << SM0) | (1 << SM1) | (1 << SM2));
    }
}



 void OSStart(void)
{
	uint8 *cp;
	uint8 i,temp;
	
	cp=STACK_START;
	OSTaskStackBottom[0] = STACK_START;
    OSTaskStackBottom[OS_MAX_TASKS + 1] =STACK_END;
	
    /* 初始化优先级最高的任务堆栈,使返回地址为任务开始地址 */
	
	*cp-- = (uint8)((uint16)TaskFuction[0]);    //返回地址低8位
    *cp-- = (uint8)((uint16)TaskFuction[0]>>8); //返回地址高8位
	 
	 SP = (uint16) cp;
	 
	
	    /* 初始化优先级最低的任务堆栈 */
    cp = STACK_END;
    
	 for(temp=0;temp<OS_TASK_STACK_INIT_SIZE-2;temp++)
	   	{ 
	   	*(++cp) = 0;
	   	}	
	*(++cp) =  (uint8)((uint16)OSIdle>>8); // 返回地址高8位
	*(++cp) =  (uint8)((uint16)OSIdle);		//返回地址低8位
  	OSTaskStackBottom[OS_MAX_TASKS] =(uint8 *)cp;
	
	    /* 初始化其它优先级的任务堆栈 */
		
	for(i = OS_MAX_TASKS-1; i > 0; i--)
    {
	   for(temp=0;temp<OS_TASK_STACK_INIT_SIZE-2;temp++)
	   		{ 
	   		*(++cp) = 0;
	   		}
        *(++cp) =  (uint8)((uint16)TaskFuction[i]>>8); //返回地址高8位

        *(++cp) =  (uint8)((uint16)TaskFuction[i]);		//返回地址低8位
	    OSTaskStackBottom[i] =(uint8 *)cp;

	 }
	   
	     /* 允许中断 */	
	Os_Enter_Sum = 1;
    OS_EXIT_CRITICAL();

    /* 函数返回优先级最高的任务 */	
	ret();
}
	



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -