打印

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

[复制链接]
4286|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 渤海三叠浪 于 2013-1-20 21:56 编辑
看到后面有大侠回复,还想说明一点:这个题目最终目标是在稳定前提下,让应用者用起来简单最为最终目标。当然不让用链表啥的来实现,因为最终是要转化成ST语言的。 



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

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



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


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




SY KEIL 简单.rar

35.45 KB

相关帖子

沙发
渤海三叠浪|  楼主 | 2013-1-18 20:49 | 只看该作者
哪位要是实在闲着没啥事 可以试着实现一把。
要求尽量写成通用函数。

使用特权

评论回复
板凳
icecut| | 2013-1-18 21:54 | 只看该作者
简单.你先把你自己写的放出来,让大家给你评点一下.然后我给你个通用的函数.
1.过程个数随便加.
2.延迟时间随便定.可动态配置.

确切说你这个东西只能应用在小家电上...比如电磁炉,简单控制.精度不高

使用特权

评论回复
地板
渤海三叠浪|  楼主 | 2013-1-18 22:27 | 只看该作者
你这主意不错,顺便看看有没有bug。我这电脑可能没有,改天上传

使用特权

评论回复
5
NE5532| | 2013-1-18 22:34 | 只看该作者
就是按了按钮,其他过程全部取消,执行当前的,定时器开1S定时,过程建表,调参数执行,楼主纠结在哪里了??

使用特权

评论回复
评论
明月小厨 2013-1-21 01:02 回复TA
就是,问题是系统跑上OS了;不上状态机有些可惜; 
6
ayb_ice| | 2013-1-19 07:59 | 只看该作者
用个变量当计数器,当成状态机,以较高的分辨率计数即可

使用特权

评论回复
7
icecut| | 2013-1-19 09:37 | 只看该作者
NE5532 发表于 2013-1-18 22:34
就是按了按钮,其他过程全部取消,执行当前的,定时器开1S定时,过程建表,调参数执行,楼主纠结在哪里了? ...

没os的取消,注定是一件不能通用的事情.没事就要下桩判断信号是不是还为真

使用特权

评论回复
8
NE5532| | 2013-1-19 09:46 | 只看该作者
从解决问题的角度来看了,如果楼主只有一个PIC12,怎么上OS?

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
渤海三叠浪 + 4 很给力!
9
icecut| | 2013-1-19 15:33 | 只看该作者
NE5532 发表于 2013-1-19 09:46
从解决问题的角度来看了,如果楼主只有一个PIC12,怎么上OS?

所以说,他要求通用就是无理要求

使用特权

评论回复
10
NE5532| | 2013-1-19 15:35 | 只看该作者
icecut 发表于 2013-1-19 15:33
所以说,他要求通用就是无理要求

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

使用特权

评论回复
评论
渤海三叠浪 2013-1-19 20:23 回复TA
几十行?开什么国际玩笑?搞个我看看!!! 
11
ZOUWEN1| | 2013-1-19 16:26 | 只看该作者
这个状态机简单,根本不用上OS.实现代码应在2K左右

使用特权

评论回复
12
明月小厨| | 2013-1-19 16:41 | 只看该作者
状态机都不需要,直接进入;只有一层状态,没必要状态机;

使用特权

评论回复
13
icecut| | 2013-1-19 17:01 | 只看该作者
ZOUWEN1 发表于 2013-1-19 16:26
这个状态机简单,根本不用上OS.实现代码应在2K左右

2k已经不少代码了...我就想三五十行搞定

使用特权

评论回复
14
zhouxinke| | 2013-1-19 17:33 | 只看该作者
借用

使用特权

评论回复
15
李富贵| | 2013-1-19 18:15 | 只看该作者
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */

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

while (1) { /* endless loop */
if(keyA==PUSHED){
os_create_task (1); /* start task 1 */
os_delete_task (2); /* stop task 2 */
os_delete_task (3); /* stop task 3 */
os_delete_task (4); /* stop task 4 */
}
if(keyB==PUSHED){
os_delete_task (1); /* stop task 1 */
os_create_task (2); /* start task 2 */
os_delete_task (3); /* stop task 3 */
os_delete_task (4); /* stop task 4 */
}
if(keyC==PUSHED){
os_delete_task (1); /* stop task 1 */
os_delete_task (2); /* stop task 2 */
os_create_task (3); /* start task 3 */
os_delete_task (4); /* stop task 4 */
}
if(keyD==PUSHED){
os_delete_task (1); /* stop task 1 */
os_delete_task (2); /* stop task 2 */
os_delete_task (3); /* stop task 3 */
os_create_task (4); /* start task 4 */
}
os_wait (K_TMO, 5, 0); /* wait for timeout: 5 ticks */
}
}

