搜索
bottom↓
回复: 133

原创:我跟你一起学MQX(一):任务

  [复制链接]

出0入0汤圆

发表于 2014-9-4 19:59:44 | 显示全部楼层 |阅读模式
本帖最后由 wangpengcheng 于 2014-9-5 11:15 编辑

拿到塔式板了,我的心也实在了,只是莫大说让我发表个测评,这东西我还真没做过,呵呵,不知道如何进行!不过我这个马甲也注册半年了,从最低的注册会员都升到金牌会员了,一直在这里混,接触很多热心的坛友,帮过我很多,尤其是那几个版主,在这里我得谢谢大家!

我是从去年开始接触MQX的,以前学OS是从RTT开始学的,我觉得RTT的应用手册帮了我很大忙,按它一步一步了解OS。在没接触过OS之前,总觉得高上大,好难哦,尤其是LINUX,里面东西好多,根本就看不过来,而且没有实际的项目实战,真难啊。但是从这些小的系统里面,才真正看到OS的核心所在。其实我感觉用起来都差不多,主要是个思想,只是接口函数跟一些内部深入的东西会有一些差别,当然接口函数我们都可以在.h文件中找得到,至于内部比较深的东西,我暂时还没接触到。呵呵,其实我也只是知道个皮毛!

不过最近在坛子里碰到一些坛友,跟我以前一样,对OS没有一个明确的概念,当然,也有许多高手。所以我就有那么一点点想法,从MQX入手,把我理解的OS的概念表述出来!现在又有了塔式板,我想我可以将我这个想法付诸于行动了。如果有的观点大家认同,给个掌声鼓励一下;如果觉得有异议,我们可以一起讨论。

以后我想,如果大家觉得还可以,我会不定期的来做这件事情,这个帖子算是个开头吧。

好吧,废话说了不少,开始我们第一个认识:任务

任务肯定都听说过,这个比较简单,在OS中,任务的作用是把不同的事情分开来做,我把它理解成一个任务就是一个过程,有的过程是一次性的,有的过程是循环进行的!任何一个OS最基本的元素就是任务,OS是做什么的?它是对任务进行调度的,呵呵,我个人理解,它就是个指挥员,它会根据事先定义好的一些规则,来把时间分配给各个任务,并让每个任务顺利进行!它是怎么做的,我不管他,其实我也管不了 ,我只知道他需要什么,我给他就可以了!

现在我打开MQX例子中最简单的一个Hello,它的路径在:..\Freescale\Freescale_MQX_4_1\mqx\examples\hello\build\uv4\hello_twrk60f120m

打开后可以看到里面就一个.c文件,非常简单,它里面有一个任务模板列表:
  1. const TASK_TEMPLATE_STRUCT  MQX_template_list[] =
  2. {
  3.     /* Task Index,   Function,   Stack,  Priority, Name,     Attributes,          Param, Time Slice */
  4.     { HELLO_TASK,   hello_task, 1500,   8,        "hello",  MQX_AUTO_START_TASK, 0,     0 },
  5.     { 0 }
  6. };
复制代码

这个列表是一个结构体数组,它包含的是任务模板结构体,任务模板结构体的定义在MQX.h文件中可以找到。好吧,我们不管结构体了,因为这个列表的注释已经很清楚了:
任务ID:HELLO_TASK      
函数名:hello_task      
分配栈空间:1500
优先级:8
任务名称:"hello"
任务属性:MQX_AUTO_START_TASK
任务参数:0
任务时间片:0

这些都是MQX操作系统所需要的参数,我们把这些参数给它了,它就知道怎么来调度任务了!
要注意的是以下几个地方:
任务ID:这里要提到一个参数,任务最大数,我看了一下,在MQX.h文件中有定义,16位队列的是255个,32位队列的是65535个,目前用的是16位的,255个任务,太够了!当然,ID定义的时候也是1到255.
任务的栈空间:你要了解,你在任务中,所有的局部变量内存都是从这个空间里分配得到的。所以这个空间大小很重要,如果小了,分配内存会超出栈空间,造成内存混乱而发生不可预知的事情。如果太大了,浪费!
优先级:提到优先级,大家肯定不陌生了,中断都是按优先级来排的,这里是一个道理,你想哪个任务多跑几趟,那就给它高点,呵呵!
任务属性:目前的属性我英文不怎么滴也看明白了,是说这个任务是一个自启动的任务。嗯,说是任务属性当然会有选项了,我找到它定义的地方,肯定有一堆跟他类似的东西,看吧,果真有:
  1. /*--------------------------------------------------------------------------*/
  2. /*
  3. *                 TASK TEMPLATE ATTRIBUTES FLAGS
  4. *
  5. * These are bit flags or'd together to form the creation attributes for
  6. * a task. This is combined with INTERNAL TASK FLAGS.
  7. */

  8. /*
  9. * Tasks with this attribute will be created automatically at
  10. * system initialization time.
  11. */
  12. #define MQX_AUTO_START_TASK            (0x01)

  13. /*
  14. * Tasks with this attribute will save the floating point co-processor
  15. * registers during context switching.
  16. * If the floating point registers are separate from the normal registers,
  17. * their context is managed independently during task switching. The registers
  18. * are saved/restored only when a new floating point task is scheduled to run.
  19. */
  20. #define MQX_FLOATING_POINT_TASK        (0x02)

  21. /*
  22. * Tasks with this attribute will use the time slice
  23. * scheduler within the kernel
  24. */
  25. #if MQX_HAS_TIME_SLICE
  26. #define MQX_TIME_SLICE_TASK            (0x04)
  27. #endif

  28. /*
  29. * Tasks with this attribute will save the DSP co-processor
  30. * registers during context switching.
  31. * If the DSP registers are separate from the normal registers,
  32. * their context is managed independently during task switching. The registers
  33. * are saved/restored only when a new DSP task is scheduled to run.
  34. */
  35. #define MQX_DSP_TASK                   (0x08)

  36. #if MQX_ENABLE_USER_MODE
  37. #define MQX_USER_TASK                   (0x10)
  38. #else
  39. #define MQX_USER_TASK                   (0)
  40. #endif
