同事遇到的难题,大家看看(上代码了,keil软仿真)。。。

[复制链接]
 楼主| 渤海三叠浪 发表于 2013-1-18 20:43 | 显示全部楼层 |阅读模式
本帖最后由 渤海三叠浪 于 2013-1-20 21:56 编辑
  1. 看到后面有大侠回复,还想说明一点:这个题目最终目标是在稳定前提下,让应用者用起来简单最为最终目标。当然不让用链表啥的来实现,因为最终是要转化成ST语言的。



我这个描述看样还是有点问题,应该是按住A,而不是按一下A。就是按住A的时候,B,C是弹起的。按住B的时候A,C是弹起的。

====================================================================



安装keil软件 可以直接软仿真


------------------------------------




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 渤海三叠浪 发表于 2013-1-18 20:49 | 显示全部楼层
哪位要是实在闲着没啥事 可以试着实现一把。
要求尽量写成通用函数。
icecut 发表于 2013-1-18 21:54 | 显示全部楼层
简单.你先把你自己写的放出来,让大家给你评点一下.然后我给你个通用的函数.
1.过程个数随便加.
2.延迟时间随便定.可动态配置.

确切说你这个东西只能应用在小家电上...比如电磁炉,简单控制.精度不高
 楼主| 渤海三叠浪 发表于 2013-1-18 22:27 | 显示全部楼层
你这主意不错,顺便看看有没有bug。我这电脑可能没有,改天上传
NE5532 发表于 2013-1-18 22:34 | 显示全部楼层
就是按了按钮,其他过程全部取消,执行当前的,定时器开1S定时,过程建表,调参数执行,楼主纠结在哪里了??

评论

就是,问题是系统跑上OS了;不上状态机有些可惜;  发表于 2013-1-21 01:02
ayb_ice 发表于 2013-1-19 07:59 | 显示全部楼层
用个变量当计数器,当成状态机,以较高的分辨率计数即可
icecut 发表于 2013-1-19 09:37 | 显示全部楼层
NE5532 发表于 2013-1-18 22:34
就是按了按钮,其他过程全部取消,执行当前的,定时器开1S定时,过程建表,调参数执行,楼主纠结在哪里了? ...

没os的取消,注定是一件不能通用的事情.没事就要下桩判断信号是不是还为真
NE5532 发表于 2013-1-19 09:46 | 显示全部楼层
从解决问题的角度来看了,如果楼主只有一个PIC12,怎么上OS?

评分

参与人数 1威望 +4 收起 理由
渤海三叠浪 + 4 很给力!

查看全部评分

icecut 发表于 2013-1-19 15:33 | 显示全部楼层
NE5532 发表于 2013-1-19 09:46
从解决问题的角度来看了,如果楼主只有一个PIC12,怎么上OS?

所以说,他要求通用就是无理要求
NE5532 发表于 2013-1-19 15:35 | 显示全部楼层
icecut 发表于 2013-1-19 15:33
所以说,他要求通用就是无理要求

他只是自己不会分析问题罢了,真的是PIC,几十行汇编都搞定了。

评论

几十行?开什么国际玩笑?搞个我看看!!!  发表于 2013-1-19 20:23
ZOUWEN1 发表于 2013-1-19 16:26 | 显示全部楼层
这个状态机简单,根本不用上OS.实现代码应在2K左右
明月小厨 发表于 2013-1-19 16:41 | 显示全部楼层
状态机都不需要,直接进入;只有一层状态,没必要状态机;
icecut 发表于 2013-1-19 17:01 | 显示全部楼层
ZOUWEN1 发表于 2013-1-19 16:26
这个状态机简单,根本不用上OS.实现代码应在2K左右

