打印

最近研究心得

[复制链接]
楼主: 农民讲习所
手机看帖
扫描二维码
随时随地手机跟帖
21

哈哈,越玩越高了!

搞嵌入式系统开发,借签PC机软硬件的理念,是蛮有趣味和实用价值的,PC机的最大优势就在于它的易用性和开放性(由硬件兼容性保证)。

使用特权

评论回复
22
koon| | 2008-1-3 11:14 | 只看该作者

是否这就是华山论剑?

使用特权

评论回复
23
keer_zu| | 2008-1-3 11:19 | 只看该作者

靠,关他是什么剑呢

大家为什么都爱和武狭联系在一起呢?

做技术的不比大狭门

使用特权

评论回复
24
hotpower| | 2008-1-3 11:22 | 只看该作者

俺一直认为10楼说得有道理~~~

使用特权

评论回复
25
农民讲习所|  楼主 | 2008-1-3 11:28 | 只看该作者

hotpower

出让CPU谁都会,不出让CPU就不是谁都能做的。
榨干WINDOW的性能。

使用特权

评论回复
26
农民讲习所|  楼主 | 2008-1-3 11:34 | 只看该作者

游戏和产品

俺发觉相似点真的多。

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

使用特权

评论回复
27
IceAge| | 2008-1-3 11:55 | 只看该作者

MSDN

The GetMessage function retrieves a message from the calling thread's message queue. The function dispatches incoming sent messages until a posted message is available for retrieval. 

Unlike GetMessage, the PeekMessage function does not wait for a message to be posted before returning.

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

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

使用特权

评论回复
28
走南闯北| | 2008-1-3 11:58 | 只看该作者

所长是个高手

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

使用特权

评论回复
29
农民讲习所|  楼主 | 2008-1-3 12:18 | 只看该作者

更新

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

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

使用特权

评论回复
30
IceAge| | 2008-1-3 12:24 | 只看该作者

那是出让了 事件

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

使用特权

评论回复
31
农民讲习所|  楼主 | 2008-1-3 12:37 | 只看该作者

不就是事件在执行吗?

TranslateMessage( &msg );
DispatchMessage( &msg );

使用特权

评论回复
32
liyongzhou| | 2008-1-3 12:59 | 只看该作者

我也来看看

真的不错
学习中

使用特权

评论回复
33
IceAge| | 2008-1-3 22:00 | 只看该作者

还是用 thread 吧。

给你一个封装好的 class, 转到 c++builder 下很容易


#pragma once
#include "Delegate.h"

class CExThread
{
    CWinThread*        m_pThread;
    BOOL            m_bThreadAlive;
    BOOL            m_bStopThread;
    static UINT    Start(LPVOID pParam);

public:
    CDelegate        m_Delegate;

    CExThread(void);
    ~CExThread(void);

    bool Run();
    void Stop();
};


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

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

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

bool CExThread::Run()
{
    m_pThread = ::AfxBeginThread(Start, this);
    m_bThreadAlive = TRUE;
    return m_pThread != NULL;
}


void CExThread::Stop()
{
    if (m_pThread == NULL) return;

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


UINT CExThread::Start(LPVOID pParam)
{
    CExThread* me = (CExThread*) pParam;
    me->m_bThreadAlive = TRUE;
    me->m_Delegate.Invoke(NULL, 0);
    me->m_bThreadAlive = FALSE;
    return 0;
}


DELEGATE.H

#if !defined(_Class_Delegate_)
#define _Class_Delegate_
#pragma once

/*************************************************************************************************
    Warning: Unsafe Code !!!
*************************************************************************************************/

#define HANDLER(function) reinterpret_cast<PTR_CALLBACK>(function)
#define SetEventHandler(instance, function) _SetEventHandler((instance), HANDLER(function))

class CDelegate;
typedef void (CDelegate::*PTR_CALLBACK)(void* sender, DWORD para);

class CDelegate
{
    PTR_CALLBACK        m_pCallBack;
    CDelegate*            m_pInstance;

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

    void _SetEventHandler(void* pInstance, PTR_CALLBACK pCallBack)
    {
        m_pInstance = (CDelegate*) pInstance;
        m_pCallBack = pCallBack;
    }

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

#endif

使用特权

评论回复
34
平常人| | 2008-1-3 22:29 | 只看该作者

说到根上,所有软件系统都是一个大循环

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

使用特权

评论回复
35
农民讲习所|  楼主 | 2008-1-4 07:57 | 只看该作者

俺用TTread类,非常简单。

使用特权

评论回复
36
huangqi412| | 2008-1-4 09:20 | 只看该作者

听天书

使用特权

评论回复
37
农民讲习所|  楼主 | 2008-1-4 09:50 | 只看该作者

俺要把WINDOW当单片机来用

LS的明白了吗?

使用特权

评论回复
38
农民讲习所|  楼主 | 2008-1-4 09:56 | 只看该作者

嵌入裸奔的系统时钟

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

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

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

使用特权

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

当单片机用?那把中断都关了,免得windows帮你调度...

使用特权

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

俺的程序都是封装好的

直接替换驱动就可以了。

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

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

使用特权

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

本版积分规则