复制代码

看一下,它一共有5个选项可选,它们分别是:
自启动——当MQX 开始运行时,它生成任务的一个实例;
DSP——MQX 保存DSP 协处理器寄存器作为任务现场的一部分;
浮点——MQX 保存浮点寄存器作为任务现场的一部分;
时间片——MQX 为任务使用轮循调度(默认是FIFO 调度);
用户任务——MQX为用户指定的任务

其实上面这些个属性我只用过自启动,其它的都没用过!也不知道什么情况下用,不过不要紧,目前已经够我用了,现在先了解一下,哪天说不定就理解并应用了。

还有其它两个:
任务参数:有时候会有用,但是它是一个(void *)型的指针,用的时候需要进行强制转换,现在不管他
时间片:我也没用过,呵呵

现在再看一下这个任务函数:
  1. /*TASK*-----------------------------------------------------
  2. *
  3. * Task Name    : hello_task
  4. * Comments     :
  5. *    This task prints " Hello World "
  6. *
  7. *END*-----------------------------------------------------*/
  8. void hello_task
  9.     (
  10.         uint32_t initial_data
  11.     )
  12. {
  13.     (void)initial_data; /* disable 'unused variable' warning */

  14.     printf("Hello World\n");
  15.     _task_block();
  16. }
复制代码

好简单哦,就是打印一个Hello World\n到串口去,然后就退出了。_task_block函数的意思就是切换到其它的任务去,也就是说该任务结束了!

现在我用TWR运行了一下,结果如图所示:


嗯,看来这个任务是只运行一次啊!我想我现在可以修改它,让它变成循环运行,我想让它每一秒就输出一次:
  1. void hello_task
  2.     (
  3.         uint32_t initial_data
  4.     )
  5. {
  6.     (void)initial_data; /* disable 'unused variable' warning */
  7.     int i;
  8.     for(i = 0; ;i++)
  9.     {
  10.         printf("Hello World %d time\n", i);
  11.         _time_delay(1000);
  12.     }
  13. //    _task_block();
  14. }
复制代码

这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每一个任务中,都必须有一个机制,把CPU让出来,如果任务中缺少这个机制,那么CPU就永驻此任务了,别的任务根本运行不到。在这个任务中,我用到延时来处理的。当然还有其它的一些机制,我们以后再说! _time_delay延时函数是MQX系统的一个函数接口,在处理延时的时候,CPU会去做别的事情,一直到该任务延时结束并且没有比它更高优先级的任务就绪,它才会继续运行。所以这个延时函数是一个大概的时间,不能用来精确计时。
在mqx.h文件中,我们可以找到很多关于时间的函数接口,他们定义在一起,都是MQX系统拥有的,可以按场合进行调用。

改完后的任务运行结果如下:

看到了吧,效果是明显的!

再接下来,我又想添加一个任务,让两个任务同时运行,好吧,这回我们既然要添加任务,就要改动任务列表了:
  1. const TASK_TEMPLATE_STRUCT  MQX_template_list[] =
  2. {
  3.     /* Task Index,   Function,   Stack,  Priority, Name,     Attributes,          Param, Time Slice */
  4.     { HELLO_TASK,   hello_task, 1500,   8,        "hello",  MQX_AUTO_START_TASK, 0,     0 },
  5.     { YES_TASK,     yes_task,   1500,   9,        "yes",    MQX_AUTO_START_TASK, 0,     0},
  6.     { 0 }
  7. };
复制代码


在任务列表中,我添加了一个yes任务,当然,任务ID我用宏定义在文件前面已经定义了,它不会凭空出现的,呵呵。这个任务也属于自启动任务,任务函数如下:
  1. void yes_task(uint32_t para)
  2. {
  3.     int i;
  4.     for(i = 0; ;i++)
  5.     {
  6.         printf("yes? %d time\n", i);
  7.         _time_delay(1000);
  8.     }
  9. }
复制代码

我也是让它每一秒输出一次yes,呵呵,既然有人叫,咱就应一下吧,编译下载后,我们看结果是不是叫一秒叫一次,这边应一次:


看到了吧,是真的!呵呵!现在我已经成功的跑起来两个任务了!当然你如果还想加的话,可以随便加哦,只要不超过255个

