原创 在windML上移植ucgui和vxworks延时小结

2006-9-26 22:56 6603 11 18 分类: MCU/ 嵌入式

    最近在vxworks上移植ucgui。也许有些人会问不是有zinc吗?为什么还要自己去移植呢?据说(不是官方的消息),风河公司在除了vxworks5.5以后抛弃了zinc,也就是说vxworks5.5以及以上的版本已经不支持zinc了。我也试了,不行,装不上。要想更好的处理图形就只好自己移植了。


   我是这样做的:首先,将windML配置好然后编译,在能跑他自带ugldemo之后,利用找到往屏幕帖图的地址0x40800000(我用的工控板符合vesa标准)。这样我们就可以将所有的图形按位图的形式贴到屏幕上去了。当然将上层的一大堆东西转化成位图还要看看哦。然后就是鼠标,键盘等的消息了。无非就是将数据结构转化一下。不过发现有些键的键值(esc,enter等)找不到,只好把每个键值截获下来自己定义宏.....


工作还在进行中,以后再慢慢的发吧!


2006.9.28


今天一早上都在搞定时器,vxworks的看门狗定时器是定时一次到时间就结束,而且时间到触发一个函数。现在我要将定时器做成循环定时而且要触发一个消息。这样做就可以在我的主程序里查询所有的消息(包括定时,键盘,鼠标,系统消息等),便于对各个事件的管理。我做完以后会将我的程序发到这里。有兴趣的一起讨论啊!


下午做的定时器发现不能循环定时,每次定时完以后,再掉开启函数就不再走了!!!单步往下走也看不出来,不知道为什么?郁闷啊!!!


2006.9.29


在网上看见一篇很好的帖子,那上来跟大家分享。帖子中也有我的一些理解。希望大家能理解的更深刻:)


   编程过程中,出于需要,大家或多或少要用到定时/延时。VxWorks下提供了几种定时/延时机制,根据收集的一些资料和VxWorks相关文档,在学习和上机实验的基础上,对它们的使用以及我所遇到的问题做一个总结,希望对大家能有所帮助。不正确之处,恳请斧正。
