搜索
bottom↓
回复: 236

[学海拾贝]状态机思路在单片机程序设计中的应用

  [复制链接]

出330入0汤圆

发表于 2009-4-28 21:38:55 | 显示全部楼层 |阅读模式
状态机思路在单片机程序设计中的应用

状态机的概念
  状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。
  比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。
  进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。
  同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。
  显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。
  当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。

程序其实就是状态机
  也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么?

状态机的要素
  状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
  ①现态:是指当前所处的状态。
  ②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
  ③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
  ④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

  如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。
  状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。
  纯粹用文字描述是很低效的,所以就不介绍了。接下来先介绍图形的方式。

状态迁移图(STD)
  状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。状态迁移图的画法有许多种,不过一般都大同小异。我们结合一个例子来说明一下它的画法,如图1所示。

(原文件名:图1状态迁移图.jpg)

  ①状态框:用方框表示状态,包括所谓的“现态”和“次态”。
  ②条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件。
  ③节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。
  ④动作框:用椭圆框表示。
  ⑤附加条件判断框:用六角菱形框表示。

  状态迁移图和我们常见的流程图相比有着本质的区别,具体体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。
  我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。这正是我们需要达到的目的。

状态迁移表
  除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。这种表一般称为状态迁移表。
  表1就是前面介绍的那张状态迁移图的另一种描述形式。

(原文件名:表1状态迁移表.jpg)
  ①采用表格方式来描述状态机,优点是可容纳更多的文字信息。例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。
  ②如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。经过拆分后的表格根据其具体内容,表格名称也有所变化。
  ③比如,我们可以把状态特征和迁移关系分开列表。被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表”。这其中比较常见的就是把每个状态的显示内容单独列表。这种描述每个状态显示内容的表称之为“显示真值表”。同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。
  ④由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。
  ⑤状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。比较理想的是将图形和表格结合应用。用图形展现宏观,用表格说明细节。二者互为参照,相得益彰。

用状态机思路实现一个时钟程序
  接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。下面这张图是一个时钟程序的状态迁移图,如图2所示。

(原文件名:图2时钟程序状态迁移图.jpg)
把这张图稍做归纳,就可以得到它的另一种表现形式——状态迁移表,如表2所示。

(原文件名:表2时钟程序状态迁移表.jpg)

状态机应用的注意事项
  基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。
  初学者往往会把某个“程序动作”当作是一种“状态”来处理。我称之为“伪态”。那么如何区分“动作”和“状态”。本匠人的心得是看二者的本质:“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
  初学者的另一种比较致命的错误,就是在状态划分时漏掉一些状态。我称之为“漏态”。
  “伪态”和“漏态”这两种错误的存在,将会导致程序结构的涣散。因此要特别小心避免。

更复杂的状态机
  前面介绍的是一种简单的状态结构。它只有一级,并且只有一维,如图3所示。

(原文件名:图3线性状态机结构.jpg)

  如果有必要,我们可以建立更复杂的状态机模型。
1 多级状态结构
  状态机可以是多级的。在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。
  在某些状态下,还可以进一步划分子状态。比如,我们可以把前面的时钟例子修改如下:
把所有和时钟功能有关的状态,合并成1个一级状态。在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟;
  同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。
  我们需要用另一个状态变量(寄存器)来表示这些子状态。
  子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。

(原文件名:图4树状多级状态结构.jpg)

  2 多维状态结构
  状态结构也可以是多维的。从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。
  举一个这方面的例子,如:空调遥控器,如图5所示。

(原文件名:图5多维状态机结构.jpg)
  同样,我们也可以构建三维、四维甚至更多维的状态结构。每一维的状态都需要用一个状态变量(寄存器)来表示。
  无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。
  简单的才是最有效的。

结束语
  对状态机的理解需要一个由浅入深的过程。这个过程应该是与实践应用和具体案例思考相结合的。当一种良好的思路成为设计的习惯,它就能给设计者带来回报。愿这篇手记里介绍的基于状态机的编程思路能给新手们带来一些启迪,帮助大家找到“程序设计”的感觉。

出0入0汤圆

发表于 2009-4-28 21:51:31 | 显示全部楼层
楼主这么用心啊,其实我最近也在弄这东西,只是一个小项目,不过我刻意的把状态机引入了,用visualstate建模的,只是现在没做完呢,先不献丑了,过两周资料全部整理出来大家交流下,哈哈~~

出0入0汤圆