这个是简单的两个任务,其实还有其它的方法创建任务,比如用MQX接口函数来创建,任务也有一堆接口函数:
  1. extern _mqx_uint         _task_abort(_task_id);
  2. extern void              _task_block(void);
  3. extern bool              _task_check_stack(void);
  4. extern _task_id          _task_create(_processor_number, _mqx_uint, uint32_t);
  5. extern _task_id          _task_create_blocked(_processor_number, _mqx_uint, uint32_t);
  6. extern _task_id          _task_create_at(_processor_number, _mqx_uint,
  7.    uint32_t, void *, _mem_size);
  8. extern _mqx_uint         _task_destroy(_task_id);
  9. extern void              _task_disable_fp(void);
  10. extern bool              _task_enable_fp(void);
  11. extern _task_id          _task_get_creator(void);
  12. extern void             *_task_get_environment(_task_id);
  13. extern TASK_EXCEPTION_FPTR _task_get_exception_handler(_task_id);
  14. extern _mqx_uint         _task_get_error(void);
  15. extern _mqx_uint        *_task_get_error_ptr(void);
  16. extern TASK_EXIT_FPTR    _task_get_exit_handler(_task_id);
  17. extern _task_id          _task_get_id(void);
  18. extern _task_id          _task_get_id_from_name(char *);
  19. extern _task_id          _task_get_id_from_td(void *);
  20. extern _mqx_uint         _task_get_index_from_id(_task_id);
  21. extern uint32_t          _task_get_parameter(void);
  22. extern uint32_t          _task_get_parameter_for(_task_id);
  23. extern _processor_number _task_get_processor(_task_id);
  24. extern _mqx_uint         _task_get_priority(_task_id, _mqx_uint_ptr);
  25. extern void             *_task_get_td(_task_id);
  26. extern _mqx_uint         _task_get_template_index(char *);
  27. extern TASK_TEMPLATE_STRUCT_PTR _task_get_template_ptr(_task_id);
  28. extern void              _task_ready(void *);
  29. extern _mqx_uint         _task_restart(_task_id, uint32_t *, bool);
  30. extern void             *_task_set_environment(_task_id, void *);
  31. extern _mqx_uint         _task_set_error(_mqx_uint);
  32. extern TASK_EXCEPTION_FPTR _task_set_exception_handler(_task_id,TASK_EXCEPTION_FPTR);
  33. extern TASK_EXIT_FPTR    _task_set_exit_handler(_task_id,TASK_EXIT_FPTR);
  34. extern uint32_t           _task_set_parameter(uint32_t);
  35. extern uint32_t           _task_set_parameter_for(uint32_t, _task_id);
  36. extern _mqx_uint         _task_set_priority(_task_id, _mqx_uint, _mqx_uint_ptr);
  37. extern void              _task_stop_preemption(void);
  38. extern void              _task_start_preemption(void);

  39. extern _mqx_uint         _task_reserve_space(_mqx_uint);
  40. extern void             *_task_get_reserved_base(void);

  41. #if MQX_ENABLE_USER_MODE
  42. extern _task_id          _usr_task_create(_processor_number, _mqx_uint, uint32_t);
  43. extern _mqx_uint         _usr_task_destroy(_task_id);
  44. extern _mqx_uint         _usr_task_abort(_task_id task_id);
  45. extern _mqx_uint         _usr_task_set_error(_mqx_uint);
  46. extern void             *_usr_task_get_td(_task_id);
  47. extern void              _usr_task_ready(void *);
  48. #endif

  49. extern void             *_taskq_create(_mqx_uint);
  50. extern _mqx_uint         _taskq_destroy(void *);
  51. extern _mqx_uint         _taskq_resume(void *, bool);
  52. extern _mqx_uint         _taskq_suspend(void *);
  53. extern _mqx_uint         _taskq_suspend_task(_task_id, void *);
  54. extern _mqx_uint         _taskq_test(void **, void **);
  55. extern _mqx_uint         _taskq_get_value(void *);
复制代码


这些都在mqx.h中可以找得到,也在《Freescale MQX实时操作系统用户手册》中有说明,甚至有一些还有例程。我就不再说了!

现在已经把任务跑起来了,下次我想我应该做任务的同步了!

希望能对想学OS的同学有帮助!话说我今天真的把附件用完了,现在想把源文件传上来也传不了了!


本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2016-9-20 00:08:56 | 显示全部楼层
不错哦,也正在用mqx,k70上。
感觉mqx在飞思卡尔自己芯片上还是很强的,各种外设驱动不用移植,根据硬件改改就行。
有标准io,shell,文件系统,网络协议和应用,文档例程也挺丰富的,库的结构也清晰,ide支持也很好。

出0入0汤圆

发表于 2016-9-6 13:41:11 | 显示全部楼层
有需要来学习学习

出0入0汤圆

发表于 2016-8-31 21:26:19 | 显示全部楼层
非常支持!

出0入0汤圆

发表于 2014-12-22 10:07:30 | 显示全部楼层
MQX是什么东东,主要面向啥的啊?

出0入0汤圆

发表于 2014-12-12 22:37:05 | 显示全部楼层
顶楼主一下

出0入0汤圆

发表于 2014-12-10 20:54:23 | 显示全部楼层
有了楼主这贴 ,学起来会很容易。

出0入0汤圆

发表于 2014-12-10 19:07:04 | 显示全部楼层
每天看一点,希望将来能学会,让操作系统不再神秘

谢楼主

出0入0汤圆

发表于 2014-12-10 18:55:17 | 显示全部楼层
MQX,已经在熟悉了,也想借此机会了解操作系统。楼主好想法,希望看到更多楼主的分享,在此赞一个,楼主好样的

出0入0汤圆

 楼主| 发表于 2014-10-30 14:58:20 | 显示全部楼层
ggchao 发表于 2014-10-30 13:56
曾经我也想学这个,只是用的太少,后来就搁浅了

呵呵,有针对性的用起来,OS很方便的!

出0入0汤圆

发表于 2014-10-30 13:56:40 | 显示全部楼层
曾经我也想学这个,只是用的太少,后来就搁浅了

出0入0汤圆

 楼主| 发表于 2014-10-29 17:31:56 | 显示全部楼层
samhws 发表于 2014-10-24 14:36
楼主
任务ID:HELLO_TASK
这是是不是任务模板的ID(任务模板索引)更准确些?

我的理解是任务ID只是任务索引,它是为了在任务调度的时候方便查找!
它会在任务模板中赋值给任务!

出0入0汤圆

发表于 2014-10-29 09:19:55 | 显示全部楼层
好帖,加油

出0入0汤圆

发表于 2014-10-24 14:36:47 | 显示全部楼层
楼主
任务ID:HELLO_TASK
这是是不是任务模板的ID(任务模板索引)更准确些?
3.4.1 创建任务
任何任务(创建者)均可以通过调用_task_create()或者_task_create_blocked()创建其它任务
(子任务),并传递处理器编号、任务模板索引和任务创建参数。应用程序定义一个创建参数,通
常用于为子任务提供初始化信息。
用户手册是这样写的

出0入0汤圆

发表于 2014-10-7 17:23:54 | 显示全部楼层
顶一下顶一下

出0入0汤圆

 楼主| 发表于 2014-10-6 00:13:25 | 显示全部楼层
hanjiang 发表于 2014-10-5 18:24
楼主您好,刚看到你的帖子,最近也想用k60+MQX,但是我是刚接触飞思卡尔的东西,这个现在还没概念,在网上 ...