1 taskDelay
   taskdelay()提供了一个简单的任务睡眠机制,也常用于需要定时/延时机制的应用中。它的格式是STATUS taskDelay(int ticks /* number of ticks to delay task */),可以看出使用该函数实现延时的单位为tick(一般系统中一个tick都是ms级的)(编程的时候如果想用毫秒可以这样:#define TICK_MS (1000/SYS_CLK_RATE)/*每tick的毫秒数*/)。在VxWorks下可以这样使用taskDelay()函数:(利用函数sysClkRateSet()可以改变系统的时钟速率)。在POSIX中有一个与taskdelay()相对应的函数――nanosleep()(下文中有介绍)。这两个函数仅仅是延时单位不同,效果是相同的。
   利用taskdelay(),可以将调用的任务移动到具有相同优先级的就绪队列尾部。特别的,可以通过调用taskdelay(0),将cpu交给系统中其他相同优先级的任务。延时为0的调用只能用于taskdelay()中,nanosleep()认为这种调用是错误的。
   taskdelay()会导致调用的任务在指定的延时期间(以ticks计数)放弃cpu,使任务处于DELAY状态(因此,其不能用于中断服务程序中)。通常其受到任务调度的影响,但在等待一些与中断无关联的外部条件时,其是有用的。如果调用的任务受到一个信号,指出其没有被阻塞或被忽略,taskDelay()将返回ERROR,并在信号处理程序运行后设置errno为EINTR。
2 WatchDog
   VxWorks提供了一个看门狗定时器(watchdog timer)机制,利用提供的函数,任何任务都可以创建一个看门狗定时器,经过指定的延时后,实现在系统时钟ISR的上下文中运行指定的程序。在VxWorks中,看门狗定时器作为系统时钟中断服务程序的一部分来维护。因此,与看门狗定时器相联系的函数运行在系统时钟中断级。在使用看门狗定时器实现定时/延时时,经过指定的时间,应用程序中断在系统时钟中断优先级上面,然而,如果内核不能立即执行这个中断服务程序,这个任务就被排队到tExcTask 工作队列中去,处在 tExcTask 工作队列中的任务的优先级为 tExcTask (通常是 0)。对于使用看门狗定时器的中断服务程序,仍然必须遵守一般的ISR所要遵守的规则。
  通过wdCreate( )可以创建一个看门狗定时器。调用wdStart()启动定时器,延时参数以tick为单位,同时还要指定定时完成后要调用的程序。如果你的应用程序需要多个看门狗函数,使用wdCreate( )为每个需求产生独立的看门狗ID。因为对于给定的看门狗ID,只有最近的wdStart()有效。在指定的tick计数到达之前,要取消一个看门狗计时器,可以调用wdCancel()实现。
   每调用一次wdStart(),看门狗定时器只执行一次。对于一些要求周期性执行的应用程序。要获得该效果,定时器函数本身必须通过递归调用wdStart()来重新启动定时器。(目前我还没搞定,总是定时一次就退出了,找到原因再发上去)利用看门狗定时器,调用的任务不会被阻塞:因为wdStart()调用是立即返回的。使用该方法实现延时,关联函数所受限制太大,好多系统调用不可用,郁闷也…
3 timer(POSIX)
3.1 timer
   VxWorks提供IEEE的POSIX 1003.1b标准定时器接口。使用这种定时器机制,在指定的时间间隔后,任务向自身发信号。定时器是建立在时钟和信号之上。程序可以创建、设置和删除一个定时器。当定时器到达期限,将向任务发送默认的信号(SIGALRM)。
使用timer的一般流程:
/* 创建定时器 */
if(timer_create(CLOCK_REALTIME,0,&mytimer)==ERROR)
return(ERROR);
/* 用户程序与定时器相连 */
if(timer_connect(mytimer,(VOIDFUNCPTR)my_handler,0)==ERROR)
return(ERROR);
/* 设置定时器值 */
if(timer_settime(mytimer,0,&value,0)==ERROR)
    return(ERROR);
/* 一段延时 */
。。。。。。
/* 删除定时器 */
if (timer_delete(mytimer)==ERROR)
    return(ERROR);
    在使用定时器时,容易忽略定时结束后任务向自身发信号这一处理步骤。即在定时结束后,要向创建定时器的任务发送信号,如果此时任务已不存在,定时程序将不能执行,提示的错误是“interrupt: timerWdHandler : kill failed (timer=******,tid=******,errno=0x16)”(有一个《关于timer(定时器)中几个函数的疑问!》帖子,其中提到该问题)。在上机时,我设置了一个较长时间的定时器,在创建定时器任务中使用相等的延时操作(taskDelay()、nanosleep()随便哪个都行),此时程序正常运行,定时结束后正确地执行关联到定时器的程序;再次运行,在定时结束前,我在shell下删除掉创建定时器的任务,定时结束后又出现上述的错误。因此,使用POSIX定时器时,一定要注意不能让创建定时器的任务在触发定时程序之前结束,否则。。。准备reset吧
3.2 nanosleep()
    函数nanosleep()的功能与VxWorks提供的taskDelay()类似,nanosleep()允许指定以秒和纳秒为单位的定时/延时时间,taskDelay()以tick作为定时/延时时间。两者只是延时单位不同,而不是精度不同,都由系统时钟频率决定。与taskDelay()一样,使用nanosleep()实现定时/延时的任务也受调度的影响,在实际操作中一定要注意这一点。使用nanosleep()时,定时参数使用的是结构itimerspe中的it_value,可以指定it_value中的秒和纳秒为定时/延时时间。函数的使用较为简单,不再赘述。
4 其它
    使用带有超时值timeout的msgQReceive()、semTask()也可以实现延时(有使用这种方式来进行延时的人吗?不有吗?有吗?不有吗?有吗?不有吗?。。。)。
    该方法将阻塞任务,让其等待超时,利用该方法实现延时可以使用函数semTask(…,timeout)、msgQReceive(…,…,…,timeout)。调用任务被放进阻塞队列中(注意,使用semTask和msgQReceive时,time的值不能是NO_WAIT,如果指定NO_WAIT的话,将立即返回,也就达不到延时的效果了^_^)。如果你希望任务不被阻塞,还能继续执行,sorry,此法不行,使用看门狗吧。
当阻塞的任务满足继续执行的条件后,将被放入ready队列。这里要注意的是,任务被放入ready队列并不意味着立刻就被执行。想想看,如果比它高优先级的任务正在占用资源,或也在等资源,那么…延时将是不确定的。



2006.9.30


今天我把定时器的程序减到最精练,终于可以循环定时了。估计是因为调用了某些系统的资源引起任务的阻塞。明天将程序发上来.....

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

shenyandetongxing_551209819 2007-3-29 17:28

是啊:)那我要去你的网站学习学习啊

