购物车0种商品
IC邮购网-IC电子元件采购商城
最近研究心得
(2011/10/16 9:46:00)
最近研究Directx9.0做的游戏,发觉就是标准的前后台,呵呵。

//-----------------------------------------------------------------------------
//Name:WinMain()
//Desc:Theapplication'sentrypoint
//-----------------------------------------------------------------------------
INTWINAPIWinMain(HINSTANCEhInst,HINSTANCE,LPSTR,INT)
{
//Registerthewindowclass
WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
"D3DTutorial",NULL};
RegisterClassEx(&wc);

//Createtheapplication'swindow
HWNDhWnd=CreateWindow("D3DTutorial","D3DTutorial02:Vertices",
WS_OVERLAPPEDWINDOW,100,100,300,300,
GetDesktopWindow(),NULL,wc.hInstance,NULL);

//InitializeDirect3D
if(SUCCEEDED(InitD3D(hWnd)))
{
//Createthevertexbuffer
if(SUCCEEDED(InitVB()))
{
//Showthewindow
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);

//Enterthemessageloop
MSGmsg;
ZeroMemory(&msg,sizeof(msg));

while(msg.message!=WM_QUIT)//此处循环,包含WINDOW系统使用的消息处理和游戏的主循环
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Render();//此处就是游戏的主循环处,单片机中的main主循环
}
}
}

UnregisterClass("D3DTutorial",wc.hInstance);
return0;
}


网友评论:俺发觉相似点真的多。

游戏和前后台的原理几乎一样。
WINDOW的操作方式,又和嵌入OS一样,比如播放音乐,还可以打开计算器,各干各的事情。
照样不感冒嵌入OS,做产品就象做游戏,单一的环境。

网友评论:TheGetMessagefunctionretrievesamessagefromthecallingthread'smessagequeue.Thefunctiondispatchesincomingsentmessagesuntilapostedmessageisavailableforretrieval.

UnlikeGetMessage,thePeekMessagefunctiondoesnotwaitforamessagetobepostedbeforereturning.

单核是100%,双核是50%,四合就会是25%

Label1->Caption=i++;没有必要,因为人眼以及屏幕刷新的速度有限,而且不出让cpu,label1也不会更新。

网友评论:佩服所长技术,更佩服所长把自己经验拿出来分享的精神,顶!!!!!!!

网友评论:而且更新的飞快,转眼就成百上千了。
俺是为让WINDOW一直忙着,没别的。

俺猜测:开一线程,WINDOW就开始使用另外一个核。
一个核管主程序,其它管线程。
乱猜。

网友评论:让系统可以处理wm_paint事件.
在循环中加入一个Sleep(1)---出让cpu,可以把cpu占用率降下来.

网友评论:TranslateMessage(&msg);
DispatchMessage(&msg);


网友评论:真的不错
学习中

网友评论:给你一个封装好的class,转到c++builder下很容易


#pragmaonce
#include"Delegate.h"

classCExThread
{
CWinThread*m_pThread;
BOOLm_bThreadAlive;
BOOLm_bStopThread;
staticUINTStart(LPVOIDpParam);

public:
CDelegatem_Delegate;

CExThread(void);
~CExThread(void);

boolRun();
voidStop();
};


#include"stdafx.h"
#include"exthread.h"

CExThread::CExThread(void)
{
m_pThread=NULL;
m_bThreadAlive=FALSE;
m_bStopThread=FALSE;
}

CExThread::~CExThread(void)
{
Stop();
}

boolCExThread::Run()
{
m_pThread=::AfxBeginThread(Start,this);
m_bThreadAlive=TRUE;
returnm_pThread!=NULL;
}


voidCExThread::Stop()
{
if(m_pThread==NULL)return;

do{
m_bStopThread=TRUE;
}
while(m_bThreadAlive);
}


UINTCExThread::Start(LPVOIDpParam)
{
CExThread*me=(CExThread*)pParam;
me->m_bThreadAlive=TRUE;
me->m_Delegate.Invoke(NULL,0);
me->m_bThreadAlive=FALSE;
return0;
}