坛子里有好多资料,你先搜搜看,先看如何安装,然后了解安装后的文件的位置以及用途,然后再看如何修改BSP包,一步一步来!没有人能一口吃个胖子,我也是这么过来的!

出0入0汤圆

发表于 2014-10-5 18:24:14 | 显示全部楼层
楼主您好,刚看到你的帖子,最近也想用k60+MQX,但是我是刚接触飞思卡尔的东西,这个现在还没概念,在网上看资料感觉是用软件就可以配置出系统来,你能大概说明一下这个开发过程吗?对于初学者有一个系统的认识,包括如何搭建系统,用那个编译环境较为方便等,还有飞思卡尔对于系统的支持是不是每个系列都有配套的驱动软件提供,还是驱动的自己开发等,简单系统的说说,非常感谢,如果懂的朋友可以发表一下自己的对这个系统的总体结构的认识,

出0入0汤圆

发表于 2014-10-3 18:09:26 | 显示全部楼层
先BAIDU MQX去

出0入0汤圆

发表于 2014-10-3 16:57:28 | 显示全部楼层
Priority越大代表优先级越低么?

出0入0汤圆

发表于 2014-9-12 08:36:12 | 显示全部楼层
fengyunyu 发表于 2014-9-11 22:18
是没有看过,UCOS用过,用的时候都是照葫芦画瓢,对如何精简不明所以。

呵呵,我也是闲的蛋疼,因为我讨厌OS那一大串东西的,所以干脆自己动手裁了一个;   
说是裁,其实就是去掉了OS无用的代码,把我想要的功能的必要代码留下,其它无用的统统删除掉,如此而已;我还没有到自己写出个UC这样稳定的OS的功力啊;
要不就干脆和XP或LINUX一样,大而全; 要不就干脆精简到极致,需要啥功能自己添加,还能得心应手些;

出0入0汤圆

 楼主| 发表于 2014-9-11 23:45:56 | 显示全部楼层
kinsno 发表于 2014-9-11 12:43
UCOS的软定时就是这样干的吧,中断发信号,软定时任务执行;
嘿,RTOS有它的好处,当然也有它的不好处,我一般 ...

MQX也可用来裁剪,用不到的可以裁剪掉!看看small_ram_config.h文件。

其实一个好的OS是面向对像的编程思想的,各个部件的耦合已经做到了最低!

出100入101汤圆

发表于 2014-9-11 22:18:36 | 显示全部楼层
kinsno 发表于 2014-9-11 22:04
刚看过去了,他那个是精简版?不太象,估计你没下下来看过;他那个我看了都不忍心了,其实就是他自己写的 ...

是没有看过,UCOS用过,用的时候都是照葫芦画瓢,对如何精简不明所以。

出0入0汤圆

发表于 2014-9-11 22:04:38 | 显示全部楼层
fengyunyu 发表于 2014-9-11 12:50
LS的“UCOS精简版”是自己精简的么?还是http://www.pudn.com/downloads573/sourcecode/embedded/detail2 ...

刚看过去了,他那个是精简版?不太象,估计你没下下来看过;他那个我看了都不忍心了,其实就是他自己写的,然后号称精简版;
我说的精简版,代码是从UCOS里摘出来的,只摘出最核心的部分,然后组装而成;呵呵;

出0入0汤圆

发表于 2014-9-11 19:02:03 | 显示全部楼层
长期潜水员,躺枪了,努力发帖升级

出0入0汤圆

发表于 2014-9-11 18:53:21 | 显示全部楼层
fengyunyu 发表于 2014-9-11 12:50
LS的“UCOS精简版”是自己精简的么?还是http://www.pudn.com/downloads573/sourcecode/embedded/detail2 ...

功能也简单啊,只有邮箱和延时,一个c和一个 h,总共没有800行,有一部分是我自己加的毫秒和秒延时函数,要不然都只有700来行吧!

出100入101汤圆

发表于 2014-9-11 12:50:17 | 显示全部楼层
本帖最后由 fengyunyu 于 2014-9-11 12:51 编辑
kinsno 发表于 2014-9-11 12:43
UCOS的软定时就是这样干的吧,中断发信号,软定时任务执行;
嘿,RTOS有它的好处,当然也有它的不好处,我一般 ...


LS的“UCOS精简版”是自己精简的么?还是http://www.pudn.com/downloads573 ... /detail2354286.html中所说的ucos精简版?

出0入0汤圆

发表于 2014-9-11 12:43:05 | 显示全部楼层
rootxie 发表于 2014-9-11 09:00
硬定时器一般RTOS都是这么做的,当然 缺陷也是非常明显的,所以很多时候都是用软定时器,即任务级别的
RT ...

UCOS的软定时就是这样干的吧,中断发信号,软定时任务执行;
嘿,RTOS有它的好处,当然也有它的不好处,我一般也用不满RTOS的功能,现在用的也是UCOS的精简版,只有2个功能, 邮箱和延时,别的没有了,前者任务同步和传递消息;

出0入0汤圆

发表于 2014-9-11 09:00:25 | 显示全部楼层
kinsno 发表于 2014-9-11 08:53
我压根就不往这里去想, 你把任务搁SYS里面去,任务多了或任务耗时霸占CPU, 那后果估计是毁灭性的啊; 这个 ...

硬定时器一般RTOS都是这么做的,当然 缺陷也是非常明显的,所以很多时候都是用软定时器,即任务级别的
RTOS的中断设计一般都要求分2部分,一部分在中断执行,只触发表示,推送IPC,下半部放在高优先级任务中处理,这根裸奔其实是一样的
如果你RTOS用过好几次,你绝不会再裸奔了,因为实在太方便了

出0入0汤圆

发表于 2014-9-11 08:53:46 | 显示全部楼层
rootxie 发表于 2014-9-11 08:50
感觉你理解错了,硬定时器不会跟硬件挂钩的 只是在systick的中断里执行,如果定时器内容过多,systick中 ...

