最近在学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 希望路过的大虾们多多指教
to 楼主:
不执行Sleep(50);主线程就执行下去把定时器删除了,并ExitProcess();
一般的做法是定义好需要的定时器或线程,使用多线程机制,然后执行SuspendThread(GetCurrentThread())将主线程挂起。(如果线程无法退出,使用Task管理器)。
MFC与RTX的接口通过其提供的API实现,共享机制一般通过共享内存实现,RTX负责实时计算与硬件控制,Windows实现界面。最新的RTX可以支持VS2005编程,我使用C#,C++,RTX混合编程,C#做界面,C++做桥梁;
实现硬件中断必须具备几个条件:设备转到RTx下控制,正确挂接中断;Ardence 网站上有Com的源码,改一下就可以用了。
不加 sleep,程序顺序执行就退出了,系统在退出时会自动关闭所有它可以回收的资源,其中就包括定时器。
那怎么做才能不删除定时器呢,另外想问下,如何才能在将具有rtx功能的程序作成一个界面形式.相当于mfc中的对话形式
实时系统做 MFC 对话框...
莫名其妙...
那只是 wince / embedlinux 嵌入式系统干的事儿...
我说的是系统的界面,还有上面即便没有删除定时器资源,同样不执行定时器回调函数,一次也不执行,要是顺序执行,最少也该执行一次吧,为什么一次也不执行.
大家有没有用过RTX下串口编程?
我仿照RTX Serial API写的一个程序怎么也进不了中断。
希望大家多交流
我也在学RTX,大虾们有空的探讨下,QQ:281337116~~
RTX可以做成界面的,我已经做成功了的。如果你的CPU和显卡够快,几个ms绘一次图是可以保证没有误差的。
如果不用Sleep,你的程序就会顺序执行并结束了。你可以在WIN32或MFC下创建一个线程,在线程里再创建Timer,记住你的Timer Handle要设成全局的,不然又是一下就完了。
另外在这个程序里的定时时间设的也不对,RTX的最小时钟周期是100ns(CLOCK2),所以如果要设一个500us的定时间隔,period应该是5000,而不是500。
RTX的最小定时周期是100us,你设成500相当于50us,当然不执行了。
Ardence RTX交流与学习!
欢迎各位加入,一起学习交流!
QQ群:2689390
LZ
没有认真看rtx生成的代码,创建定时器后,不sleep怎么都不用50us都执行完整个程序并在最后delete了定时器了
rtx是没有界面的,可以使用共享区进行进程间通信,具体多看看rtx提供的例程