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

📄 hal.cpp

📁 一个简单而又高效的嵌入式操作系统.包括GUI及文件系统.仿Windows设计,类似于MFC风格
💻 CPP
字号:
#include "stdafx.h"
#include "HAL.h"

typedef void (*ptr_func) (void); 

extern void WinMain(void);
extern "C" void IntSchedule(void);
extern "C" void SoftSchedule(void);
extern "C" int TOUCH_GetState(int* x,int* y);
extern "C" void set_wait_32k_clock_time_irq(ptr_func);
extern "C" void set_time_tick(int Tick_Ps);
extern int Image$$ZI$$Limit[];
extern int* pOsHeap;

DWORD _ISR_STARTADDRESS=0;
DWORD nHalTickCount=0;

USHORT aHalAD[256];

void EnableFIQ(BOOL bEnable)
{
	int tmp;
	__asm{mrs tmp,CPSR}
	if(bEnable)
	{
		__asm{bic tmp,tmp,#0x40}
	}
	else
	{
		__asm{orr tmp,tmp,#0x40}
	}
	__asm{msr CPSR_c,tmp}
}

typedef  enum {         // Value used for ILRX.FIQ
  INTH_IRQ = 0,         // IT routed to IRQ
  INTH_FIQ = 1          // IT routed to FIQ
} INTH_InterruptKind_t;

extern "C" UINT INTH2_GetCurrentIt (INTH_InterruptKind_t Fiq_or_Irq);
extern "C" void INTH2_ValidNextInterrupt (INTH_InterruptKind_t Fiq_or_Irq);

extern "C" __irq void SWI_Tick()
{
	nHalTickCount++;
	if(GetNextThread())
	{
		IntSchedule();
	}
	INTH2_GetCurrentIt (INTH_FIQ);
	INTH2_ValidNextInterrupt(INTH_FIQ);;
}

void IRQ_Tick(void)
{
/*
	__asm{
		swi 0;
	};
*/
}
void Idle()
{
	while(1)
	{
		Sleep(1000);
		if(GWnd::m_nWndCount)
		{
			GWnd::m_aWnd[0]->PostMessage(WM_TIMER,100,GetTickCount());
		}
	}
}
extern "C" int HAL_ENTRY()
{
    int aHeap[0x40000];
    set_time_tick(100);
    set_wait_32k_clock_time_irq(&IRQ_Tick);
    
while(1)
{
    pOsHeap = aHeap;
    //pOsHeap= Image$$ZI$$Limit;
	OS_Init();
	//KFile::Init();
	CreateThread(Idle,0);
	EnableFIQ(TRUE);
	WinMain();
	//KFile::Unload();
	Sleep(5000);
	EnableFIQ(FALSE);
}
return 0;
}
void HAL_OnIdle(void)
{
	static int i=0,ax[3],ay[3];
	int x,y,j;
	
	if(TOUCH_GetState(&x,&y))
	{
		for(j=0;j<2;j++)
		{
			ax[j]=ax[j+1];
			ay[j]=ay[j+1];
		}
		ax[2]=x;
		ay[2]=y;
		i++;
		if(i==3)
		{
			GWnd::WM_Click(x,y,TRUE);
		}
	}
	else if(i)
	{
		if(i>=3)
		{
			GWnd::WM_Click(ax[0],ay[0],FALSE);
		}
		i=0;
	}
}

void Sleep(DWORD nMilliseconds)
{
	nMilliseconds+=GetTickCount();
	GetCurThread()->nTick=nMilliseconds;
	if(GetNextThread())
	{
		SoftSchedule();
	}
	while(GetTickCount()<nMilliseconds);
}

void HAL_Beep(int nType)
{
}

void GetSystemTime(LPSYSTEMTIME lpSystemTime)
{
}

DWORD GetTickCount()
{
	return nHalTickCount*10;
}

⌨️ 快捷键说明

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