我压根就不往这里去想, 你把任务搁SYS里面去,任务多了或任务耗时霸占CPU, 那后果估计是毁灭性的啊; 这个明显不行啊,就是我们自己裸奔,全推在TIM中断内,也得小心翼翼了; 所以我才理解为你是想另开一个TIM,然后跑任务的呢;

出0入0汤圆

发表于 2014-9-11 08:50:38 | 显示全部楼层
kinsno 发表于 2014-9-11 08:47
看来平时爱用UCOSIII,  话说定时器任务,我觉得也是使用软定时器的, 不会使用硬定时器的,因为硬定时器必须 ...

感觉你理解错了,硬定时器不会跟硬件挂钩的 只是在systick的中断里执行,如果定时器内容过多,systick中断里就非常臃肿了。。。

出0入0汤圆

发表于 2014-9-11 08:47:45 | 显示全部楼层
rootxie 发表于 2014-9-8 23:05
因为从你发的帖子来看 MQX貌似比UCOS II 规模大,如果规模太大 又没有十分突出的特点,仅仅是BSP支持比较 ...

看来平时爱用UCOSIII,  话说定时器任务,我觉得也是使用软定时器的, 不会使用硬定时器的,因为硬定时器必须和硬件挂勾啊,这样导致移植的难度又增加了些啊;  本来搞搞汇编就够让人烦了,还要把OS和具体芯片的硬定时器搞起来,那会让人更抓狂的;

出0入0汤圆

发表于 2014-9-11 08:46:09 | 显示全部楼层
qq开始学单片机 发表于 2014-9-11 02:41
MXQ一开始就系统了?我想请教一下,学MXQ是不是跟学STM32一样,从时钟开始? ...

MQX就是操作系统啊, 它不是芯片,  它和UCOS RTT FREERTOS 是一样的东西啊,只不过它是飞思卡尔自己家的OS罢了;

出0入0汤圆

发表于 2014-9-11 02:41:02 | 显示全部楼层
MXQ一开始就系统了?我想请教一下,学MXQ是不是跟学STM32一样,从时钟开始?

出0入0汤圆

发表于 2014-9-8 23:05:00 | 显示全部楼层
wangpengcheng 发表于 2014-9-8 22:21
我用的os都是软定时,你要用硬定时可以用定时器做中断,另外,你要是真对这个感兴趣,请动手自己操作来验 ...

因为从你发的帖子来看 MQX貌似比UCOS II 规模大,如果规模太大 又没有十分突出的特点,仅仅是BSP支持比较好,我就不尝试用了 ,还是感谢你的回复

出0入0汤圆

 楼主| 发表于 2014-9-8 22:21:53 来自手机 | 显示全部楼层
rootxie 发表于 2014-9-8 21:14
请问MQX定时器是硬定时器还是软定时器(任务),另外只有一个应用任务,只开信号量 需要多少的资源?多少FL ...

我用的os都是软定时,你要用硬定时可以用定时器做中断,另外,你要是真对这个感兴趣,请动手自己操作来验证需要的答案,我看到你的几个回帖问到的东西都是我没有用过的,在某些方面我只是应用者,所以不好意思,可能你需要查阅其它资料,如果有答案了,也请你回复一下,一起讨论,谢谢

出0入0汤圆

发表于 2014-9-8 21:26:52 | 显示全部楼层
嘿嘿,顶一下顶一下

出0入0汤圆

发表于 2014-9-8 21:14:39 | 显示全部楼层
请问MQX定时器是硬定时器还是软定时器(任务),另外只有一个应用任务,只开信号量 需要多少的资源?多少FLash 多少RAM?

出0入0汤圆

发表于 2014-9-8 20:52:41 | 显示全部楼层
mark,谢谢

出0入0汤圆

发表于 2014-9-8 19:29:19 | 显示全部楼层
wangpengcheng 发表于 2014-9-6 00:44
为什么要用“硬延时”呢?如果要准确延时,定时器就可以

我明白你的意思了,我开始以为你那地方是用的“硬延时”所以才那么说的。

出0入0汤圆

 楼主| 发表于 2014-9-6 17:03:08 | 显示全部楼层
laotui 发表于 2014-9-6 16:19
我对任务的理解就是链表,不知是否正确,请教一下如果多个任务用到同一个比如串口,怎么协调。 ...

互斥量或者信号量都可以解决冲突的问题!

出0入0汤圆

发表于 2014-9-6 16:19:17 | 显示全部楼层
我对任务的理解就是链表,不知是否正确,请教一下如果多个任务用到同一个比如串口,怎么协调。

出0入0汤圆

 楼主| 发表于 2014-9-6 10:44:01 | 显示全部楼层
myxiaonia 发表于 2014-9-6 07:55
RTT是静态和动态都支持,为何我说只有静态很有局限性呢,高稳健性应用中会有一个最高优先级的任务监视其 ...

如果是你说的这个功能的话,MQX的任务也可以退出,然后重启!呵呵!

出0入0汤圆

发表于 2014-9-6 07:55:39 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-9-6 07:57 编辑
wangpengcheng 发表于 2014-9-6 00:54
我试过在任务中创建任务,但也需要是在任务列表中列出子任务,从根本上讲,还属于静态的,由任务创建函数 ...


RTT是静态和动态都支持,为何我说只有静态很有局限性呢,高稳健性应用中会有一个最高优先级的任务监视其他所有的任务,相当于os自带的一个看门狗,这个狗死掉了才会导致硬件看门狗复位。
在这个监视任务中,它如果发现某个任务长时间不响应或者死掉,就需要重启这个任务,显然静态任务的方法很难完成,动态任务就简单多了,杀死这个任务,重新启动这个任务

出0入0汤圆

 楼主| 发表于 2014-9-6 00:56:21 来自手机 | 显示全部楼层
rockyyangyang 发表于 2014-9-5 23:18
自己很想入门一个系统,不知道现在MQX用的多吗?如果入门直接学这个会不会有什么难度。 ...