用户1144612 2007-3-29 12:29

你的师兄叫杨天池吧,欢迎你到中国电子开发网做客? http://www.cedn.cn

用户1144612 2007-3-29 11:11

你的师兄叫杨天池吧,欢迎你到中国电子开发网做客

www.cedn.cn

shenyandetongxing_551209819 2006-11-26 22:03

小弟的老板做了一个自己的GUI,呵呵有的地方借鉴了ucgui的思想但可能有的功能没有ucgui强大但是所有的东西都是自己的,我们是做GIS用的。现在正让我往Vxworks上移植,还没有完全移植通。有的东西我还没有理解,不过感觉其实GUI跟OS的接口并不多。大家多交流啊,有什么好帖子发上来哦!

用户64375 2006-11-25 22:39

在VxWork上,不只有WindML可用的,zinc是的确被放弃掉了,WindRiver新的方案是采用加拿大的Tilcon,但成本不是一般的高,动辄3W左右的美刀还是吓退了一群客户的。

GUI,本质来讲,和OS没有特别的关联,其他的GUI组建完全可以PORTING到VxWorks上来,yanshen兄感兴趣的话,可以交流一下。虽然这GUI也不是free,但完全是一个很好的方案,价格自然也是很有竞争力。

用户31586 2006-10-9 16:06

楼主,我现在也在被vxworks定时器的问题困扰,不知楼主能不能将定时器的程序发给我一份让我学习学习,我的邮箱:yongmeizhao1980@yahoo.com.cn,深表感谢!

用户1053025 2006-9-27 13:06

UP! 投票!支持!
相关推荐阅读
shenyandetongxing_551209819 2010-02-25 21:34
MyEclipse 建立第一个工程
1.打开MyEclipse--新建个工程File--New--Project--WebProject 2.在ProjectName中输入hello--Finish 3.然后为工程添加struts框架,...
shenyandetongxing_551209819 2010-02-06 22:42
人力资源管理软件(技术储备)
JAVA的SSH开发框架Struts、Spring、Hibernate在各层的作用1、Struts 负责 web层ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理...
shenyandetongxing_551209819 2010-02-06 02:51
个人资源管理软件(需求)
先提提需求吧,这是重中之重,这不是简单就能完成的,需要不断的修改和完善。既然是个人资源管理就要首先搞清楚个人资源包括哪些部分:1  人脉资源,也就是我们常说的关系,人是社会型动物就不可能生活在真空里,...
shenyandetongxing_551209819 2010-02-06 02:33
HR软件设计开始(关注个人资源管理与分析)
最近对HR很感兴趣,上网搜了一下,HR的软件也不少,其中风头正劲的用友公司做的挺多,但是看了看都是针对企业级的。但自己平常的工作和进步帮助不大。想整一个关于人力资源、人际关系进行总结、分析的软件,让自...
shenyandetongxing_551209819 2010-02-06 02:30
对HR和B/S模式的东西感兴趣
最近对HR很感兴趣,上网搜了一下,HR的软件也不少,其中风头正劲的用友公司做的挺多,但是看了看都是针对企业级的。但自己平常的工作和进步帮助不大。想整一个关于人力资源、人际关系进行总结、分析的软件,让自...
shenyandetongxing_551209819 2008-10-01 16:18
由于工作原因,改行!!
已经好久没有上我的博客了,还有很多朋友支持我,很欣慰:)现在由于工作原因很长一段时间内将挥泪告别嵌入式。现在如果有做PKI或PMI的跟我一起交流啊:)...
我要评论
7
11
关闭 站长推荐上一条 /3 下一条