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

📄 kcore.cpp

📁 一个简单而又高效的嵌入式操作系统.包括GUI及文件系统.仿Windows设计,类似于MFC风格
💻 CPP
字号:
// KCore.cpp: implementation of the KCore class.
//
//////////////////////////////////////////////////////////////////////


#include "..\stdafx.h"
#include "KCore.h"

POS_TCB pOsNextThread;
POS_TCB pOsCurThread;
int* pOsHeap;
int nOsThreadCount=0;
OS_TCB aOsThread[OS_MAXTHREAD];

void OS_Init()
{
	pOsHeap[0]=OS_HEAPSIZE;
	GWnd::m_aMsg=(MSG*)HeapAlloc(GUI_MAXMSG*sizeof(MSG));
	GWnd::m_aWnd=(GWnd**)HeapAlloc(GUI_MAXWND*sizeof(GWnd*));
	pOsCurThread=aOsThread;
	pOsNextThread=aOsThread;
	nOsThreadCount=1;
}

void OS_OnIdle(void)
{
	HAL_OnIdle();
}

LPVOID HeapAlloc(int nBytes)
{
	int i,i2,x2,nNeeds;
	nNeeds=nBytes>>2;
	nNeeds+=(nBytes & 0x03)?2:1;
	i=0;
	do
	{
		i2=ABS(pOsHeap[i]);
		if(pOsHeap[i]>0 && i2-i>=nNeeds)
		{
			if(i2-i-nNeeds>16)
			{
				x2=i2-nNeeds;
				pOsHeap[x2]=-i2;
				pOsHeap[i]=x2;
				i=x2;
			}
			else
			{
				pOsHeap[i]=-i2;
			}
			break;
		}
		i=i2;
	}while(i<OS_HEAPSIZE);
	return i<OS_HEAPSIZE?&pOsHeap[i+1]:NULL;
}

void HeapFree(PVOID pData)
{
	int i,i0,i2;
	i=0;
	i0=-1;
	do
	{
		i2=ABS(pOsHeap[i]);
		if(&pOsHeap[i+1]==pData)
		{
			if(i0>-1 && pOsHeap[i0]>0 && i2<OS_HEAPSIZE && pOsHeap[i2]>0)
				pOsHeap[i0]=pOsHeap[i2];
			else if(i0>-1 && pOsHeap[i0]>0)
				pOsHeap[i0]=i2;
			else if(i2<OS_HEAPSIZE && pOsHeap[i2]>0)
				pOsHeap[i]=pOsHeap[i2];
			else pOsHeap[i]=i2;
			break;
		}
		i0=i;i=i2;
	}while(i<OS_HEAPSIZE);
}

int HeapAllocSize(PVOID pData)
{
	int i;
	int* aBuf;
	aBuf=(int*)pData;
	i=aBuf-1-pOsHeap;
	i=-pOsHeap[i]-i-1;
	i<<=2;
	return i;
}

void FillMemory(LPVOID pDest,DWORD nLength,BYTE nFill)
{
	DWORD p=DWORD(pDest);
	DWORD i,nData=nFill;

	nData=nFill;
	nData=(nData<<8)|nData;
	nData=(nData<<16)|nData;
	
	nLength=DWORD(pDest)+nLength;
	if((DWORD(pDest) & ~0x03) == (nLength & ~0x03))
	{
		i=DWORD(pDest) & 0x03;
		if(i)
		{
			p-=i;
			i=(1<<(i<<3))-1;
		}
		nLength &= 0x03;
		nLength=(1<<(nLength<<3))-1;
		i |= ~nLength;
		*(PDWORD)p &= i;
		*(PDWORD)p |= ~i & nData ;
	}
	else
	{
		i=DWORD(pDest) & 0x03;
		if(i)
		{
			p-=i;
			i=(1<<(i<<3))-1;
			*(PDWORD)p &= i;
			*(PDWORD)p |= ~i & nData ;
			p+=4;
		}
		i=nLength & ~0x03;
		while(p<i)
		{
			*PDWORD(p)=nData;
			p+=4;
		}
		i=nLength & 0x03;
		if(i)
		{
			i=(1<<(i<<3))-1;
			*PDWORD(p) &= ~i;
			*PDWORD(p) |= i & nData ;
		}
	}
}