发表于 2009-4-28 22:03:06 | 显示全部楼层
非常实用
我牵走了

出330入0汤圆

 楼主| 发表于 2009-4-28 23:53:51 | 显示全部楼层
公司版STM32工作原理:

晶振:老板,带两个秘书(电容),有时老板不在秘书说了算(内部时钟模式)
时钟PLL:老板娘,老板控制局面,但还是要听老板娘的话。
CPU:人力资源部,调动人员齐心合力
APB1,APB2时钟:部门经理,发布任务进度,启动工作

GPIO:体力工人,说干什么就干什么,也只干什么。
TIM:小时工,按时付费
AD:市场部,收集大大小小的反馈意见
DA:采购部,给多少钱看老板意思
串口:公关部,跟上层打交道,有来有往
USB:高级公关部,关系就没那么简单了
I2C,SPI,CAN:外联部,抓紧合作伙伴互通有无

电源:资金
电压变换:财务
电压监测:老板眼线

电路板:市场
电磁干扰:经济危机

看门狗:就是看门狗,谁不干活儿咬谁!

    虽然经济危机当前,但是有了资金来源,财务部门通知老板可以启动一个项目,经过眼线确认没有腐_败问题后,老板跟老板娘打个招呼,经认可通过人力资源部调动几个主任进行规划。部门1经理负责外联事宜,布置采购、高级公关部联系协议,以及与兄弟单位的联系。部门2经理负责收集市场信息,技术攻关和雇佣小时工。
    老板发言:我对你们每个部门都有绝对控制能力,别给我耍花样,哪个不工作我就断了他的饭碗。公司里面那两条狗不是白养的,有一条连我都不认,谁不干活就会咬人!你们别整天什么事情都盯着我,有些事情不太重要,我两个秘书来就行了。

注:翻译过来就是STM32的工作原理,转自www.eeworld.com.cn

出0入0汤圆

发表于 2009-4-29 00:06:31 | 显示全部楼层
3楼这个强....

出0入0汤圆

发表于 2009-4-29 08:51:19 | 显示全部楼层
不错,我顶!

出330入0汤圆

 楼主| 发表于 2009-9-7 23:05:59 | 显示全部楼层
网摘其一:《人生电路》

这是在一个朋友的Q上看到的文章,很喜欢,所以就放到这里来了,希望他不要控告我侵犯版权~~

让快乐增益,将忧愁衰减;

把快乐存盘,将忧愁压缩,丢进回收站;

把快乐调制,发送给远方的朋友,让知音共鸣;

我们不求事事完美,因为生活允许有误差;

我们也不求面面俱到,因为人性总是难测,方法不对就常会出现失真;

未来无法仿真,因为人生路比电路更复杂,甚至找不到相应器件;

但生活却又像烧单片机,程序永远可以重拷,输出效果由自己控制;

我想问:如果我是芯片你是板,你是否愿意与我生死与共,永不分离,不论线路是否短接,不管正负是否接反,不管程序是否乱飞吗?


网摘其二:《电路版上的人生》
    工作了完整的一周,工作的长长数列,终于完成了一个最初的小循环节。很难用一种细腻的语言描述出刚刚工作的完整感受,我的工作开始于焊接电路板,或许冥冥之中已经暗示出我的人生轨迹就是如同电路板一样。

    看起来研发助理的工作是相当的单调,据我观察不外乎设计,焊接和程序,但是单调之中总充满这种种不可预知的神奇,就像最最普通的一块电路板,虽然看似整齐,即使焊接牢靠也并不能保证电路就可以正常的运行。即便是正常运行,也不能保证这个设计就能投入使用。其实人生往往如此,很多事情我们都以为是在计划之中,总以为事事完美,可是当事情真到了谜底揭开的那一刻,总是会出乎我们的意料。人生在循环与往复之间隐藏着无尽的差别与意外,电路和人生都可以设计出来,但是要想走向真正的目标总是需要不断的调试再调试才可以达到。

    下周我就开始学习设计电路了,虽然不完全是我的专业,但是毕竟是一门相当实用和有难度的技术,我很喜欢,似乎学会了设计电路,我便可以真正开始设计我的人生,想起来虽然工作辛苦,但心里忽然有些闪光的激动。

    人生需要把握每一条通路,在通路上我们总是会需要些电阻和电容,或许这就是人生的阻力和包容,当然也会有些放大信号的贵人来帮助我们,但是真正的通路是靠自己画出来了,我希望我可以自己勾勒出来。