系统都差不多,不难,关键是理解应用

出0入0汤圆

 楼主| 发表于 2014-9-6 00:54:44 来自手机 | 显示全部楼层
myxiaonia 发表于 2014-9-5 22:42
楼主位用了个任务列表数组,表面mqx支持静态任务创建,不知道其是否支持动态任务创建方式,否则局限性是很 ...

我试过在任务中创建任务,但也需要是在任务列表中列出子任务,从根本上讲,还属于静态的,由任务创建函数的参数输入,你能看出它不支持你想的那种动态创建,我的看法是这样,可能我只是应用,还有些东西没接触到,不过RTT系统支持你说的那种,我用过非常灵活好用

出0入0汤圆

 楼主| 发表于 2014-9-6 00:44:56 来自手机 | 显示全部楼层
步之道 发表于 2014-9-5 22:12
你说的这个延时是指调用定时器类的延时,这种延时应该是指进入延时,多长时间后回来后执行下一个动作,所 ...

为什么要用“硬延时”呢?如果要准确延时,定时器就可以

出0入0汤圆

发表于 2014-9-5 23:18:31 | 显示全部楼层
自己很想入门一个系统,不知道现在MQX用的多吗?如果入门直接学这个会不会有什么难度。

出0入0汤圆

发表于 2014-9-5 22:45:07 | 显示全部楼层
myxiaonia 发表于 2014-9-5 22:35
硬延时是什么意思,是指用循环方式,用指令来延时吗?这种方法是无解的
时间戳和定时器时间差这种方式的 ...

我所说的就是这个意思,不阻塞延时,这样也就是任务占用时间最少,楼主文档中是这么写的   _time_delay(1000);因为没给这个延时的函数,不清楚是什么样的延时故我才有了那个讨论。后来楼主解释了,不能用OS接口以外的延时函数,。并且如果延时时间小于1tick,是做不到的。

出0入0汤圆

发表于 2014-9-5 22:42:27 | 显示全部楼层
楼主位用了个任务列表数组,表面mqx支持静态任务创建,不知道其是否支持动态任务创建方式,否则局限性是很大的
后文提到可以在函数中创建子任务,也就是说任务可以有父子关系,不知道任务调度时是怎么处理的?linux貌似就可以fork子进程,但是我不懂linux,这样创建的子进程有什么特殊之处

MDK自带的RTX是动态创建任务的典型rtos,它不支持静态任务,因为静态任务完全可以被动态任务取代,反之则不行

出0入0汤圆

发表于 2014-9-5 22:37:50 | 显示全部楼层

time 变量还没说呢?

出0入0汤圆

发表于 2014-9-5 22:35:19 | 显示全部楼层
步之道 发表于 2014-9-5 22:12
你说的这个延时是指调用定时器类的延时,这种延时应该是指进入延时,多长时间后回来后执行下一个动作,所 ...

硬延时是什么意思,是指用循环方式,用指令来延时吗?这种方法是无解的
时间戳和定时器时间差这种方式的延时可以不阻塞延时,这时用状态机方法可以做到不阻塞

出0入0汤圆

发表于 2014-9-5 22:12:55 | 显示全部楼层
myxiaonia 发表于 2014-9-5 21:41
你所说的是裸奔情况,在带os的程序中是可以延时的,os自带延时api

你说的这个延时是指调用定时器类的延时,这种延时应该是指进入延时,多长时间后回来后执行下一个动作,所以看起来是执行了一个延时程序。你要是执行一个“硬延时”,进程一直占用着,从实时性来说你怎么解决呢。望科普。。。

出0入0汤圆

 楼主| 发表于 2014-9-5 22:08:13 | 显示全部楼层
street 发表于 2014-9-5 22:02
请问 适用于飞思卡尔是不是也支持其他的单片机 比如STM32?
还有输出的那个 time变量是系统自带 ...

请看52楼!

出0入0汤圆

发表于 2014-9-5 22:02:30 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...

请问 适用于飞思卡尔是不是也支持其他的单片机 比如STM32?
还有输出的那个 time变量是系统自带的? 主要作用是?

pS:正在学习STM32。刚刚看了一个飞思卡尔的视频觉得很牛B 想学习一下。。并非砸场子。

出0入0汤圆

发表于 2014-9-5 21:41:12 来自手机 | 显示全部楼层
步之道 发表于 2014-9-5 13:00
1、对于任务中的延时,如果是用delay来写的话我建议是不要用,如果真要延时那就调用定时器计时器。比如你 ...

你所说的是裸奔情况,在带os的程序中是可以延时的,os自带延时api

出0入0汤圆

发表于 2014-9-5 19:28:11 | 显示全部楼层
wangpengcheng 发表于 2014-9-5 11:42
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延 ...

说的不错,慢慢看了

出0入0汤圆

发表于 2014-9-5 14:03:46 | 显示全部楼层
开源的就是好呀,以后多学习了

出0入0汤圆

发表于 2014-9-5 14:03:43 | 显示全部楼层
步之道 发表于 2014-9-5 13:38
好像我们现在的分歧就是任务里有delay延时好不好,还有一个就是函数能不能调用任务。有无主次之分。你说 ...

插不上嘴,没整过,我是来跟二位学习的

出0入0汤圆

发表于 2014-9-5 13:53:34 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...

原来飞思卡尔还有自己的RTOS的啊,不错啊,还是免费,开源的

出0入0汤圆

发表于 2014-9-5 13:47:12 | 显示全部楼层
以后得跟着楼主来学习了,这个讲的不错,赞

出0入0汤圆

发表于 2014-9-5 13:38:54 | 显示全部楼层
cn_x 发表于 2014-9-5 13:34
帖子和回复都很认真哦,搬个板凳学习了

好像我们现在的分歧就是任务里有delay延时好不好,还有一个就是函数能不能调用任务。有无主次之分。你说说呢,我已经准备回家看书了,暂时说服不了企鹅兄。