/******************************************************************************/
/* Task 1 'job1': RTX-51 tiny starts this task with os_create_task (1) */
/******************************************************************************/
job1 () _task_ 1 {
while (1) { /* endless loop */
os_wait (K_TMO, 100, 0); /* wait for timeout: 100 ticks = 1s */
toogle_light(1);
os_wait (K_TMO, 200, 0); /* wait for timeout: 200 ticks = 2s */
toogle_light(2);
os_wait (K_TMO, 300, 0); /* wait for timeout: 300 ticks = 3s */
toogle_light(3);
}
}

/******************************************************************************/
/* Task 2 'job2': RTX-51 tiny starts this task with os_create_task (2) */
/******************************************************************************/
job2 () _task_ 2 {
while (1) { /* endless loop */
os_wait (K_TMO, 600, 0); /* wait for timeout: 100 ticks = 1s */
toogle_light(4);
os_wait (K_TMO, 100, 0); /* wait for timeout: 200 ticks = 2s */
toogle_light(5);
os_wait (K_TMO, 200, 0); /* wait for timeout: 300 ticks = 3s */
toogle_light(6);
}
}

/******************************************************************************/
/* Task 3 'job3': RTX-51 tiny starts this task with os_create_task (3) */
/******************************************************************************/
job3 () _task_ 3 {
while (1) { /* endless loop */
os_wait (K_TMO, 100, 0); /* wait for timeout: 100 ticks = 1s */
toogle_light(7);
os_wait (K_TMO, 200, 0); /* wait for timeout: 200 ticks = 2s */
toogle_light(8);
os_wait (K_TMO, 300, 0); /* wait for timeout: 300 ticks = 3s */
toogle_light(9);
}
}

/******************************************************************************/
/* Task 4 'job4': RTX-51 tiny starts this task with os_create_task (3) */
/******************************************************************************/
job3 () _task_ 4 {
while (1) { /* endless loop */
os_wait (K_TMO, 600, 0); /* wait for timeout: 600 ticks = 6s */
toogle_light(10);
os_wait (K_TMO, 800, 0); /* wait for timeout: 800 ticks = 8s */
toogle_light(11);
os_wait (K_TMO, 1200, 0); /* wait for timeout: 1200 ticks = 12s */
toogle_light(12);
}
}

使用特权

评论回复
评论
渤海三叠浪 2013-1-19 21:12 回复TA
敢放代码就是高人 呵呵 你这OS我不熟,K_TM0是啥我也不太清楚。 不过我觉得你这60.os_wait (K_TMO, 600, 0); 是不是个死延时啊。 大家都天天批判啊 
评分
参与人数 1威望 +5 收起 理由
dong_abc + 5 第一反应就是这个。
16
渤海三叠浪|  楼主 | 2013-1-19 19:11 | 只看该作者
明月小厨 发表于 2013-1-19 16:41
状态机都不需要,直接进入;只有一层状态,没必要状态机;

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

使用特权

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

我代码放了  

使用特权

评论回复
18
icecut| | 2013-1-19 21:24 | 只看该作者
// 全局条件.
int gflag = 0;

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

#define TASK1 1
void task1()
{
        bool bRet;

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

        // 做第二件事
        bRet = delay((TASK1, 2000);
        if (!bRet)        return;
        // 做第三件事....
}
int _tmain(int argc, _TCHAR* argv[])
{
        while(1)
        {
                switch (gflag)
                {
                case TASK1:
                task1();
                        break;
                }
        }
        return 0;
}

使用特权

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

使用特权

评论回复
评论
渤海三叠浪 2013-1-19 22:29 回复TA
可以这样理解 OS用1个单片机模仿5个单片机 每个都在死等 
渤海三叠浪 2013-1-19 21:48 回复TA
呵呵 大侠 我明白你的意思。说不同也对。说同也对。说得角度不一样罢了 
评分
参与人数 1威望 +2 收起 理由
王奉瑾 + 2
20
渤海三叠浪|  楼主 | 2013-1-19 23:03 | 只看该作者
icecut 发表于 2013-1-19 15:33
所以说,他要求通用就是无理要求

哈哈 睡觉了

使用特权

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

本版积分规则

62

主题

637

帖子

1

粉丝