出0入0汤圆

发表于 2009-9-11 22:06:54 | 显示全部楼层
收藏

出0入0汤圆

发表于 2009-11-25 23:53:39 | 显示全部楼层
标志位

出0入0汤圆

发表于 2009-12-4 22:42:21 | 显示全部楼层
学习了!!

出0入0汤圆

发表于 2009-12-4 23:06:46 | 显示全部楼层
ma....rk...

出0入0汤圆

发表于 2009-12-5 02:41:49 | 显示全部楼层
全是狠人

出0入0汤圆

发表于 2009-12-5 09:13:56 | 显示全部楼层
lZ 图太小看不大清楚

另两级以上状态机在实际应用中 不好管理

在系统中用了 状态机管理任务 +状态机各个子功能驱动任务

导致标志量过多 比较乱 还可能出现锁死的情况

不知道有没有好的设计工具来 清晰逻辑状态  避免锁死情况

出0入0汤圆

发表于 2009-12-9 08:27:00 | 显示全部楼层
二楼不是已经说了,可以用VisualState,画好状态图后可以自动产生代码,你只要关注事件和Action的处理

出10入95汤圆

发表于 2010-3-1 23:09:02 | 显示全部楼层
好的状态机

出0入0汤圆

发表于 2010-3-18 21:15:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-25 17:43:21 | 显示全部楼层
好东西,赞一个!

出0入0汤圆

发表于 2010-3-25 17:52:04 | 显示全部楼层
好东西,谢谢了

出0入0汤圆

发表于 2010-4-6 19:23:50 | 显示全部楼层
好东西 学习

出0入4汤圆

发表于 2010-4-6 19:43:27 | 显示全部楼层
状态机 是不错的程序设计思路,我都是用状态机的思想来写程序的

出0入0汤圆

发表于 2010-4-6 19:45:19 | 显示全部楼层
mark

出675入8汤圆

发表于 2010-4-6 19:56:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-17 10:33:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-6 07:48:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-6 08:06:40 | 显示全部楼层
学习状态机

出0入0汤圆

发表于 2010-8-28 09:55:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-28 10:02:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-28 11:48:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-30 13:35:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-6 00:59:36 | 显示全部楼层
标记学习

出0入0汤圆

发表于 2010-10-6 01:11:09 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-10-6 04:54:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-6 08:53:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-6 13:33:28 | 显示全部楼层
学习一下状态机

出0入0汤圆

发表于 2010-11-3 16:52:20 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-11-23 09:29:08 | 显示全部楼层
回复【2楼】hefq  何访贤
-----------------------------------------------------------------------

这个有点意思!!!

出0入0汤圆

发表于 2010-11-23 10:35:36 | 显示全部楼层
mark 3楼

出0入0汤圆

发表于 2010-11-30 09:38:06 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-11-30 17:04:59 | 显示全部楼层
nba

出0入0汤圆

发表于 2010-11-30 17:51:40 | 显示全部楼层
标记下!

出0入0汤圆

发表于 2010-12-13 13:22:20 | 显示全部楼层
很好的一种思路,我都是按照这种思路来编写程序

出0入0汤圆

发表于 2010-12-13 13:28:28 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-12-21 22:06:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-14 13:54:04 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-1-15 11:03:49 | 显示全部楼层
置初始状态0


[顺序结构]
检测状态0
无条件执行动作>条件>状态转移1
检测状态1
无条件执行动作>条件>状态转移2


[选择分支结构]
检测状态2
无条件执行动作>条件1>状态转移3
               条件2>状态转移5
检测状态3
无条件执行动作>条件>状态转移4
检测状态4
无条件执行动作>条件>状态转移7
检测状态5
无条件执行动作>条件>状态转移6
检测状态6
无条件执行动作>条件>状态转移7


[并行分支结构]
检测状态7
无条件执行动作>条件>状态转移8+状态转移11
状态转移8
无条件执行动作>条件>状态转移9
状态转移9
无条件执行动作>条件>状态转移10
状态转移11
无条件执行动作>条件>状态转移12
状态转移12
无条件执行动作>条件>状态转移13
状态转移9+状态转移13
无条件执行动作>条件>状态转移0
-------------------------------------------------
我一直用的顺序控制架构中的一部分

出0入0汤圆

发表于 2011-1-15 12:04:55 | 显示全部楼层
mark!~

出0入0汤圆

发表于 2011-1-21 10:08:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-23 16:05:25 | 显示全部楼层
楼主微言大义,学习了

