os_cpu_c.c

来自「在M16上动行的Small RTOS」· C语言 代码 · 共 96 行

C
96
字号

#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 + =
减小字号Ctrl + -
显示快捷键?