DELEGATE.H

#if!defined(_Class_Delegate_)
#define_Class_Delegate_
#pragmaonce

/*************************************************************************************************
Warning:UnsafeCode!!!
*************************************************************************************************/

#defineHANDLER(function)reinterpret_cast<PTR_CALLBACK>(function)
#defineSetEventHandler(instance,function)_SetEventHandler((instance),HANDLER(function))

classCDelegate;
typedefvoid(CDelegate::*PTR_CALLBACK)(void*sender,DWORDpara);

classCDelegate
{
PTR_CALLBACKm_pCallBack;
CDelegate*m_pInstance;

public:
CDelegate()
{
m_pCallBack=NULL;
m_pInstance=NULL;
}

void_SetEventHandler(void*pInstance,PTR_CALLBACKpCallBack)
{
m_pInstance=(CDelegate*)pInstance;
m_pCallBack=pCallBack;
}

voidInvoke(void*sender,DWORDpara)
{
if(m_pInstance!=NULL&&m_pCallBack!=NULL)
(m_pInstance->*m_pCallBack)(sender,para);
}
};

#endif

网友评论:就看你在哪一层,有时你能控制这个循环,有时则不能。

网友评论:LS的明白了吗?

网友评论:用TTIMER做的真的不行,用回调函数方式做,发现TTIMER不是直接调用,还是通过消息才去回调的,20MS误差太大,1分钟差个十几秒。用多媒体定时器很准,就是消耗资源大:多媒体定时器==一个线程。

没办法,就用多媒体定时器了。

内存管理也搞定,直接先用8M的数组固定,再内部在这个数组中分配。

网友评论:直接替换驱动就可以了。

串口:用PCOMM封装成队列驱动方式,直接替换嵌入裸奔的串口驱动的队列驱动
定时器:系统20MS,弱实时处理5MS,用多媒体定时器搞定。
LCD画波形的速度控制,开线程查询精密定时器(因为多媒体定时器只到MS,速度控制要到0.1ms),这样可以搞定,相当0.1ms的定时器器。
LCD:用BITMAP,BCB里面可以直接对内存操作,可以按FrameBuffer处理,只要窗口刷新函数将上下颠倒下处理(BCB中图形对FrameBuffer是上下颠倒的)。
NANDFLASH存储,有想法,还有待实践。
其它,更简单,只要上面几个搞定,嵌入裸奔的程序就移植到WINDOW上了。

单片机程序,写到能移植到WINDOW的程度的份上,俺认为应该作为一个设计标准考核,高手低手之分。

网友评论:可以认为WINDOW的线程就是中断,MCU开关中断,相当线程的同步,用临界方式可以保证低层函数不重入。

又一心得

网友评论:然后打开机箱,拔下网卡,把EPROM插到网卡上的ROM插座中,把网卡重新插回主板,然后开机。或者把主板上的BIOS芯片拔下来,把自己的ROM换上。干嘛要启动个WINDOWS?

网友评论:感觉就像一个倔强的乡镇企业企业家接管了联想。

网友评论:通过研究,进一步确定基于前后台的嵌入裸奔做控制产品比嵌入OS的理论先进性,从根子上找到WINDOW这个大树做依靠。
通过研究,MCU上做的、WINDOW做的,都是一套体系的程序(除驱动不同),便于维护和管理。
通过研究,发现游戏设计秘密,改天MMCU混不下去,改行做游戏设计混口饭吃。
展望七十岁,准备设计MCU的虚拟机。


网友评论:半天时间。

网友评论:把石头当宝贝了

网友评论:估计你眼里没几个能成宝贝,高手。


网友评论:楼主不在MCU的福地里舒坦,跑到WINDOWS这片大盐碱地来做甚?玩归玩,可别乱了阵脚。

网友评论:无聊贴

网友评论:你也完全可以移植到嵌入式os上
何必呢~~~~~~~~~
何苦呢~~~~~~~~~