出0入0汤圆

发表于 2014-9-5 13:37:50 | 显示全部楼层
这贴子大赞

出0入0汤圆

发表于 2014-9-5 13:36:38 | 显示全部楼层
LZ 整了个 Tower啊~~

怎么样啊

出0入0汤圆

发表于 2014-9-5 13:35:10 | 显示全部楼层
步之道 发表于 2014-9-5 13:27
好吧,我回去再看看书,哈哈

技术讨论很涨知识哦,强势围观

出0入0汤圆

发表于 2014-9-5 13:34:16 | 显示全部楼层
wangpengcheng 发表于 2014-9-5 11:42
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延 ...

帖子和回复都很认真哦,搬个板凳学习了

出0入0汤圆

发表于 2014-9-5 13:27:49 | 显示全部楼层
wangpengcheng 发表于 2014-9-5 13:20
呵呵,其实我把任务不看作多高级,它的确是一个函数,我做模块化的时候会把任务做成模块里面的一个函数, ...

好吧,我回去再看看书,哈哈

出0入0汤圆

 楼主| 发表于 2014-9-5 13:20:06 | 显示全部楼层
步之道 发表于 2014-9-5 13:00
1、对于任务中的延时,如果是用delay来写的话我建议是不要用,如果真要延时那就调用定时器计时器。比如你 ...

呵呵,其实我把任务不看作多高级,它的确是一个函数,我做模块化的时候会把任务做成模块里面的一个函数,呵呵,保持思路清晰!

出0入0汤圆

发表于 2014-9-5 13:00:49 | 显示全部楼层
wangpengcheng 发表于 2014-9-5 11:42
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延 ...

1、对于任务中的延时,如果是用delay来写的话我建议是不要用,如果真要延时那就调用定时器计时器。比如你要开一个灯然后延时30s,关一个灯,你不需要在那等30S,在这期间你还可以进行其他任务,比如执行10个开销3秒的任务。
2、在我看来我认为任务的层次比函数高,我不太喜欢那种我中有你,你中有我的程序思想。我的基本思想是函数是一个个的元素,任务调用多个函数或者任务进行组合实现相应功能。因为函数基本上都是封装好的在底层。
3、任务不一定要有输入参数的,举例说,如果我有这么一个任务,1个程序运行周期检查一次网络连接状态,我就把它放在while中就可以了嘛。
不对的请指正

出0入0汤圆

 楼主| 发表于 2014-9-5 11:42:20 | 显示全部楼层
步之道 发表于 2014-9-5 11:27
帮楼主补充一点,企鹅兄勿怪。
1、任务里不能有延时函数,任务要求快速响应,快速结束。
2、要把任务和函 ...

参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延时函数(不是不能延时,最好不要用OS接口以外的延时函数,如果需要延时一个TICK以上,都可以用OS延时函数延时,比如我的例子),任务要求快速响应,快速结束。
2、要把任务和函数区分开,不同点:1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。(这块你说的正确,呵呵,我也是这么理解的,函数是任务间的调用,占用任务时间;而两个不同的任务各自有各自的运行时间)
                                                  2) 函数不能启动任务,而任务能启动其它任务和函数。(可以在函数中来创建任务,调用任务创建函数来做就可以了,只是创建的这个任务属于目前函数所在任务的子任务,当然,任务的参数什么的,需要用malloc来申请内存,要不此函数结束后可能一些临时参数会被释放,所以最好是用申请的)
                                                  3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。(函数的输入变量我就不说了,而任务的输入参数必须得有,因为任务调用是利用了函数指针,而它的类型是定的,如果需要的参数多了,要用结构体,像MQX的任务参数只有一个,我用结构体将指针作为参数)
                                                  4) 函数返回一个值,而任务则不返回值。
                        函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出去。
3、按照上面说的,如果要对任务中产生的结果,做相应的动作,可以根据这个动作的优先级再新建一个任务,来执行。

出0入0汤圆

发表于 2014-9-5 11:27:48 | 显示全部楼层
wangpengcheng 发表于 2014-9-5 11:12
没用过MSOS,呵呵,其实不管是基于什么,要看你怎么用了,我感觉一般情况都够用,主要还是自己的软件架构 ...

帮楼主补充一点,企鹅兄勿怪。
1、任务里不能有延时函数,任务要求快速响应,快速结束。
2、要把任务和函数区分开,不同点:1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
                                                  2) 函数不能启动任务,而任务能启动其它任务和函数。
                                                  3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。
                                                  4) 函数返回一个值,而任务则不返回值。
                        函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出去。
3、按照上面说的,如果要对任务中产生的结果,做相应的动作,可以根据这个动作的优先级再新建一个任务,来执行。

出0入0汤圆

 楼主| 发表于 2014-9-5 11:12:20 | 显示全部楼层
步之道 发表于 2014-9-5 11:08
想问一下楼主,MQX是否是基于时间片选来进行任务开启和关闭的?还有更以前的MSos有什么区别呢。如果是基于 ...

没用过MSOS,呵呵,其实不管是基于什么,要看你怎么用了,我感觉一般情况都够用,主要还是自己的软件架构,需要实时的可以用中断来做!

出0入0汤圆

发表于 2014-9-5 11:08:18 | 显示全部楼层
想问一下楼主,MQX是否是基于时间片选来进行任务开启和关闭的?还有更以前的MSos有什么区别呢。如果是基于时间片选的话,那么只能做到相当时间精度吧。

出0入0汤圆

发表于 2014-9-5 10:56:05 | 显示全部楼层
喜欢这样的贴子

谢谢LZ

出0入0汤圆

发表于 2014-9-5 10:48:21 | 显示全部楼层
哈哈,又见楼主,路过

出0入0汤圆

 楼主| 发表于 2014-9-5 10:40:20 | 显示全部楼层
zyw19987 发表于 2014-9-5 07:41
能否移植到其他CPU上?
对CPU有什么要求啊