出0入0汤圆

发表于 2011-2-24 17:04:38 | 显示全部楼层
看下!!

出0入0汤圆

发表于 2011-2-27 13:10:30 | 显示全部楼层
个人觉得状态机不适合复杂关系程序,状态控制会非常麻烦,不便于转变状态

出0入0汤圆

发表于 2011-2-27 16:16:08 | 显示全部楼层
恩,楼主讲的很详细,谢谢分享经验

出0入0汤圆

发表于 2011-2-28 00:33:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-28 02:17:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-28 10:51:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-5 15:15:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-7 03:39:33 | 显示全部楼层
mark 学习学习

出0入0汤圆

发表于 2011-3-26 10:08:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-26 10:20:37 | 显示全部楼层
makr

出0入0汤圆

发表于 2011-3-27 15:22:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-12 22:08:18 | 显示全部楼层
经典,mark

出0入0汤圆

发表于 2011-4-16 22:57:12 | 显示全部楼层
蒽,向各位前辈学习

出0入0汤圆

发表于 2011-4-16 23:40:31 | 显示全部楼层
mark一下。

出0入0汤圆

发表于 2011-5-8 20:57:53 | 显示全部楼层
人生电路

出0入0汤圆

发表于 2011-5-8 21:07:02 | 显示全部楼层
jh

出0入0汤圆

发表于 2011-5-8 21:50:50 | 显示全部楼层
呵呵,只是听闻,还未得细察。。

出0入0汤圆

发表于 2011-5-18 08:25:27 | 显示全部楼层
受益匪浅!!!!

出0入0汤圆

发表于 2011-5-19 15:44:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-22 15:10:24 | 显示全部楼层
多谢楼主分享!

出0入0汤圆

发表于 2011-5-22 16:40:04 | 显示全部楼层
好资料,收益了!

出0入0汤圆

发表于 2011-5-22 18:55:54 | 显示全部楼层
受教了

出0入0汤圆

发表于 2011-5-22 21:49:41 | 显示全部楼层
有时间认真研究一下状态机

出0入0汤圆

发表于 2011-6-8 10:14:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-8 18:13:44 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2011-6-10 09:57:02 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-6-10 10:32:59 | 显示全部楼层
学习~

出0入0汤圆

发表于 2011-6-12 16:16:50 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-14 22:56:08 | 显示全部楼层
状态机 好强

出0入0汤圆

发表于 2011-6-15 17:45:22 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-6-23 10:47:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-23 11:46:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-29 08:21:59 | 显示全部楼层
状态机

出0入0汤圆

发表于 2011-6-29 09:44:33 | 显示全部楼层
很有用的呢,学习了

出0入0汤圆

发表于 2011-6-29 10:01:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-29 10:25:43 | 显示全部楼层
mark学习状态机

出0入0汤圆

发表于 2011-7-4 14:38:24 | 显示全部楼层
回复【3楼】zcllom 星罗棋布
-----------------------------------------------------------------------

贴切……

出0入0汤圆

发表于 2011-10-7 14:26:16 | 显示全部楼层
mark!!!!

出0入0汤圆

发表于 2011-10-7 16:06:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-5 01:54:06 | 显示全部楼层
mark,以后有空好好学学。

出0入0汤圆

发表于 2011-12-5 09:03:25 | 显示全部楼层
学些了!!!

出0入0汤圆

发表于 2011-12-6 14:47:24 | 显示全部楼层
状态机 学习 mark

出0入0汤圆

发表于 2011-12-7 00:37:48 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-7 10:42:56 | 显示全部楼层
受教了

出0入0汤圆

发表于 2012-1-12 11:06:55 | 显示全部楼层
备用

出0入0汤圆

发表于 2012-1-12 12:26:41 | 显示全部楼层
这个必须顶

出0入0汤圆

发表于 2012-1-19 21:14:25 | 显示全部楼层
学习了,好资料,谢谢啊

出0入0汤圆

发表于 2012-1-28 04:32:40 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-1-28 09:57:18 | 显示全部楼层
学习了

出0入8汤圆

发表于 2012-4-25 10:27:29 | 显示全部楼层
好东西,谢谢了

出0入0汤圆

发表于 2012-4-25 11:39:22 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-4-25 16:05:58 | 显示全部楼层
从FPGA上学到状态机这个概念后,在单片机的编程中,就一直在应用,真的是神器啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2023-2-8 12:34

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

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