搜索
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

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-9-4 20:01:47 | 显示全部楼层
沙发,,,楼主的好资料

出0入0汤圆

发表于 2014-9-4 20:02:14 | 显示全部楼层
哇,大赞

出0入0汤圆

发表于 2014-9-4 20:04:56 | 显示全部楼层
MQX是系统吗?

出0入0汤圆

 楼主| 发表于 2014-9-4 20:06:45 | 显示全部楼层

MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统!

出0入0汤圆

 楼主| 发表于 2014-9-4 20:08:23 | 显示全部楼层
qinshiysb 发表于 2014-9-4 20:01
沙发,,,楼主的好资料

手够快啊!

出0入0汤圆

发表于 2014-9-4 20:10:22 | 显示全部楼层
跟着楼主学OS了。

出0入0汤圆

 楼主| 发表于 2014-9-4 20:11:08 | 显示全部楼层
laotui 发表于 2014-9-4 20:10
跟着楼主学OS了。

我也是个半吊子,一起学吧!

出0入0汤圆

发表于 2014-9-4 20:11:35 | 显示全部楼层
哇,直接上os啊

出0入0汤圆

发表于 2014-9-4 20:13:35 | 显示全部楼层
看着真不错啊,多谢分享

出0入0汤圆

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

我说内容看起来这么想实时系统

出0入0汤圆

 楼主| 发表于 2014-9-4 20:15:26 | 显示全部楼层
yzb1019 发表于 2014-9-4 20:14
我说内容看起来这么想实时系统

呵呵,本来就是!有兴趣没?

出0入0汤圆

发表于 2014-9-4 20:17:32 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:11
我也是个半吊子,一起学吧!

大哥你太谦虚了哦,我之前学过ucos,信号量邮箱一直理解不好,看这个操作系统好像是时间片轮转的吧。

出0入0汤圆

发表于 2014-9-4 20:20:16 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:15
呵呵,本来就是!有兴趣没?

你看着和其它操作系统比起来怎么样啊,这个得观察一下

出0入0汤圆

 楼主| 发表于 2014-9-4 20:20:39 | 显示全部楼层
laotui 发表于 2014-9-4 20:17
大哥你太谦虚了哦,我之前学过ucos,信号量邮箱一直理解不好,看这个操作系统好像是时间片轮转的吧。 ...

呵呵,好像是的,我是拿来主义,只要能用就行,碰到问题再深入,没有问题那就这样了!

出100入0汤圆

发表于 2014-9-4 20:21:16 | 显示全部楼层
支持楼主。这是回馈Freescale的最好方式了

出0入0汤圆

 楼主| 发表于 2014-9-4 20:21:37 | 显示全部楼层
yzb1019 发表于 2014-9-4 20:20
你看着和其它操作系统比起来怎么样啊,这个得观察一下

比UCOSII档次高一点!用起来还行,呵呵!

出0入0汤圆

 楼主| 发表于 2014-9-4 20:22:33 | 显示全部楼层
focus012 发表于 2014-9-4 20:21
支持楼主。这是回馈Freescale的最好方式了

其实我也是个半吊子,想法是一起讨论一起学习!

出0入0汤圆

发表于 2014-9-4 20:24:10 | 显示全部楼层
再出些经典的评测,让大家学习下

出0入0汤圆

发表于 2014-9-4 20:24:14 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:20
呵呵,好像是的,我是拿来主义,只要能用就行,碰到问题再深入,没有问题那就这样了!  ...

看楼主回复这个要比ucosII高级等待明天发源码了。

出0入4汤圆

发表于 2014-9-4 20:24:28 | 显示全部楼层
楼主拿到Tower是我等的福利啊,等待更多测试评估。

出0入0汤圆

发表于 2014-9-4 20:24:39 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:21
比UCOSII档次高一点!用起来还行,呵呵!

其实要求不用太高,人家还提供技术支持,芯片适配。挺不错

出0入0汤圆

 楼主| 发表于 2014-9-4 20:25:39 | 显示全部楼层
laotui 发表于 2014-9-4 20:24
看楼主回复这个要比ucosII高级等待明天发源码了。

呵呵,源码只是应用部分,你如果想要就去官网上下载安装包!

出0入0汤圆

 楼主| 发表于 2014-9-4 20:26:41 | 显示全部楼层
yzb1019 发表于 2014-9-4 20:24
其实要求不用太高,人家还提供技术支持,芯片适配。挺不错

关键是方便,它有K系列基本所有外设的驱动,都不用你去做,用别的系统还得自己做,麻烦!

出100入101汤圆

发表于 2014-9-4 20:26:53 | 显示全部楼层
LZ原创,精品!

出0入8汤圆

发表于 2014-9-4 20:28:22 | 显示全部楼层
支持原创,话说楼主拿到塔式后就又这么多飞币啦,羡慕啊

出0入0汤圆

 楼主| 发表于 2014-9-4 20:37:16 | 显示全部楼层
Jmhh247 发表于 2014-9-4 20:28
支持原创,话说楼主拿到塔式后就又这么多飞币啦,羡慕啊

发帖,回帖,呵呵!回一帖才9分,发一帖27分呢,不小心加个COOL就450分了!你说呢?

出0入0汤圆

发表于 2014-9-4 20:50:10 来自手机 | 显示全部楼层
mark记录

出0入0汤圆

发表于 2014-9-4 20:56:53 | 显示全部楼层
这个跑官方开发的系统么?

出0入0汤圆

发表于 2014-9-4 21:04:53 | 显示全部楼层
看楼主直播.

出0入0汤圆

发表于 2014-9-4 21:13:56 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 20:25
呵呵,源码只是应用部分,你如果想要就去官网上下载安装包!

我方向弄错了,不应该把操作系统当程序看,也许会用就好了。

出0入0汤圆

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

我一般情况是如果不是调不一下,都不会跟到系统里面去!除非调不下去了,有的变量不受控的时候才会去看看!

出0入0汤圆

发表于 2014-9-4 21:23:02 | 显示全部楼层
wangpengcheng 发表于 2014-9-4 21:17
我一般情况是如果不是调不一下,都不会跟到系统里面去!除非调不下去了,有的变量不受控的时候才会去看看 ...

我得方向确实有问题,学ucos的时候一个文件一个文件的看结果到最后还是运行个程序直观。

出0入0汤圆

 楼主| 发表于 2014-9-4 21:24:09 | 显示全部楼层
laotui 发表于 2014-9-4 21:23
我得方向确实有问题,学ucos的时候一个文件一个文件的看结果到最后还是运行个程序直观。 ...

没有必要的,呵呵!有时候拿来主义也是比较好的!

出0入0汤圆

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

后来我也意识到了但一直没遇上需要用操作系统的设计,就搁浅了,等你的应用部分了。

出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入8汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

一直在灌水哇,,,

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

确定优先级确实比较难啃

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出500入109汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

谢谢LZ

出0入0汤圆

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

出0入0汤圆

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

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

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

怎么样啊

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

说的不错,慢慢看了

出0入0汤圆

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

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

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

请看52楼!

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

time 变量还没说呢?

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2014-9-6 00:56:21 来自手机 | 显示全部楼层
rockyyangyang 发表于 2014-9-5 23:18
自己很想入门一个系统,不知道现在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 10:44:01 | 显示全部楼层
myxiaonia 发表于 2014-9-6 07:55
RTT是静态和动态都支持,为何我说只有静态很有局限性呢,高稳健性应用中会有一个最高优先级的任务监视其 ...

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-25 16:03

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

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