最近在学Ardence RTX实时系统软件,有很多不懂的地方,下面是一个定时器程序,不太明白?

yaot423   2009-4-14 21:58 楼主
  最近在学Ardence RTX实时系统软件,有很多不懂的地方,下面是一个定时器程序,不太明白?请路过大虾们帮忙看看。
下面是源代码,包括两个文件,一个头文件,一个源文件。如下所示:
//////////////////////////////////////////////////////////////////
//
// RTX_TIME_SLEEP.h - Header file
//
// This file was generated using the RTX 6.5.1 Application Wizard.
//   
//////////////////////////////////////////////////////////////////

#include
#include
#include

// function prototype for periodic timer function
void
RTFCNDCL
TimerHandler(
                void *   nContext
            );
void print();



.c文件
//////////////////////////////////////////////////////////////////
//
// RTX_TIME_SLEEP.c - C file
//
// This file was generated using the RTX 6.5.1 Application Wizard.
//   
//////////////////////////////////////////////////////////////////
   
#include  "rtx_time_sleep.h"
#include "windows.h"
#include "stdio.h"
#include "rtapi.h"



LARGE_INTEGER Period; // Timer period
LARGE_INTEGER StartTime; // Start time of sampling run
ULONG TimerCounter = 0; // Counts entries to timer handler


void
_cdecl
wmain(
       int     argc,
       wchar_t **argv,
       wchar_t **envp
     )

{

    // for periodic timer code
    LARGE_INTEGER  x;   
    HANDLE         hTimer;     // timer handle

    //  RTX periodic timer code:
    //  TO DO: Set default timer period to your desired time.
    //         The period needs to be an even multiple of the HAL
    //         period found in the control panel.
    //         This example uses a period of 500 micro seconds.

    Period.QuadPart = 500;

        if (!RtSetThreadPriority( GetCurrentThread(), RT_PRIORITY_MAX-1))
      printf("WARNING: Can't set to highest RTAPI priority.\n");
    // Create a periodic timer
    if (! (hTimer = RtCreateTimer(
                                  NULL,            // security
                                  0,               // stack size - 0 uses default
                                  TimerHandler,    // timer handler
                                  NULL,            // NULL context (argument to handler)
                                  RT_PRIORITY_MAX, // priority
                                  CLOCK_2) ))      // RTX HAL timer
    {
        //
        // TO DO:  exception code here
        // RtWprintf(L"RtCreateTimer error = %d\n",GetLastError());
        ExitProcess(2);
    }

    if (! RtSetTimerRelative( hTimer,
                              &Period,
                              &Period))

    {
        ExitProcess(2);
    }

        Sleep(50);
   //
   // Stop and delete the timer.
   //
   RtCancelTimer( hTimer, &x);
   RtDeleteTimer( hTimer);

    ExitProcess(0);
}
void
RTFCNDCL
TimerHandler(
              PVOID    unused
            )
{
    // TO DO:  your timer handler code here
        TimerCounter++;
        print();
}

void print()
{
        printf("%d\n",TimerCounter);
}

我的问题是,为什么必须加入Sleep()函数(即上面红色标记代码处),才能让上面创建的定时器函数调用程序调用TimerHandler()函数,不加的话,它就不执行。不像是windows 中的自己的定时器,它会自动每隔设定的时间去执行定时器指定的要调用的函数。大虾们请帮我看看,怎么改,才能让定时器自动调用TimerHandler()函数,就像windows中的一样,还有那个蓝色处的那两个参数是什么意思?理解的不是很清楚。谢谢,不知哪位大虾有没有这方面的资料,例程是最好了,发给我看看,我的邮箱是wliang@emails.bjut.edu.cn   希望路过的大虾们多多指教

回复评论 (14)

to 楼主:
   不执行Sleep(50);主线程就执行下去把定时器删除了,并ExitProcess();
   一般的做法是定义好需要的定时器或线程,使用多线程机制,然后执行SuspendThread(GetCurrentThread())将主线程挂起。(如果线程无法退出,使用Task管理器)。
   MFC与RTX的接口通过其提供的API实现,共享机制一般通过共享内存实现,RTX负责实时计算与硬件控制,Windows实现界面。最新的RTX可以支持VS2005编程,我使用C#,C++,RTX混合编程,C#做界面,C++做桥梁;
   实现硬件中断必须具备几个条件:设备转到RTx下控制,正确挂接中断;Ardence 网站上有Com的源码,改一下就可以用了。
点赞  2010-4-15 01:16
你会rtx吗?你看懂了上面代码吗?
点赞  2009-4-23 10:33
不加 sleep,程序顺序执行就退出了,系统在退出时会自动关闭所有它可以回收的资源,其中就包括定时器。
点赞  2009-4-15 21:37
当然,你这个程序自己就已经删除了定时器。
点赞  2009-4-15 21:38
恩。。路过。。同问。。。upup
点赞  2009-4-15 15:47
那怎么做才能不删除定时器呢,另外想问下,如何才能在将具有rtx功能的程序作成一个界面形式.相当于mfc中的对话形式
点赞  2009-4-20 21:22
实时系统做 MFC 对话框...
莫名其妙...
那只是 wince / embedlinux 嵌入式系统干的事儿...
点赞  2009-4-20 21:44
我说的是系统的界面,还有上面即便没有删除定时器资源,同样不执行定时器回调函数,一次也不执行,要是顺序执行,最少也该执行一次吧,为什么一次也不执行.
点赞  2009-4-22 09:33
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-4-22 09:42
大家有没有用过RTX下串口编程?
我仿照RTX Serial API写的一个程序怎么也进不了中断。
希望大家多交流
点赞  2009-4-30 11:18
我也在学RTX,大虾们有空的探讨下,QQ:281337116~~
点赞  2009-7-27 09:18
RTX可以做成界面的,我已经做成功了的。如果你的CPU和显卡够快,几个ms绘一次图是可以保证没有误差的。

如果不用Sleep,你的程序就会顺序执行并结束了。你可以在WIN32或MFC下创建一个线程,在线程里再创建Timer,记住你的Timer Handle要设成全局的,不然又是一下就完了。

另外在这个程序里的定时时间设的也不对,RTX的最小时钟周期是100ns(CLOCK2),所以如果要设一个500us的定时间隔,period应该是5000,而不是500。
RTX的最小定时周期是100us,你设成500相当于50us,当然不执行了。
点赞  2009-8-3 17:13
Ardence RTX交流与学习!
欢迎各位加入,一起学习交流!
QQ群:2689390
点赞  2009-8-11 16:49
LZ
没有认真看rtx生成的代码,创建定时器后,不sleep怎么都不用50us都执行完整个程序并在最后delete了定时器了

rtx是没有界面的,可以使用共享区进行进程间通信,具体多看看rtx提供的例程
点赞  2010-2-5 16:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复