飞思卡尔自己免费开源的东西,当然只是在飞思卡尔自己的芯片上用起来才方便啊!

出0入0汤圆

 楼主| 发表于 2014-9-5 10:37:44 | 显示全部楼层
湛泸骏驰 发表于 2014-9-4 23:01
mqx跑起来硬件什么要求呢。。。

Kinetis中M4可以跑MQX,M0+可以跑MQXLite

出0入0汤圆

发表于 2014-9-5 08:31:42 | 显示全部楼层
LZ 又要神酷啊~

出0入0汤圆

发表于 2014-9-5 08:31:18 | 显示全部楼层
支持楼主,好强大的说..............

出0入0汤圆

发表于 2014-9-5 08:31:03 | 显示全部楼层
哈!进来学习露珠的大作。

出0入0汤圆

发表于 2014-9-5 08:28:23 | 显示全部楼层
看好楼主,顶了!多分享资料哦

出0入0汤圆

发表于 2014-9-5 08:25:39 | 显示全部楼层
写的不错,赞一个   

出0入0汤圆

发表于 2014-9-5 08:11:48 | 显示全部楼层
感觉好复杂啊,看的都头晕完了

出500入109汤圆

发表于 2014-9-5 08:03:34 | 显示全部楼层
果然有干货,学MQX就靠你啦

出0入0汤圆

发表于 2014-9-5 07:41:11 来自手机 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...

能否移植到其他CPU上?
对CPU有什么要求啊

出0入0汤圆

发表于 2014-9-4 23:34:25 来自手机 | 显示全部楼层
向楼主学习学习

出0入0汤圆

发表于 2014-9-4 23:32:11 | 显示全部楼层
wxfje 发表于 2014-9-4 23:30
确定优先级确实比较难啃

而且那种东西自己写程序很难用上。

出0入0汤圆

发表于 2014-9-4 23:30:50 | 显示全部楼层
laotui 发表于 2014-9-4 23:03
看哪个查表确定优先级,郁闷了好久,操作系统毕竟太复杂了看起来有种管中窥豹的感觉。 ...

确定优先级确实比较难啃

出0入0汤圆

发表于 2014-9-4 23:03:41 | 显示全部楼层
wxfje 发表于 2014-9-4 23:01
看源码一是可以学习编程技巧,二是学习操作系统的处理方式。当然对应用也有帮助,但还是要便用边看源码, ...

看哪个查表确定优先级,郁闷了好久,操作系统毕竟太复杂了看起来有种管中窥豹的感觉。

出0入0汤圆

发表于 2014-9-4 23:03:32 | 显示全部楼层
好哈。一起学。

出0入0汤圆

发表于 2014-9-4 23:01:19 | 显示全部楼层
laotui 发表于 2014-9-4 21:13
我方向弄错了,不应该把操作系统当程序看,也许会用就好了。

看源码一是可以学习编程技巧,二是学习操作系统的处理方式。当然对应用也有帮助,但还是要便用边看源码,加深理解,否则不容易啃呐

出0入0汤圆

发表于 2014-9-4 23:01:12 | 显示全部楼层
mqx跑起来硬件什么要求呢。。。

出0入0汤圆

发表于 2014-9-4 22:58:06 | 显示全部楼层
kinsno 发表于 2014-9-4 21:30
[这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每 ...

这个说的很到位,一般每个任务都加出让cpu的动作只是一种习惯

出0入0汤圆

发表于 2014-9-4 22:56:11 | 显示全部楼层
一直在用ucos,但楼主这么详细的资料,一定要看看,跟着楼主慢慢学

出0入0汤圆

发表于 2014-9-4 22:51:30 | 显示全部楼层
mark,不错哦~           

出0入0汤圆

发表于 2014-9-4 22:49:14 | 显示全部楼层
kinsno 发表于 2014-9-4 21:30
[这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每 ...

看来理解得挺深入
说法很形象

出0入0汤圆

发表于 2014-9-4 22:45:54 | 显示全部楼层
一直想学学MQX,以后就跟着你学了,尽可能详细些吧,OS基础薄弱

出0入0汤圆

发表于 2014-9-4 22:06:57 | 显示全部楼层

一直在灌水哇,,,

出0入0汤圆

发表于 2014-9-4 22:06:49 | 显示全部楼层
看看,学习一下

出0入8汤圆

发表于 2014-9-4 21:56:43 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:37
发帖,回帖,呵呵!回一帖才9分,发一帖27分呢,不小心加个COOL就450分了!你说呢? ...

哈哈,原来发贴积分这么高,我就只回复,没发贴……

出0入0汤圆

发表于 2014-9-4 21:30:16 | 显示全部楼层
本帖最后由 kinsno 于 2014-9-4 21:32 编辑
wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...


[这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每一个任务中,都必须有一个机制,把CPU让出来,如果任务中缺少这个机制,那么CPU就永驻此任务了,别的任务根本运行不到。]

-------------------------------------------------------------------------------------------------------------
我不晓得这个MQX是不是抢占式的,如果不是抢占式的,那我就是来水经验的,哈哈;
如果是,我就说两句:纠正一下,千万不要搞错了啊;
并不是一定要延时或有啥机制来让出OS;高等级的OS不要延时,它是可以欧打小朋友的,然后霸着CPU了,所以高等级的OS任务必须给一个机会交出棒棒糖,要不然低年级的小朋友就只能干看流哈拉子;但是低等级的OS如果霸着CPU,是不需要这个啥机制的,也是可以的,反正来了高等级的小朋友,一顿胖揍,抢走棒棒糖(CPU控制权);
只是习惯性的,在每个任务,加一个延时,或一些信号等待,这样至少让初期入门的兄弟们,少走点弯路,因为他们还没有对抢占有很深刻的理解;

出0入0汤圆

发表于 2014-9-4 21:28:43 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 21:24
没有必要的,呵呵!有时候拿来主义也是比较好的!

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

本版积分规则

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

GMT+8, 2024-5-7 05:08

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

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