网友评论:观察串口打开、关闭、发送、接收,可以使用串口侦听软件,比如:http://www.sudt.com的SerialTrace,这个不错。

完全按照裸奔方式设计的仿MCU的WINDOW程序,以后可能只要会MCU就可设计WINDOW程序,可能......

有关MCU部分,RainLib_Base.lib,RainLib_Unsiversal.lib,RainLib_Driver.lib被封装好,按MCU玩WINDOW游戏程序,很简单了。

代码:main.cpp
//---------------------------------------------------------------------------
#include<vcl.h>
#pragmahdrstop

#include"Main.h"

#include"..\WinTools\RainLib_WinTools.h"
#include"..\Base\RainLib_Base.h"
#include"..\Unsiversal\RainLib_Unsiversal.h"
#include"..\Driver\RainLib_Driver.h"

//---------------------------------------------------------------------------
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
TForm1*Form1;
structCommunicateQueue*psCommunicateQueue_Uart8;//串口1

//---------------------------------------------------------------------------
__fastcallTForm1::TForm1(TComponent*Owner)
:TForm(Owner)
{
}
//---------------------------------------------------------------------------

//main.c必须提供
void_stdcallCallBack_5msInterrupt(void)
{
}

//main.c必须提供
void_stdcallCallBack_20msInterrupt(void)
{
}

//---------------------------------------------------------------------------
//窗口初始化
//---------------------------------------------------------------------------
void__fastcallTForm1::MainFormInit(void)
{
this->ClientWidth=Ini_Read("LCD","ScreenWidth",640);
this->ClientHeight=Ini_Read("LCD","ScreenHeight",480);
}

//---------------------------------------------------------------------------
//主初始化
//---------------------------------------------------------------------------
void__fastcallTForm1::MainInit(void)
{
WinToolsLib_Init("RainLib.ini");//INI文件名
this->MainFormInit();

BaseLib_Init(Ini_Read("MSG","BufferMax",5000));//消息队列大小
UnsiversalLib_Init(Ini_Read("PACKAGE","PackageMax",2));//使用包解析的任务数
DriverLib_Init(this->ClientWidth,this->ClientHeight);

psCommunicateQueue_Uart8=CommunicateQueue_Register(200,200,NULL);
if(Uart8_Setup(1,psCommunicateQueue_Uart8,B38400,BIT_8|STOP_1|P_NONE)==false)
{
Application->MessageBoxA("打开串口错误","程序中断退出!",MB_OK);
Application->Terminate();
}

//lcd
U8*p=DrvLcd_FramePagePoint(1);
for(inti=0;i<this->ClientHeight*2;i++)
{
for(intj=0;j<this->ClientWidth;j++)
{
*p++=i;
}
}

//开始运行程序
Msg_RunInit();
this->Show();
}

//---------------------------------------------------------------------------
//析构
//---------------------------------------------------------------------------
void__fastcallTForm1::MainDestory(void)
{
DriverLib_Destory();
UnsiversalLib_Destory();
BaseLib_Destory();
WinToolsLib_Destory();
}

//---------------------------------------------------------------------------
//主循环
//---------------------------------------------------------------------------
void__fastcallTForm1::MainLoop(void)
{
staticboolbTestLcdMove=false;
staticU8mCounter=0;
staticintmy=0;

BaseLib_MainLoop();
UnsiversalLib_MainLoop();
DriverLib_MainLoop();
WinToolsLib_MainLoop();

if(sSysTimer.bSysTouch)
{
if(++mCounter>=2)
{
//20ms*2时间进入
mCounter=0;

if(bTestLcdMove)
{
my--;
if(my==0)
{
bTestLcdMove=false;
}
}
else{
my++;
if(my==(this->ClientHeight-1))
{
bTestLcdMove=true;
}
}

DrvLcd_FrameOffset(my);
DrvLcd_RefreshToForm(this->Canvas,Rect(0,0,this->ClientWidth,this->ClientHeight));

//向串口发送my位置
CommunicateQueue_Push(psCommunicateQueue_Uart8,(U8)my);
CommunicateQueue_Push(psCommunicateQueue_Uart8,(U8)(my/256));
}
}
}


