打印

最近研究心得

[复制链接]
楼主: 农民讲习所
手机看帖
扫描二维码
随时随地手机跟帖
41
农民讲习所|  楼主 | 2008-1-4 10:24 | 只看该作者 回帖奖励 |倒序浏览

俺的程序都是封装好的

直接替换驱动就可以了。

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

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

使用特权

评论回复
42
农民讲习所|  楼主 | 2008-1-4 10:33 | 只看该作者

中断问题

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

又一心得

使用特权

评论回复
43
computer00| | 2008-1-4 10:45 | 只看该作者

整个虚拟机出来~~~

使用特权

评论回复
44
chunk| | 2008-1-4 10:58 | 只看该作者

把EXE转成BIN,写入一片EPROM,

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

使用特权

评论回复
45
IceAge| | 2008-1-4 22:06 | 只看该作者

看了所长的思路

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

使用特权

评论回复
46
农民讲习所|  楼主 | 2008-1-5 07:51 | 只看该作者

俺是农民俺怕谁

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

使用特权

评论回复
47
农民讲习所|  楼主 | 2008-1-5 07:54 | 只看该作者

俺已经移植完基本库

半天时间。

使用特权

评论回复
48
hotpower| | 2008-1-5 09:12 | 只看该作者

倒塌了~~~"展望七十岁"...

使用特权

评论回复
49
lh_gliet| | 2008-1-5 10:22 | 只看该作者

就那么个破玩意

把石头当宝贝了

使用特权

评论回复
50
农民讲习所|  楼主 | 2008-1-5 10:43 | 只看该作者

LS的兄弟,能不能说说什么是宝贝?

估计你眼里没几个能成宝贝,高手。

使用特权

评论回复
51
菜人菜语| | 2008-1-5 14:54 | 只看该作者

楼主

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

使用特权

评论回复
52
phoenixmy| | 2008-1-5 15:28 | 只看该作者

啥游戏?贴个图上来看看

使用特权

评论回复
53
ocon| | 2008-1-5 19:20 | 只看该作者

低手一愣一愣ing。。。

使用特权

评论回复
54
machunshui| | 2008-1-6 18:48 | 只看该作者

无聊贴

无聊贴

使用特权

评论回复
55
gouki_s| | 2008-1-6 22:20 | 只看该作者

所长大人呀

你也完全可以移植到嵌入式os上
何必呢~~~~~~~~~
何苦呢~~~~~~~~~

使用特权

评论回复
56
农民讲习所|  楼主 | 2008-1-7 14:23 | 只看该作者

在WINDOW上玩MCU的结果

观察串口打开、关闭、发送、接收,可以使用串口侦听软件,比如: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>
#pragma hdrstop

#include "Main.h"

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

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct CommunicateQueue *psCommunicateQueue_Uart8;          //串口1

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

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

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

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

//---------------------------------------------------------------------------
//主初始化
//---------------------------------------------------------------------------
void __fastcall TForm1::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( int i=0; i<this->ClientHeight*2; i++ )
    {
        for( int j=0; j<this->ClientWidth; j++ )
        {
            *p++ = i;           
        }
    }

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

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

//---------------------------------------------------------------------------
//主循环
//---------------------------------------------------------------------------
void __fastcall TForm1::MainLoop( void )
{
    static bool bTestLcdMove = false;
    static U8 mCounter = 0;
    static int my = 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"
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Main.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
        Application->Initialize();
        Application->CreateForm(__classid(TForm1), &Form1);
        Form1->MainInit();            //主初始化

        MSG msg;
        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
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
    return 0;
}
//---------------------------------------------------------------------------

使用特权

评论回复
57
mohanwei| | 2008-1-7 15:01 | 只看该作者

关注

使用特权

评论回复
58
农民讲习所|  楼主 | 2008-1-7 15:04 | 只看该作者

难道21IC的上传文件空间对个人有限制?

总空间: 10240KB 
已使用:  10610KB  
剩余:  -370KB 

使用特权

评论回复
59
农民讲习所|  楼主 | 2008-1-7 15:14 | 只看该作者

BCB项目文件

使用特权

评论回复
60
rainmans| | 2008-1-9 14:57 | 只看该作者

所长的思路是不是类似RTLINUX那种

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则