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

📄 os_cpu_a.c

📁 ucosii 移植到s1c33平台的3个关键文件 其中os_cpu_a.s 是 os_cpu_a.c 汇编优化 用一个就可以了
💻 C
字号:

#include "includes.h"


extern OS_TCB *OSTCBHighRdy;
extern OS_TCB *OSTCBCur;
extern BOOLEAN OSRunning;


OS_STK* SP_TMP = 0;//最好用os_cpu_a.s (优化过了)
 	

/* 
   OSStartHighRdy 完成的任务:
   
   1) 调用用户的OSTaskSwHook
   2) 将OSRunning置有效
   3) 将优先级最高的任务的SP切换为当前堆栈
   4) 执行新的任务

*/
void OSStartHighRdy(void)
{
	 
#if OS_CPU_HOOKS_EN > 0
	OSTaskSwHook();
#endif

	OSRunning = 1;
	
	//get new task's stack pointer
	SP_TMP = OSTCBHighRdy->OSTCBStkPtr;
	asm (" xld.w  %r4,SP_TMP"); 
	asm (" xld.w  %r4,[%r4]");   
	asm (" ld.w  %sp,%r4");
	
	//Restore all the registers		
	asm (" popn %r1        ");
	asm (" ld.w %ahr, %r0  ");
	asm (" ld.w %alr, %r1	 ");
	asm (" popn %r14       ");
	asm (" reti ");
}


/*

     任务切换(任务级)
       完成以下操作:
         1)  保存当前任务上下文
         2)  设置优先级最高的任务为当前任务
         3)  设置SP为优先级最高的任务的堆栈地址
         4)  中断返回,执行新任务
         
*/ 
__attribute__ ((interrupt_handler))
void OSCtxSw(void)
{
	//store sp in preempted tasks's TCB
	asm (" xld.w  %r4,SP_TMP");         
	asm (" ld.w  %r5,%sp ");
	asm (" xld.w  [%r4],%r5 ");
	OSTCBCur -> OSTCBStkPtr = SP_TMP;
	
	#if OS_CPU_HOOKS_EN > 0 
	   OSTaskSwHook();
	#endif
	
	OSTCBCur = OSTCBHighRdy;
	OSPrioCur = OSPrioHighRdy;
	
	//get new task's stack pointer
	SP_TMP = OSTCBHighRdy->OSTCBStkPtr;
	asm (" xld.w  %r4,SP_TMP"); 
	asm (" xld.w  %r4,[%r4]");   
	asm (" ld.w  %sp,%r4");
	
}

void OSIntCtxSw(void)
{

#if OS_CPU_HOOKS_EN > 0 
	OSTaskSwHook();
#endif
	
	OSTCBCur = OSTCBHighRdy;
	OSPrioCur = OSPrioHighRdy;
	
	//get new task's stack pointer
	SP_TMP = OSTCBHighRdy->OSTCBStkPtr;
	asm (" xld.w  %r4,SP_TMP"); 
	asm (" xld.w  %r4,[%r4]");   
	asm (" ld.w  %sp,%r4");

	//Restore all the registers	
	asm (" popn %r1        ");
	asm (" ld.w %ahr, %r0  ");
	asm (" ld.w %alr, %r1	 ");
	asm (" popn %r14       ");
	asm (" reti ");
}


/*

  系统时钟中断服务程序

*/
__attribute__ ((interrupt_handler))
void OnTickISR(void)
{        
	OSIntEnter();
	if( OSIntNesting == 1 )
	{
		//store sp in preempted tasks's TCB
		asm (" xld.w  %r0,SP_TMP");         
		asm (" ld.w  %r1,%sp ");
		asm (" xld.w  [%r0],%r1 ");
		OSTCBCur -> OSTCBStkPtr = SP_TMP;
	}
	
	//clear 8bit timer4 factor flag
	*(volatile unsigned char*)0x40288      |=0x01;		
	//reset 8bit timer4
	*(volatile unsigned char*)0x40174      |=0x02;
		 
	OSTimeTick();
	OSIntExit();
   
}

⌨️ 快捷键说明

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