RainLibMain.cpp:WINDOW调用
//---------------------------------------------------------------------------

#include<vcl.h>
#include"Main.h"
#pragmahdrstop
//---------------------------------------------------------------------------
USEFORM("Main.cpp",Form1);
//---------------------------------------------------------------------------
WINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1),&Form1);
Form1->MainInit();//主初始化

MSGmsg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Form1->MainLoop();//主循环
}
}
Form1->MainDestory();
}
catch(Exception&exception)
{
Application->ShowException(&exception);
}
catch(...)
{
try
{
throwException("");
}
catch(Exception&exception)
{
Application->ShowException(&exception);
}
}
return0;
}
//---------------------------------------------------------------------------


网友评论:总空间:10240KB
已使用:10610KB
剩余:-370KB



网友评论:欢迎加入单片机交流群13883121
让我们在交流中成长吧`````````长期聘请高手


网友评论:实时内核自己作,其他的功能调用windows的。
个人感觉所长这种做法不可取。
呵呵

网友评论:建议所长看看候杰的《深入浅出MFC》,李维的《INSIDEVCL》。
多线程的建议候杰的翻译的一本,名字记不清楚了。
肯定有收获。
所言不妥之处,敬请谅解

网友评论:还深入浅出,俺都深入深出。什么人都有,比如LS的,连俺在做什么都没搞明白乱发言。



网友评论:所长要干吗?

要做说相声里的最好的县长?
还是要做县长里的最好的说相声的?

网友评论:研究太拔高了吧?

网友评论:MCU、WINDOW设计,可以做到极其相似地步,俺要证明这一点。


网友评论:嵌入裸奔比嵌入OS更适合移植:嵌入OS移植到WINDOW上,可能性太小了。

网友评论:我也可以提供一些思路,供大家参考。正好这段时间有空。

网友评论:有什么意义?

网友评论:真有时间啊!

网友评论:下列是利用WINDOW资源实现MCU功能:
串口pcomm实现MCU的串口功能
线程实现MCU精密定时器、中断
窗口实现LCD显示
BITMAP实现LCD的FrameBuffer驱动方式
多媒体定时器实现低等级定时器中断
RTCRTC

其它就是MCU功能,包括程序框架,在WINDOW上运行:
裸奔GUI
消息管理
库函数
串口功能
裸奔数据库(数据管理)
NANDFLASH存储
EEPROM存储


以后可以增加IO功能,使用并口。大家测试按键或做什么简单控制,直接用。
可以请圈圈做个USB模拟功能,接AD、DC什么的。

俺的口号:做到会MCU,就会WINDOW的控制产品设计。


网友评论:用USB口扩展出一个总线或者几个IO不难。软核跑在PC上,外面有几个IO,那不就是有点象硬件仿真器嘛,不同的地方在于CPU是软的...

网友评论:很值得一试。
主要是现在有裸奔程序要移植到WINDOW,所以在干这种大家认为不值得干的事情,呵呵。
通过这件不值得,不划算的移植,可以验证嵌入裸奔架构的科学性和完整性,同时也发现一些缺陷。



网友评论:现在看不懂,占个位置先。希望有一天能读懂。

网友评论:支持所长裸奔,

我也想移植裸奔的GUI到windows上,

所长有啥好的思路么?



网友评论:原来做个两份,一个在mega128上跑480*234的TFT显示,一个是S3C2410上跑800*600,1024*768,两者结构相同,细节不同,俺要整理一下。

网友评论:建立通用的处理程序在那儿能找到啊

网友评论:就是看不太动

浏览:(680)| 评论( 0 )
博文评论

  • 昵 称:
  • 内 容:10~250个字符
  • 验证码: 验证码看不清楚?请点击刷新验证码
  •                      
  • 博文分类

    热点博文

    最新博文

    最新评论

    IC电子元件查询
    IC邮购网电子元件品质保障