原创:我跟你一起学MQX(一):任务
本帖最后由 wangpengcheng 于 2014-9-5 11:15 编辑拿到塔式板了,我的心也实在了,只是莫大说让我发表个测评,这东西我还真没做过,呵呵,不知道如何进行!不过我这个马甲也注册半年了,从最低的注册会员都升到金牌会员了,一直在这里混,接触很多热心的坛友,帮过我很多,尤其是那几个版主,在这里我得谢谢大家!
我是从去年开始接触MQX的,以前学OS是从RTT开始学的,我觉得RTT的应用手册帮了我很大忙,按它一步一步了解OS。在没接触过OS之前,总觉得高上大,好难哦,尤其是LINUX,里面东西好多,根本就看不过来,而且没有实际的项目实战,真难啊。但是从这些小的系统里面,才真正看到OS的核心所在。其实我感觉用起来都差不多,主要是个思想,只是接口函数跟一些内部深入的东西会有一些差别,当然接口函数我们都可以在.h文件中找得到,至于内部比较深的东西,我暂时还没接触到。呵呵,其实我也只是知道个皮毛!
不过最近在坛子里碰到一些坛友,跟我以前一样,对OS没有一个明确的概念,当然,也有许多高手。所以我就有那么一点点想法,从MQX入手,把我理解的OS的概念表述出来!现在又有了塔式板,我想我可以将我这个想法付诸于行动了。如果有的观点大家认同,给个掌声鼓励一下;如果觉得有异议,我们可以一起讨论。
以后我想,如果大家觉得还可以,我会不定期的来做这件事情,这个帖子算是个开头吧。
好吧,废话说了不少,开始我们第一个认识:任务
任务肯定都听说过,这个比较简单,在OS中,任务的作用是把不同的事情分开来做,我把它理解成一个任务就是一个过程,有的过程是一次性的,有的过程是循环进行的!任何一个OS最基本的元素就是任务,OS是做什么的?它是对任务进行调度的,呵呵,我个人理解,它就是个指挥员,它会根据事先定义好的一些规则,来把时间分配给各个任务,并让每个任务顺利进行!它是怎么做的,我不管他,其实我也管不了{:titter:} ,我只知道他需要什么,我给他就可以了!
现在我打开MQX例子中最简单的一个Hello,它的路径在:..\Freescale\Freescale_MQX_4_1\mqx\examples\hello\build\uv4\hello_twrk60f120m
打开后可以看到里面就一个.c文件,非常简单,它里面有一个任务模板列表:
const TASK_TEMPLATE_STRUCTMQX_template_list[] =
{
/* Task Index, Function, Stack,Priority, Name, Attributes, Param, Time Slice */
{ HELLO_TASK, hello_task, 1500, 8, "hello",MQX_AUTO_START_TASK, 0, 0 },
{ 0 }
};
这个列表是一个结构体数组,它包含的是任务模板结构体,任务模板结构体的定义在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.
任务的栈空间:你要了解,你在任务中,所有的局部变量内存都是从这个空间里分配得到的。所以这个空间大小很重要,如果小了,分配内存会超出栈空间,造成内存混乱而发生不可预知的事情。如果太大了,浪费!
优先级:提到优先级,大家肯定不陌生了,中断都是按优先级来排的,这里是一个道理,你想哪个任务多跑几趟,那就给它高点,呵呵!
任务属性:目前的属性我英文不怎么滴也看明白了,是说这个任务是一个自启动的任务。嗯,说是任务属性当然会有选项了,我找到它定义的地方,肯定有一堆跟他类似的东西,看吧,果真有:
/*--------------------------------------------------------------------------*/
/*
* TASK TEMPLATE ATTRIBUTES FLAGS
*
* These are bit flags or'd together to form the creation attributes for
* a task. This is combined with INTERNAL TASK FLAGS.
*/
/*
* Tasks with this attribute will be created automatically at
* system initialization time.
*/
#define MQX_AUTO_START_TASK (0x01)
/*
* Tasks with this attribute will save the floating point co-processor
* registers during context switching.
* If the floating point registers are separate from the normal registers,
* their context is managed independently during task switching. The registers
* are saved/restored only when a new floating point task is scheduled to run.
*/
#define MQX_FLOATING_POINT_TASK (0x02)
/*
* Tasks with this attribute will use the time slice
* scheduler within the kernel
*/
#if MQX_HAS_TIME_SLICE
#define MQX_TIME_SLICE_TASK (0x04)
#endif
/*
* Tasks with this attribute will save the DSP co-processor
* registers during context switching.
* If the DSP registers are separate from the normal registers,
* their context is managed independently during task switching. The registers
* are saved/restored only when a new DSP task is scheduled to run.
*/
#define MQX_DSP_TASK (0x08)
#if MQX_ENABLE_USER_MODE
#define MQX_USER_TASK (0x10)
#else
#define MQX_USER_TASK (0)
#endif
看一下,它一共有5个选项可选,它们分别是:
自启动——当MQX 开始运行时,它生成任务的一个实例;
DSP——MQX 保存DSP 协处理器寄存器作为任务现场的一部分;
浮点——MQX 保存浮点寄存器作为任务现场的一部分;
时间片——MQX 为任务使用轮循调度(默认是FIFO 调度);
用户任务——MQX为用户指定的任务
其实上面这些个属性我只用过自启动,其它的都没用过!也不知道什么情况下用,不过不要紧,目前已经够我用了,现在先了解一下,哪天说不定就理解并应用了。
还有其它两个:
任务参数:有时候会有用,但是它是一个(void *)型的指针,用的时候需要进行强制转换,现在不管他
时间片:我也没用过,呵呵
现在再看一下这个任务函数:
/*TASK*-----------------------------------------------------
*
* Task Name : hello_task
* Comments :
* This task prints " Hello World "
*
*END*-----------------------------------------------------*/
void hello_task
(
uint32_t initial_data
)
{
(void)initial_data; /* disable 'unused variable' warning */
printf("Hello World\n");
_task_block();
}
好简单哦,就是打印一个Hello World\n到串口去,然后就退出了。_task_block函数的意思就是切换到其它的任务去,也就是说该任务结束了!
现在我用TWR运行了一下,结果如图所示:
嗯,看来这个任务是只运行一次啊!我想我现在可以修改它,让它变成循环运行,我想让它每一秒就输出一次:
void hello_task
(
uint32_t initial_data
)
{
(void)initial_data; /* disable 'unused variable' warning */
int i;
for(i = 0; ;i++)
{
printf("Hello World %d time\n", i);
_time_delay(1000);
}
// _task_block();
}
这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每一个任务中,都必须有一个机制,把CPU让出来,如果任务中缺少这个机制,那么CPU就永驻此任务了,别的任务根本运行不到。在这个任务中,我用到延时来处理的。当然还有其它的一些机制,我们以后再说! _time_delay延时函数是MQX系统的一个函数接口,在处理延时的时候,CPU会去做别的事情,一直到该任务延时结束并且没有比它更高优先级的任务就绪,它才会继续运行。所以这个延时函数是一个大概的时间,不能用来精确计时。
在mqx.h文件中,我们可以找到很多关于时间的函数接口,他们定义在一起,都是MQX系统拥有的,可以按场合进行调用。
改完后的任务运行结果如下:
看到了吧,效果是明显的!
再接下来,我又想添加一个任务,让两个任务同时运行,好吧,这回我们既然要添加任务,就要改动任务列表了:
const TASK_TEMPLATE_STRUCTMQX_template_list[] =
{
/* Task Index, Function, Stack,Priority, Name, Attributes, Param, Time Slice */
{ HELLO_TASK, hello_task, 1500, 8, "hello",MQX_AUTO_START_TASK, 0, 0 },
{ YES_TASK, yes_task, 1500, 9, "yes", MQX_AUTO_START_TASK, 0, 0},
{ 0 }
};
在任务列表中,我添加了一个yes任务,当然,任务ID我用宏定义在文件前面已经定义了,它不会凭空出现的,呵呵。这个任务也属于自启动任务,任务函数如下:
void yes_task(uint32_t para)
{
int i;
for(i = 0; ;i++)
{
printf("yes? %d time\n", i);
_time_delay(1000);
}
}
我也是让它每一秒输出一次yes,呵呵,既然有人叫,咱就应一下吧,编译下载后,我们看结果是不是叫一秒叫一次,这边应一次:
看到了吧,是真的!呵呵!现在我已经成功的跑起来两个任务了!当然你如果还想加的话,可以随便加哦,只要不超过255个{:titter:}
这个是简单的两个任务,其实还有其它的方法创建任务,比如用MQX接口函数来创建,任务也有一堆接口函数:
extern _mqx_uint _task_abort(_task_id);
extern void _task_block(void);
extern bool _task_check_stack(void);
extern _task_id _task_create(_processor_number, _mqx_uint, uint32_t);
extern _task_id _task_create_blocked(_processor_number, _mqx_uint, uint32_t);
extern _task_id _task_create_at(_processor_number, _mqx_uint,
uint32_t, void *, _mem_size);
extern _mqx_uint _task_destroy(_task_id);
extern void _task_disable_fp(void);
extern bool _task_enable_fp(void);
extern _task_id _task_get_creator(void);
extern void *_task_get_environment(_task_id);
extern TASK_EXCEPTION_FPTR _task_get_exception_handler(_task_id);
extern _mqx_uint _task_get_error(void);
extern _mqx_uint *_task_get_error_ptr(void);
extern TASK_EXIT_FPTR _task_get_exit_handler(_task_id);
extern _task_id _task_get_id(void);
extern _task_id _task_get_id_from_name(char *);
extern _task_id _task_get_id_from_td(void *);
extern _mqx_uint _task_get_index_from_id(_task_id);
extern uint32_t _task_get_parameter(void);
extern uint32_t _task_get_parameter_for(_task_id);
extern _processor_number _task_get_processor(_task_id);
extern _mqx_uint _task_get_priority(_task_id, _mqx_uint_ptr);
extern void *_task_get_td(_task_id);
extern _mqx_uint _task_get_template_index(char *);
extern TASK_TEMPLATE_STRUCT_PTR _task_get_template_ptr(_task_id);
extern void _task_ready(void *);
extern _mqx_uint _task_restart(_task_id, uint32_t *, bool);
extern void *_task_set_environment(_task_id, void *);
extern _mqx_uint _task_set_error(_mqx_uint);
extern TASK_EXCEPTION_FPTR _task_set_exception_handler(_task_id,TASK_EXCEPTION_FPTR);
extern TASK_EXIT_FPTR _task_set_exit_handler(_task_id,TASK_EXIT_FPTR);
extern uint32_t _task_set_parameter(uint32_t);
extern uint32_t _task_set_parameter_for(uint32_t, _task_id);
extern _mqx_uint _task_set_priority(_task_id, _mqx_uint, _mqx_uint_ptr);
extern void _task_stop_preemption(void);
extern void _task_start_preemption(void);
extern _mqx_uint _task_reserve_space(_mqx_uint);
extern void *_task_get_reserved_base(void);
#if MQX_ENABLE_USER_MODE
extern _task_id _usr_task_create(_processor_number, _mqx_uint, uint32_t);
extern _mqx_uint _usr_task_destroy(_task_id);
extern _mqx_uint _usr_task_abort(_task_id task_id);
extern _mqx_uint _usr_task_set_error(_mqx_uint);
extern void *_usr_task_get_td(_task_id);
extern void _usr_task_ready(void *);
#endif
extern void *_taskq_create(_mqx_uint);
extern _mqx_uint _taskq_destroy(void *);
extern _mqx_uint _taskq_resume(void *, bool);
extern _mqx_uint _taskq_suspend(void *);
extern _mqx_uint _taskq_suspend_task(_task_id, void *);
extern _mqx_uint _taskq_test(void **, void **);
extern _mqx_uint _taskq_get_value(void *);
这些都在mqx.h中可以找得到,也在《Freescale MQX实时操作系统用户手册》中有说明,甚至有一些还有例程。我就不再说了!
现在已经把任务跑起来了,下次我想我应该做任务的同步了!
希望能对想学OS的同学有帮助!话说我今天真的把附件用完了,现在想把源文件传上来也传不了了!{:funk:}
沙发,,,楼主的好资料 哇,大赞 MQX是系统吗? yzb1019 发表于 2014-9-4 20:04
MQX是系统吗?
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! qinshiysb 发表于 2014-9-4 20:01
沙发,,,楼主的好资料
手够快啊! 跟着楼主学OS了。 laotui 发表于 2014-9-4 20:10
跟着楼主学OS了。
我也是个半吊子,一起学吧! 哇,直接上os啊 看着真不错啊,多谢分享 wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...
我说内容看起来这么想实时系统 yzb1019 发表于 2014-9-4 20:14
我说内容看起来这么想实时系统
呵呵,本来就是!有兴趣没? wangpengcheng 发表于 2014-9-4 20:11
我也是个半吊子,一起学吧!
大哥你太谦虚了哦,我之前学过ucos,信号量邮箱一直理解不好,看这个操作系统好像是时间片轮转的吧。 wangpengcheng 发表于 2014-9-4 20:15
呵呵,本来就是!有兴趣没?
你看着和其它操作系统比起来怎么样啊,这个得观察一下 laotui 发表于 2014-9-4 20:17
大哥你太谦虚了哦,我之前学过ucos,信号量邮箱一直理解不好,看这个操作系统好像是时间片轮转的吧。 ...
呵呵,好像是的,我是拿来主义,只要能用就行,碰到问题再深入,没有问题那就这样了!{:titter:} 支持楼主。这是回馈Freescale的最好方式了 yzb1019 发表于 2014-9-4 20:20
你看着和其它操作系统比起来怎么样啊,这个得观察一下
比UCOSII档次高一点!用起来还行,呵呵! focus012 发表于 2014-9-4 20:21
支持楼主。这是回馈Freescale的最好方式了
其实我也是个半吊子,想法是一起讨论一起学习! 再出些经典的评测,让大家学习下 wangpengcheng 发表于 2014-9-4 20:20
呵呵,好像是的,我是拿来主义,只要能用就行,碰到问题再深入,没有问题那就这样了!...
看楼主回复这个要比ucosII高级等待明天发源码了。 楼主拿到Tower是我等的福利啊,等待更多测试评估。 wangpengcheng 发表于 2014-9-4 20:21
比UCOSII档次高一点!用起来还行,呵呵!
其实要求不用太高,人家还提供技术支持,芯片适配。挺不错 laotui 发表于 2014-9-4 20:24
看楼主回复这个要比ucosII高级等待明天发源码了。
呵呵,源码只是应用部分,你如果想要就去官网上下载安装包! yzb1019 发表于 2014-9-4 20:24
其实要求不用太高,人家还提供技术支持,芯片适配。挺不错
关键是方便,它有K系列基本所有外设的驱动,都不用你去做,用别的系统还得自己做,麻烦! LZ原创,精品! 支持原创,话说楼主拿到塔式后就又这么多飞币啦,羡慕啊{:smile:} Jmhh247 发表于 2014-9-4 20:28
支持原创,话说楼主拿到塔式后就又这么多飞币啦,羡慕啊
发帖,回帖,呵呵!回一帖才9分,发一帖27分呢,不小心加个COOL就450分了!你说呢? mark记录 这个跑官方开发的系统么? 看楼主直播. wangpengcheng 发表于 2014-9-4 20:25
呵呵,源码只是应用部分,你如果想要就去官网上下载安装包!
我方向弄错了,不应该把操作系统当程序看,也许会用就好了。 laotui 发表于 2014-9-4 21:13
我方向弄错了,不应该把操作系统当程序看,也许会用就好了。
我一般情况是如果不是调不一下,都不会跟到系统里面去!除非调不下去了,有的变量不受控的时候才会去看看! wangpengcheng 发表于 2014-9-4 21:17
我一般情况是如果不是调不一下,都不会跟到系统里面去!除非调不下去了,有的变量不受控的时候才会去看看 ...
我得方向确实有问题,学ucos的时候一个文件一个文件的看结果到最后还是运行个程序直观。 laotui 发表于 2014-9-4 21:23
我得方向确实有问题,学ucos的时候一个文件一个文件的看结果到最后还是运行个程序直观。 ...
没有必要的,呵呵!有时候拿来主义也是比较好的! wangpengcheng 发表于 2014-9-4 21:24
没有必要的,呵呵!有时候拿来主义也是比较好的!
后来我也意识到了但一直没遇上需要用操作系统的设计,就搁浅了,等你的应用部分了。 本帖最后由 kinsno 于 2014-9-4 21:32 编辑
wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...
[这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每一个任务中,都必须有一个机制,把CPU让出来,如果任务中缺少这个机制,那么CPU就永驻此任务了,别的任务根本运行不到。]
-------------------------------------------------------------------------------------------------------------
我不晓得这个MQX是不是抢占式的,如果不是抢占式的,那我就是来水经验的,哈哈;
如果是,我就说两句:纠正一下,千万不要搞错了啊;
并不是一定要延时或有啥机制来让出OS;高等级的OS不要延时,它是可以欧打小朋友的,然后霸着CPU了,所以高等级的OS任务必须给一个机会交出棒棒糖,要不然低年级的小朋友就只能干看流哈拉子;但是低等级的OS如果霸着CPU,是不需要这个啥机制的,也是可以的,反正来了高等级的小朋友,一顿胖揍,抢走棒棒糖(CPU控制权);
只是习惯性的,在每个任务,加一个延时,或一些信号等待,这样至少让初期入门的兄弟们,少走点弯路,因为他们还没有对抢占有很深刻的理解; wangpengcheng 发表于 2014-9-4 20:37
发帖,回帖,呵呵!回一帖才9分,发一帖27分呢,不小心加个COOL就450分了!你说呢? ...
哈哈,原来发贴积分这么高,我就只回复,没发贴…… 看看,学习一下 wangpengcheng 发表于 2014-9-4 20:08
手够快啊!
一直在灌水哇,,, 一直想学学MQX,以后就跟着你学了,尽可能详细些吧,OS基础薄弱 kinsno 发表于 2014-9-4 21:30
[这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每 ...
看来理解得挺深入
说法很形象 mark,不错哦~ 一直在用ucos,但楼主这么详细的资料,一定要看看,跟着楼主慢慢学 kinsno 发表于 2014-9-4 21:30
[这个代码跟前后台系统的没太大的区别啊,只是加了一个延时1000ms的函数。对的,在这里需要注意的是,每 ...
这个说的很到位,一般每个任务都加出让cpu的动作只是一种习惯 mqx跑起来硬件什么要求呢。。。 laotui 发表于 2014-9-4 21:13
我方向弄错了,不应该把操作系统当程序看,也许会用就好了。
看源码一是可以学习编程技巧,二是学习操作系统的处理方式。当然对应用也有帮助,但还是要便用边看源码,加深理解,否则不容易啃呐 好哈。一起学。 wxfje 发表于 2014-9-4 23:01
看源码一是可以学习编程技巧,二是学习操作系统的处理方式。当然对应用也有帮助,但还是要便用边看源码, ...
看哪个查表确定优先级,郁闷了好久,操作系统毕竟太复杂了看起来有种管中窥豹的感觉。 laotui 发表于 2014-9-4 23:03
看哪个查表确定优先级,郁闷了好久,操作系统毕竟太复杂了看起来有种管中窥豹的感觉。 ...
确定优先级确实比较难啃 wxfje 发表于 2014-9-4 23:30
确定优先级确实比较难啃
而且那种东西自己写程序很难用上。 向楼主学习学习 wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...
能否移植到其他CPU上?
对CPU有什么要求啊 果然有干货,学MQX就靠你啦 感觉好复杂啊,看的都头晕完了 写的不错,赞一个 看好楼主,顶了!多分享资料哦 哈!进来学习露珠的大作。 支持楼主,好强大的说.............. LZ 又要神酷啊~ 湛泸骏驰 发表于 2014-9-4 23:01
mqx跑起来硬件什么要求呢。。。
Kinetis中M4可以跑MQX,M0+可以跑MQXLite zyw19987 发表于 2014-9-5 07:41
能否移植到其他CPU上?
对CPU有什么要求啊
飞思卡尔自己免费开源的东西,当然只是在飞思卡尔自己的芯片上用起来才方便啊! 哈哈,又见楼主,路过 喜欢这样的贴子
谢谢LZ 想问一下楼主,MQX是否是基于时间片选来进行任务开启和关闭的?还有更以前的MSos有什么区别呢。如果是基于时间片选的话,那么只能做到相当时间精度吧。 步之道 发表于 2014-9-5 11:08
想问一下楼主,MQX是否是基于时间片选来进行任务开启和关闭的?还有更以前的MSos有什么区别呢。如果是基于 ...
没用过MSOS,呵呵,其实不管是基于什么,要看你怎么用了,我感觉一般情况都够用,主要还是自己的软件架构,需要实时的可以用中断来做! wangpengcheng 发表于 2014-9-5 11:12
没用过MSOS,呵呵,其实不管是基于什么,要看你怎么用了,我感觉一般情况都够用,主要还是自己的软件架构 ...
帮楼主补充一点,企鹅兄勿怪。
1、任务里不能有延时函数,任务要求快速响应,快速结束。
2、要把任务和函数区分开,不同点:1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
2) 函数不能启动任务,而任务能启动其它任务和函数。
3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。
4) 函数返回一个值,而任务则不返回值。
函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出去。
3、按照上面说的,如果要对任务中产生的结果,做相应的动作,可以根据这个动作的优先级再新建一个任务,来执行。 步之道 发表于 2014-9-5 11:27
帮楼主补充一点,企鹅兄勿怪。
1、任务里不能有延时函数,任务要求快速响应,快速结束。
2、要把任务和函 ...
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延时函数(不是不能延时,最好不要用OS接口以外的延时函数,如果需要延时一个TICK以上,都可以用OS延时函数延时,比如我的例子),任务要求快速响应,快速结束。
2、要把任务和函数区分开,不同点:1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。(这块你说的正确,呵呵,我也是这么理解的,函数是任务间的调用,占用任务时间;而两个不同的任务各自有各自的运行时间)
2) 函数不能启动任务,而任务能启动其它任务和函数。(可以在函数中来创建任务,调用任务创建函数来做就可以了,只是创建的这个任务属于目前函数所在任务的子任务,当然,任务的参数什么的,需要用malloc来申请内存,要不此函数结束后可能一些临时参数会被释放,所以最好是用申请的)
3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。(函数的输入变量我就不说了,而任务的输入参数必须得有,因为任务调用是利用了函数指针,而它的类型是定的,如果需要的参数多了,要用结构体,像MQX的任务参数只有一个,我用结构体将指针作为参数)
4) 函数返回一个值,而任务则不返回值。
函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出去。
3、按照上面说的,如果要对任务中产生的结果,做相应的动作,可以根据这个动作的优先级再新建一个任务,来执行。 wangpengcheng 发表于 2014-9-5 11:42
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延 ...
1、对于任务中的延时,如果是用delay来写的话我建议是不要用,如果真要延时那就调用定时器计时器。比如你要开一个灯然后延时30s,关一个灯,你不需要在那等30S,在这期间你还可以进行其他任务,比如执行10个开销3秒的任务。
2、在我看来我认为任务的层次比函数高,我不太喜欢那种我中有你,你中有我的程序思想。我的基本思想是函数是一个个的元素,任务调用多个函数或者任务进行组合实现相应功能。因为函数基本上都是封装好的在底层。
3、任务不一定要有输入参数的,举例说,如果我有这么一个任务,1个程序运行周期检查一次网络连接状态,我就把它放在while中就可以了嘛。
不对的请指正 步之道 发表于 2014-9-5 13:00
1、对于任务中的延时,如果是用delay来写的话我建议是不要用,如果真要延时那就调用定时器计时器。比如你 ...
呵呵,其实我把任务不看作多高级,它的确是一个函数,我做模块化的时候会把任务做成模块里面的一个函数,呵呵,保持思路清晰! wangpengcheng 发表于 2014-9-5 13:20
呵呵,其实我把任务不看作多高级,它的确是一个函数,我做模块化的时候会把任务做成模块里面的一个函数, ...
好吧,我回去再看看书,哈哈 wangpengcheng 发表于 2014-9-5 11:42
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延 ...
帖子和回复都很认真哦,搬个板凳学习了 步之道 发表于 2014-9-5 13:27
好吧,我回去再看看书,哈哈
技术讨论很涨知识哦,强势围观 LZ 整了个 Tower啊~~
怎么样啊 这贴子大赞 cn_x 发表于 2014-9-5 13:34
帖子和回复都很认真哦,搬个板凳学习了
好像我们现在的分歧就是任务里有delay延时好不好,还有一个就是函数能不能调用任务。有无主次之分。你说说呢,我已经准备回家看书了,暂时说服不了企鹅兄。 以后得跟着楼主来学习了,这个讲的不错,赞 wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...
原来飞思卡尔还有自己的RTOS的啊,不错啊,还是免费,开源的 步之道 发表于 2014-9-5 13:38
好像我们现在的分歧就是任务里有delay延时好不好,还有一个就是函数能不能调用任务。有无主次之分。你说 ...
插不上嘴,没整过,我是来跟二位学习的 开源的就是好呀,以后多学习了 wangpengcheng 发表于 2014-9-5 11:42
参与讨论必须得有!
不过我对你的观点有些不同的看法,我说出来,你看看是不是这样:
1、任务里不能有延 ...
说的不错,慢慢看了 步之道 发表于 2014-9-5 13:00
1、对于任务中的延时,如果是用delay来写的话我建议是不要用,如果真要延时那就调用定时器计时器。比如你 ...
你所说的是裸奔情况,在带os的程序中是可以延时的,os自带延时api wangpengcheng 发表于 2014-9-4 20:06
MQX是飞思卡尔的一款适用于飞思卡尔芯片的,免费的、开源的、带技术支持的操作系统! ...
请问 适用于飞思卡尔是不是也支持其他的单片机 比如STM32?{:lol:}
还有输出的那个 time变量是系统自带的? 主要作用是?
pS:正在学习STM32。刚刚看了一个飞思卡尔的视频觉得很牛B 想学习一下。。并非砸场子。 street 发表于 2014-9-5 22:02
请问 适用于飞思卡尔是不是也支持其他的单片机 比如STM32?
还有输出的那个 time变量是系统自带 ...
请看52楼! myxiaonia 发表于 2014-9-5 21:41
你所说的是裸奔情况,在带os的程序中是可以延时的,os自带延时api
你说的这个延时是指调用定时器类的延时,这种延时应该是指进入延时,多长时间后回来后执行下一个动作,所以看起来是执行了一个延时程序。你要是执行一个“硬延时”,进程一直占用着,从实时性来说你怎么解决呢。望科普。。。 步之道 发表于 2014-9-5 22:12
你说的这个延时是指调用定时器类的延时,这种延时应该是指进入延时,多长时间后回来后执行下一个动作,所 ...
硬延时是什么意思,是指用循环方式,用指令来延时吗?这种方法是无解的
时间戳和定时器时间差这种方式的延时可以不阻塞延时,这时用状态机方法可以做到不阻塞 wangpengcheng 发表于 2014-9-5 22:08
请看52楼!
time 变量还没说呢?
楼主位用了个任务列表数组,表面mqx支持静态任务创建,不知道其是否支持动态任务创建方式,否则局限性是很大的
后文提到可以在函数中创建子任务,也就是说任务可以有父子关系,不知道任务调度时是怎么处理的?linux貌似就可以fork子进程,但是我不懂linux,这样创建的子进程有什么特殊之处
MDK自带的RTX是动态创建任务的典型rtos,它不支持静态任务,因为静态任务完全可以被动态任务取代,反之则不行 myxiaonia 发表于 2014-9-5 22:35
硬延时是什么意思,是指用循环方式,用指令来延时吗?这种方法是无解的
时间戳和定时器时间差这种方式的 ...
我所说的就是这个意思,不阻塞延时,这样也就是任务占用时间最少,楼主文档中是这么写的 _time_delay(1000);因为没给这个延时的函数,不清楚是什么样的延时故我才有了那个讨论。后来楼主解释了,不能用OS接口以外的延时函数,。并且如果延时时间小于1tick,是做不到的。 自己很想入门一个系统,不知道现在MQX用的多吗?如果入门直接学这个会不会有什么难度。 步之道 发表于 2014-9-5 22:12
你说的这个延时是指调用定时器类的延时,这种延时应该是指进入延时,多长时间后回来后执行下一个动作,所 ...
为什么要用“硬延时”呢?如果要准确延时,定时器就可以 myxiaonia 发表于 2014-9-5 22:42
楼主位用了个任务列表数组,表面mqx支持静态任务创建,不知道其是否支持动态任务创建方式,否则局限性是很 ...
我试过在任务中创建任务,但也需要是在任务列表中列出子任务,从根本上讲,还属于静态的,由任务创建函数的参数输入,你能看出它不支持你想的那种动态创建,我的看法是这样,可能我只是应用,还有些东西没接触到,不过RTT系统支持你说的那种,我用过非常灵活好用 rockyyangyang 发表于 2014-9-5 23:18
自己很想入门一个系统,不知道现在MQX用的多吗?如果入门直接学这个会不会有什么难度。 ...
系统都差不多,不难,关键是理解应用 本帖最后由 myxiaonia 于 2014-9-6 07:57 编辑
wangpengcheng 发表于 2014-9-6 00:54
我试过在任务中创建任务,但也需要是在任务列表中列出子任务,从根本上讲,还属于静态的,由任务创建函数 ...
RTT是静态和动态都支持,为何我说只有静态很有局限性呢,高稳健性应用中会有一个最高优先级的任务监视其他所有的任务,相当于os自带的一个看门狗,这个狗死掉了才会导致硬件看门狗复位。
在这个监视任务中,它如果发现某个任务长时间不响应或者死掉,就需要重启这个任务,显然静态任务的方法很难完成,动态任务就简单多了,杀死这个任务,重新启动这个任务 myxiaonia 发表于 2014-9-6 07:55
RTT是静态和动态都支持,为何我说只有静态很有局限性呢,高稳健性应用中会有一个最高优先级的任务监视其 ...
如果是你说的这个功能的话,MQX的任务也可以退出,然后重启!呵呵! 我对任务的理解就是链表,不知是否正确,请教一下如果多个任务用到同一个比如串口,怎么协调。 laotui 发表于 2014-9-6 16:19
我对任务的理解就是链表,不知是否正确,请教一下如果多个任务用到同一个比如串口,怎么协调。 ...
互斥量或者信号量都可以解决冲突的问题! wangpengcheng 发表于 2014-9-6 00:44
为什么要用“硬延时”呢?如果要准确延时,定时器就可以
我明白你的意思了,我开始以为你那地方是用的“硬延时”所以才那么说的。 mark,谢谢 请问MQX定时器是硬定时器还是软定时器(任务),另外只有一个应用任务,只开信号量 需要多少的资源?多少FLash 多少RAM? 嘿嘿,顶一下顶一下
页:
[1]
2