搜索
bottom↓
12
返回列表 发新帖
楼主: mdb3

分享:用10行代码实现的C语言状态机,支持超时机制

  [复制链接]

出0入0汤圆

发表于 2015-1-31 14:56:36 | 显示全部楼层
看不懂,汗。。学习了

出0入0汤圆

发表于 2015-1-31 19:21:18 | 显示全部楼层
没学到这么个水平,看不懂,先下载收藏。

出0入0汤圆

发表于 2015-1-31 20:41:07 | 显示全部楼层
谢谢楼主分享!!!

出0入4汤圆

发表于 2015-2-1 00:10:51 来自手机 | 显示全部楼层
这种思路很不错

出0入0汤圆

发表于 2015-2-1 00:55:54 | 显示全部楼层
收藏,细看

出10入0汤圆

发表于 2015-2-1 08:40:43 来自手机 | 显示全部楼层
rockyyangyang 发表于 2015-1-19 10:08
也是STAE_ITEM?

查询结构体数组的,这里好像只能是0,1;

出0入0汤圆

发表于 2015-2-1 10:08:50 | 显示全部楼层
rockyyangyang 发表于 2015-1-15 09:12
能不能解释一下
unsigned int systemMs(void)
{


clock()获取当前的系统时间,返回一个clock_t类型的值。每进一次这个函数,都会在当前系统时间基础上加上100返回,这样,就可以在PC上模拟系统时钟了。clock()函数的用法,你可以看看这个页面:
http://www.cplusplus.com/reference/ctime/clock/?kw=clock

出0入0汤圆

发表于 2015-2-7 15:48:43 | 显示全部楼层
mark一下,很受用

出0入0汤圆

发表于 2015-2-8 11:45:42 | 显示全部楼层
没看懂,下载下来继续看!

出0入0汤圆

发表于 2015-2-8 20:33:55 | 显示全部楼层
看这代码,是不是每个状态机制的运行超时可以单独设置

出0入0汤圆

发表于 2015-2-8 20:43:43 | 显示全部楼层
短小精悍
的确现在很多项目可以用到状态机,是个不错的设计模式

出0入0汤圆

 楼主| 发表于 2015-2-13 14:37:37 | 显示全部楼层
pigy0754 发表于 2015-2-8 20:33
看这代码,是不是每个状态机制的运行超时可以单独设置

那当然。

出0入0汤圆

发表于 2015-2-13 17:16:42 | 显示全部楼层
MARKKKKKKKK

出0入0汤圆

发表于 2015-2-15 15:47:28 | 显示全部楼层
思路不错,有机会用这种方式实现下状态机。

出0入0汤圆

发表于 2015-2-19 15:36:34 | 显示全部楼层
正在学习状态机

出0入0汤圆

发表于 2015-2-20 03:23:04 | 显示全部楼层
如果有详细的demo项目例子就更好了,更能加深理解深奥之处

出0入0汤圆

发表于 2015-2-24 23:16:10 | 显示全部楼层
完全看不懂,但是知道比较牛逼。学习膜拜。谢谢分享代码。

出0入0汤圆

发表于 2015-2-24 23:37:47 | 显示全部楼层
skefer 发表于 2015-1-14 23:15
这样还是不如上操作系统,或者事件驱动,具体LZ可以在arduino英文论坛里面找到,国内好像有个比较牛逼的叫 ...

你说的是RT thread 吧?

出0入0汤圆

发表于 2015-2-27 17:32:28 | 显示全部楼层
对函数指针运用比较精通。

出0入0汤圆

发表于 2015-2-28 08:57:03 | 显示全部楼层
先收藏,慢慢看.

出0入0汤圆

发表于 2015-3-13 11:06:11 | 显示全部楼层
状态函数间的参数传递如何实现 呢?? 因为在实际应用中,需要不同任务间传递中间参数以确定相关资源和信息已就位,可以按分支继续执行了,所以参数传递好像绕不开呢。

出0入0汤圆

 楼主| 发表于 2015-3-13 11:33:49 | 显示全部楼层
xf331785508 发表于 2015-3-13 11:06
状态函数间的参数传递如何实现 呢?? 因为在实际应用中,需要不同任务间传递中间参数以确定相关资源和信息 ...

全局变量

出0入0汤圆

发表于 2015-3-13 17:33:11 | 显示全部楼层
状态即过程?

出0入0汤圆

发表于 2015-3-13 20:46:04 来自手机 | 显示全部楼层
手机党标记

出0入0汤圆

发表于 2015-3-13 20:59:04 | 显示全部楼层
感谢楼主


状态机  得仔细理解下

出0入0汤圆

发表于 2015-3-13 21:22:04 来自手机 | 显示全部楼层
好资料,顶一个。

出0入0汤圆

发表于 2015-3-16 08:01:33 | 显示全部楼层
很好,学习了,谢谢楼主分享

出0入0汤圆

发表于 2015-4-26 21:55:18 | 显示全部楼层
马克一下。

出0入0汤圆

发表于 2015-4-26 22:38:54 | 显示全部楼层
顶一下,感谢分享!

出0入0汤圆

发表于 2015-4-27 10:28:14 | 显示全部楼层
够简单,但有问题:
main_state1,main_state2只是顺序执行,要是1延时100S,2就等待100S?

出0入0汤圆

发表于 2015-4-27 12:27:00 | 显示全部楼层
值得学习下,谢谢

出0入0汤圆

发表于 2015-4-27 12:49:09 | 显示全部楼层
留名学习,感谢分享

出0入0汤圆

发表于 2015-4-27 13:04:08 | 显示全部楼层
向往的境界啊

出0入0汤圆

发表于 2015-6-14 11:06:27 | 显示全部楼层
测试了楼主的代码。非常好用。

出0入0汤圆

发表于 2015-6-14 21:05:39 | 显示全部楼层
看不懂,需要仔细研究下

出0入0汤圆

发表于 2015-6-15 11:05:15 | 显示全部楼层
本帖最后由 tangcdong 于 2015-6-15 11:11 编辑

个人感觉还是有些问题,首先
//启动一个定时器,每毫秒中断一次,在中断函数中把 g_milliseconds 加1
static u32 g_milliseconds=0;
u32 systemMs(void)
{
    return g_milliseconds;
}
这种情况g_milliseconds溢出的时候可能会出现打印两次enter state?因为g_milliseconds溢出时systemMs()返回0,这时如果刚好处于状态切换,就  会发生,当然这种情况发生的概率小2^32次方 分之一还得与上状态切换的概率(这个由系统决定),但是这种事情是必然会发生的。

出0入0汤圆

发表于 2015-12-2 14:41:43 | 显示全部楼层
jdh99 发表于 2015-1-15 08:45
用这个方法实现不如switch+case结构清晰,LZ你这个程序结构更适合实现简单任务调度:main中主循环调度各个t ...

不是 实现任务调度,而是状态切换,不同状态时要处理的任务是不同的。

出0入0汤圆

发表于 2015-12-2 14:43:00 | 显示全部楼层
tangcdong 发表于 2015-6-15 11:05
个人感觉还是有些问题,首先
//启动一个定时器,每毫秒中断一次,在中断函数中把 g_milliseconds 加1
stat ...

对,会有这样的问题发生,所以要做防止溢出处理

出0入0汤圆

发表于 2015-12-2 14:44:23 | 显示全部楼层
pigy0754 发表于 2015-2-8 20:33
看这代码,是不是每个状态机制的运行超时可以单独设置

对,根据每个状态的需求可以单独设置   

出0入0汤圆

发表于 2015-12-2 14:48:23 | 显示全部楼层

不是,状态是不同的过程      状态1:两个过程A,B   状态2:三个过程A,B,C 状态3:过程A          

出0入0汤圆

发表于 2015-12-2 14:52:34 | 显示全部楼层
styleno1 发表于 2015-1-15 09:45
这算不上状态机,只算得是时间片轮转系统。

1.时间片轮转只是保证不会在某一状态中卡死,退出出来时,进行强制切换状态
2.根据条件触发进入不同的状态才是真谛

出0入0汤圆

发表于 2015-12-2 14:56:08 | 显示全部楼层
jiaren 发表于 2015-4-27 10:28
够简单,但有问题:
main_state1,main_state2只是顺序执行,要是1延时100S,2就等待100S? ...

不太明白你的意思

1.如果你的业务逻辑上要求延时100s 就 延时

2.配合os 使用,你的延时是不会浪费的

3.

出0入0汤圆

发表于 2015-12-2 15:00:31 | 显示全部楼层
315936392 发表于 2015-1-15 08:52
函数指针 每个状态一个函数 状态完成时 指针指向下一个函数。。。。。。。。
感觉不如PTthread。。。。。 ...

你的侧重点不对,这里不是讨论任务轮询,而是状态  和   切换

出0入0汤圆

发表于 2015-12-2 15:04:58 | 显示全部楼层
卢台长 发表于 2015-1-15 14:07
clock()是计算程序运行时间,具体没怎么用过,奇怪的是又没有相关定时器,它是如何记录程序运行时间的呢, ...

STM32  有一个计时时钟啊  开启之后就一直计时   

出0入0汤圆

发表于 2015-12-5 09:32:47 | 显示全部楼层
支持,顶一个!

出10入0汤圆

发表于 2017-3-19 20:43:35 | 显示全部楼层
又浏览了一遍,学习学习

出0入0汤圆

发表于 2017-3-19 21:48:26 | 显示全部楼层
标记下,再次学习。

出0入0汤圆

发表于 2017-3-20 09:02:53 | 显示全部楼层
很巧妙的设计,感谢楼主分享!

出0入0汤圆

发表于 2017-3-20 09:48:12 | 显示全部楼层
谢谢楼主无私的分享。

出0入0汤圆

发表于 2017-3-20 10:54:26 | 显示全部楼层
不错,有时也用一下状态机

出0入0汤圆

发表于 2017-3-21 21:24:01 | 显示全部楼层
谢谢楼主,留待慢慢看

出0入0汤圆

发表于 2017-3-21 21:53:38 | 显示全部楼层
记个号好好研究

出0入0汤圆

发表于 2017-3-21 22:07:57 | 显示全部楼层
只会switch简单状态机。这个要好好学习一下。

出0入0汤圆

发表于 2017-3-22 09:49:38 | 显示全部楼层
Mark下,反复看看,有其妙处。如果借鉴UCOS等操作系统的特点,设置一个空任务,可以避免每1ms调用任务,可节省CPU资源。

出0入0汤圆

发表于 2017-6-10 01:12:00 | 显示全部楼层
主循环里面为什么要有1ms的delay?去掉不行吗?

出0入0汤圆

发表于 2017-6-10 10:21:43 | 显示全部楼层
前段时间学习了指针,再看这些代码就好理解多了。

出0入0汤圆

发表于 2017-6-10 10:26:16 | 显示全部楼层
先做个记号,就不知道那10行比较重要。

出140入158汤圆

发表于 2017-6-10 15:11:56 | 显示全部楼层
"状态机"好像很容易戳到一些人的G点,使之走火入魔,好像不挂上状态机就很OUT,搞出一堆狗屁代码框架,故作高深。其实状态机是编程时的一种指导思维,不是什么框架,目的就是模块化,降低模块之间的耦合程度,是流程清晰,可控,减少BUG的发生,方便重用和移植。

出0入0汤圆

发表于 2017-6-10 16:42:29 | 显示全部楼层
不懂,比较牛逼。学习了。…。…。………………。谢谢分享代码。

出0入0汤圆

发表于 2017-6-11 07:40:30 | 显示全部楼层
好久没有看了,学习一下。

出0入0汤圆

发表于 2017-6-11 11:06:56 | 显示全部楼层
amigenius 发表于 2015-1-16 11:10
这东西见人见智,状态机只是一种编程思路,实现方式多样,无需拘泥于什么形式实现。我从4位机到32位机,P ...

技术论坛本来就是讨论枝术的,所以有不同声音很正常,若有更好的方法,能抛砖引玉更多人当然更好。

出0入0汤圆

发表于 2017-6-11 14:17:22 | 显示全部楼层
谢谢分享,很受用!

出0入0汤圆

发表于 2017-6-11 20:32:53 | 显示全部楼层
超赞  准备测试中

出0入0汤圆

发表于 2017-6-16 11:57:20 | 显示全部楼层
异步多线程,一般程序猿很难理解

出0入0汤圆

发表于 2017-6-23 20:59:47 | 显示全部楼层
很好的东西,谢谢楼主分享,暂时还没全明白!

出0入0汤圆

发表于 2017-6-23 21:41:29 | 显示全部楼层
这个状态机思路非常清晰,我觉得即便是简单几个个状态,也要比switch的方式更清晰。
逻辑清晰,优势很大,尤其我们都是知道任何一个应用,都会涉及很多状态,清晰的逻辑大大降低出错几率。当然系统的越大,越需要配上状态图才方便未来重读或升级维护,这是任何系统避免不了的

出0入0汤圆

发表于 2017-6-24 00:09:58 | 显示全部楼层
支持,超时机制不错。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表