2k已经不少代码了...我就想三五十行搞定
zhouxinke 发表于 2013-1-19 17:33 | 显示全部楼层
借用
李富贵 发表于 2013-1-19 18:15 | 显示全部楼层
  1. #include <rtx51tny.h> /* RTX-51 tiny functions & defines */

  2. /******************************************************************************/
  3. /* Task 0 'job0': RTX-51 tiny starts execution with task 0 */
  4. /******************************************************************************/
  5. job0 () _task_ 0 {
  6. os_create_task (1); /* start task 1 */
  7. os_create_task (2); /* start task 2 */
  8. os_create_task (3); /* start task 3 */
  9. os_create_task (4); /* start task 4 */

  10. while (1) { /* endless loop */
  11. if(keyA==PUSHED){
  12. os_create_task (1); /* start task 1 */
  13. os_delete_task (2); /* stop task 2 */
  14. os_delete_task (3); /* stop task 3 */
  15. os_delete_task (4); /* stop task 4 */
  16. }
  17. if(keyB==PUSHED){
  18. os_delete_task (1); /* stop task 1 */
  19. os_create_task (2); /* start task 2 */
  20. os_delete_task (3); /* stop task 3 */
  21. os_delete_task (4); /* stop task 4 */
  22. }
  23. if(keyC==PUSHED){
  24. os_delete_task (1); /* stop task 1 */
  25. os_delete_task (2); /* stop task 2 */
  26. os_create_task (3); /* start task 3 */
  27. os_delete_task (4); /* stop task 4 */
  28. }
  29. if(keyD==PUSHED){
  30. os_delete_task (1); /* stop task 1 */
  31. os_delete_task (2); /* stop task 2 */
  32. os_delete_task (3); /* stop task 3 */
  33. os_create_task (4); /* start task 4 */
  34. }
  35. os_wait (K_TMO, 5, 0); /* wait for timeout: 5 ticks */
  36. }
  37. }

  38. /******************************************************************************/
  39. /* Task 1 'job1': RTX-51 tiny starts this task with os_create_task (1) */
  40. /******************************************************************************/
  41. job1 () _task_ 1 {
  42. while (1) { /* endless loop */
  43. os_wait (K_TMO, 100, 0); /* wait for timeout: 100 ticks = 1s */
  44. toogle_light(1);
  45. os_wait (K_TMO, 200, 0); /* wait for timeout: 200 ticks = 2s */
  46. toogle_light(2);
  47. os_wait (K_TMO, 300, 0); /* wait for timeout: 300 ticks = 3s */
  48. toogle_light(3);
  49. }
  50. }

  51. /******************************************************************************/
  52. /* Task 2 'job2': RTX-51 tiny starts this task with os_create_task (2) */
  53. /******************************************************************************/
  54. job2 () _task_ 2 {
  55. while (1) { /* endless loop */
  56. os_wait (K_TMO, 600, 0); /* wait for timeout: 100 ticks = 1s */
  57. toogle_light(4);
  58. os_wait (K_TMO, 100, 0); /* wait for timeout: 200 ticks = 2s */
  59. toogle_light(5);
  60. os_wait (K_TMO, 200, 0); /* wait for timeout: 300 ticks = 3s */
  61. toogle_light(6);
  62. }
  63. }

  64. /******************************************************************************/
  65. /* Task 3 'job3': RTX-51 tiny starts this task with os_create_task (3) */
  66. /******************************************************************************/
  67. job3 () _task_ 3 {
  68. while (1) { /* endless loop */
  69. os_wait (K_TMO, 100, 0); /* wait for timeout: 100 ticks = 1s */
  70. toogle_light(7);
  71. os_wait (K_TMO, 200, 0); /* wait for timeout: 200 ticks = 2s */
  72. toogle_light(8);
  73. os_wait (K_TMO, 300, 0); /* wait for timeout: 300 ticks = 3s */
  74. toogle_light(9);
  75. }
  76. }

  77. /******************************************************************************/
  78. /* Task 4 'job4': RTX-51 tiny starts this task with os_create_task (3) */
  79. /******************************************************************************/
  80. job3 () _task_ 4 {
  81. while (1) { /* endless loop */
  82. os_wait (K_TMO, 600, 0); /* wait for timeout: 600 ticks = 6s */
  83. toogle_light(10);
  84. os_wait (K_TMO, 800, 0); /* wait for timeout: 800 ticks = 8s */
  85. toogle_light(11);
  86. os_wait (K_TMO, 1200, 0); /* wait for timeout: 1200 ticks = 12s */
  87. toogle_light(12);
  88. }
  89. }