void CopyMemory(LPVOID pDest,LPCVOID pSrc,DWORD nLength)
{
	DWORD i,p,s;
	if(nLength<4 || (DWORD(pDest) & 0x03)!=(DWORD(pSrc) & 0x03))
	{
		nLength=DWORD(pDest)+nLength;
		if(pDest<pSrc)
		{
			p=DWORD(pDest);
			s=DWORD(pSrc);
			while(p<nLength)
			{
				*PBYTE(p)=*PBYTE(s);
				p++;s++;
			}
		}
		else if(pDest>pSrc)
		{
			p=DWORD(pDest);
			s=DWORD(pSrc)+nLength-p;
			while(nLength>p)
			{
				nLength--;s--;
				*PBYTE(nLength)=*PBYTE(s);
			}
		}
	}
	else if(pDest<pSrc)
	{
		nLength=DWORD(pDest)+nLength;
		p=DWORD(pDest);
		s=DWORD(pSrc);
		i=p & 0x03;
		if(i)
		{
			p-=i;s-=i;
			i=(1<<(i<<3))-1;
			*(PDWORD)p &= i;
			*(PDWORD)p |= ~i & *PDWORD(s);
			p+=4;s+=4;
		}
		i=nLength & ~0x03;
		while(p<i)
		{
			*PDWORD(p)=*PDWORD(s);
			p+=4;s+=4;
		}
		i=nLength & 0x03;
		if(i)
		{
			i=(1<<(i<<3))-1;
			*PDWORD(p) &= ~i;
			*PDWORD(p) |= i & *PDWORD(s);
		}
	}
	else if(pDest>pSrc)
	{
		nLength=DWORD(pDest)+nLength;
		p=nLength & ~0x03;
		s=DWORD(pSrc)+p-DWORD(pDest);
		i=nLength & 0x03;
		if(i)
		{
			i=(1<<(i<<3))-1;
			*PDWORD(p) &= ~i;
			*PDWORD(p) |= i & *PDWORD(s);
		}
		i=(DWORD(pDest) & ~0x03)+4;
		while(p>i)
		{
			p-=4;s-=4;
			*PDWORD(p)=*PDWORD(s);
		}
		p-=4;s-=4;
		i=DWORD(pDest) & 0x03;
		if(i)
		{
			i=(1<<(i<<3))-1;
			*(PDWORD)p &= i;
			*(PDWORD)p |= ~i & *PDWORD(s);
		}
		else
		{
			*PDWORD(p)=*PDWORD(s);
		}
	}
}

BOOL MessageBeep(int nType)
{
	switch(nType & 0xf0)
	{
	case MB_ICONERROR:
		break;
	case MB_ICONQUESTION:
		break;
	case MB_ICONWARNING:
		break;
	case MB_ICONINFORMATION:
		break;
	}
	HAL_Beep(nType);
	Sleep(10);
	HAL_Beep(0);
	return TRUE;
}

POS_TCB GetCurThread()
{
	return pOsCurThread;
}

POS_TCB GetNextThread()
{
	int i=nOsThreadCount;
	DWORD t=GetTickCount();
	while(i--)
	{
		if(t>=aOsThread[i].nTick)
		{
			pOsNextThread=aOsThread+i;
			break;
		}
	}
	return pOsNextThread==pOsCurThread?NULL:pOsNextThread;
}

void CreateThread(OS_THREADPROC pThreadProc,int nStackSize)
{
	OS_TCB& tcb=aOsThread[nOsThreadCount];
	PVOID sp1,sp2;
	tcb.nTick=0;
	if(nStackSize<1)nStackSize=0x4000;
	sp1=HeapAlloc(nStackSize);
	nStackSize=HeapAllocSize(sp1)-sizeof(int);
	sp2=(PBYTE)sp1+sizeof(BYTE)*nStackSize;
	nOsThreadCount++;
	HAL_CreateThread(int(&tcb.sp),int(sp1),int(sp2),int(pThreadProc));
}

⌨️ 快捷键说明

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