评论

敢放代码就是高人 呵呵 你这OS我不熟,K_TM0是啥我也不太清楚。 不过我觉得你这60.os_wait (K_TMO, 600, 0); 是不是个死延时啊。 大家都天天批判啊  发表于 2013-1-19 21:12

评分

参与人数 1威望 +5 收起 理由
dong_abc + 5 第一反应就是这个。

查看全部评分

 楼主| 渤海三叠浪 发表于 2013-1-19 19:11 来自手机 | 显示全部楼层
明月小厨 发表于 2013-1-19 16:41
状态机都不需要,直接进入;只有一层状态,没必要状态机;

帅哥'你吹牛吹昏了吧?.

评论

估计这是早年的舞台灯光设备,各种灯光闪方案,以前都是用一粒PROM搞掂;  发表于 2013-1-21 00:47
有4个过程,很明确的事情;要什么状态机?你懂不懂状态机是什么?  发表于 2013-1-21 00:36
 楼主| 渤海三叠浪 发表于 2013-1-19 20:43 | 显示全部楼层
icecut 发表于 2013-1-18 21:54
简单.你先把你自己写的放出来,让大家给你评点一下.然后我给你个通用的函数.
1.过程个数随便加.
2.延迟时间 ...

我代码放了  
icecut 发表于 2013-1-19 21:24 | 显示全部楼层
  1. // 全局条件.
  2. int gflag = 0;

  3. // 一个特殊的延时函数.这里先用状态参数.以后考虑使用回调函数
  4. // 每个函数必须使用此函数延时!!
  5. bool delay(int i, int delay)
  6. {
  7.         for(int d = 0; d < delay; d++)
  8.                 if(gflag != i)
  9.                         return false;
  10.         return true;
  11. }

  12. #define TASK1 1
  13. void task1()
  14. {
  15.         bool bRet;

  16.         // 做第一件事
  17.         bRet = delay(TASK1, 6000);
  18.         if (!bRet)        return;

  19.         // 做第二件事
  20.         bRet = delay((TASK1, 2000);
  21.         if (!bRet)        return;
  22.         // 做第三件事....
  23. }
  24. int _tmain(int argc, _TCHAR* argv[])
  25. {
  26.         while(1)
  27.         {
  28.                 switch (gflag)
  29.                 {
  30.                 case TASK1:
  31.                 task1();
  32.                         break;
  33.                 }
  34.         }
  35.         return 0;
  36. }

评论

你这是死等,for(int d = 0; d < delay; d++),还得干别的事呢。 你这程序不行,不通用。得重写。  发表于 2013-1-20 22:01
李富贵 发表于 2013-1-19 21:32 | 显示全部楼层
15楼放的是rtx51tny2,很简单的一个rtos,占用系统资源极少,我认为唯一值得在51上面跑的rtos。Keil的所有版本里面都有这个小RTOS。另外,在RTOS里面,wait for timeout是把系统控制权交给os,让os在适当时间再把控制权交还给task的意思。如果你用了rtos,第一个感觉应该是可以放心随便用系统提供的delay了,因为这跟裸奔时代delay就是死等的概念完全不同。

评论

可以这样理解 OS用1个单片机模仿5个单片机 每个都在死等  发表于 2013-1-19 22:29
呵呵 大侠 我明白你的意思。说不同也对。说同也对。说得角度不一样罢了  发表于 2013-1-19 21:48

评分

参与人数 1威望 +2 收起 理由
王奉瑾 + 2

查看全部评分

 楼主| 渤海三叠浪 发表于 2013-1-19 23:03 | 显示全部楼层
icecut 发表于 2013-1-19 15:33
所以说,他要求通用就是无理要求

哈哈 睡觉了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

637

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部