MQX的任务创建

来源:互联网 发布:mysql schema是什么 编辑:程序博客网 时间:2024/06/06 00:26

公司用freescale的芯片,要用到MQX OS

任务模板列表(TASK_TEMPLATE_STRUCT)定义了一组初始化模板,基于该模板可以在处理器上生成任务。

   初始化时,MQX生成每个任务的一个实例,任务模板将其定义为一个自启动任务。同样,当应用程序运行时,它能按任务模板生成其它任务,该模板由任务模板定义或应用程序动态定义。任务模板队列的结尾是一个填入全0的任务模板。

    typedefstruct task_template_struct
{
_mqx_uint TASK_TEMPLATE_INDEX;   //任务模版索引
void _CODE_PTR_ TASK_ADDRESS)(uint_32);  //任务的入口地址
_mem_size TASK_STACKSIZE;              //任务的栈大小
_mqx_uint TASK_PRIORITY;               //任务的优先级
char _PTR_ TASK_NAME;                  //任务的名称

_mqx_uint TASK_ATTRIBUTES;              //任务属性标识          
uint_32 CREATION_PARAMETER;             //任务创建参数
_mqx_uint DEFAULT_TIME_SLICE;           //默认的时间片选择
TASK_TEMPLATE_STRUCT ,_PTR_ TASK_TEMPLATE_STRUCT_PTR;

 

举例:一个任务模板列表

你可以初始化自己的任务模板列表,也可以使用默认的列表MQX_template_list

TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
{ MAIN_TASK, world_task,  0x2000, 5,"world_task",
MQX_AUTO_START_TASK, 0L, 0},
{ HELLO, hello_task, 0x2000, 5, "hello_task",
MQX_TIME_SLICE_TASK, 0L, 100},
{ FLOAT, float_task, 0x2000, 5, "Float_task",
MQX_AUTO_START_TASK | MQX_FLOATING_POINT_TASK, 0L, 0},
{ 0, 0, 0, 0,  0, 0, 0L, 0 }
}; 

   在这个例子中,world_task是一个自启动任务,因此在初始化时 MQX生成一个参数为0的任务实例。应用程序定义任务模板索引(MAIN_TASK)。该任务优先级为5。World_task()函数是任务的入口,栈的大小是0x2000 个寻址单元。

   任务hello_task是一个时间片任务,如果使用默认的实时编译配置选项,其时间片数值为100毫秒。

   Float_task任务既是一个浮点任务,也是一个自启动任务。

 

文档中的例子1: 创建一个自启动任务

 
#include
#include

#define HELLO_TASK 5
extern void hello_task(uint_32);

TASK_TEMPLATE_STRUCT MQX_template_list[] =

{
{ HELLO_TASK, hello_task, 500, 5, "hello",
MQX_AUTO_START_TASK, 0L, 0},
{ 0, 0, 0, 0, 0,
0, 0L, 0}
};


void hello_task(uint_32 initial_data)
{
printf("\n Hello World \n");
_mqx_exit(0);
}

 

文档中的例子2:

   该例子基于前面的例子增加了第二个任务(world_task)。我们确认例子中的任务模板列表包括world_task的信息,并修改hello_task以使它不是一个自启动任务。World_task任务是一个自启动任务。

   当MQX启动时,它创建了world_task。 World_task 通过以world_task为参数调用_task_create()函数去创建hello_task 任务。MQX 使用hello_task模板生成hello_task的一个实例。如果_task_create()函数调用成功,将返回新的子任务的ID;否则将返回MQX_NULL_TASK_ID。

   新的hello_task任务将被置入任务优先级的就绪队列。因为它拥有比world_task更高的优先级,它将变为活动状态。活动的任务打印输出Hello。之后World_task任务将变为活动状态并检查hello_task任务是否成功创建。如果是,world_task将输出World;否则,world_task将输出一个错误信息。最后MQX退出。

   如果你更改world_task的优先级,使它的优先级和hello_task 相同,则只输出Wo rld。因为world_task和hello_task具有相同的优先级并且不会放弃控制权,所以world_task在hello_task之前运行。既然hello_task没有机会再次运行,则world_task 在输出 World之后调用_mqx_exit(),不会再有任何输出。

    实例代码:

 

#include<mqx.h> 

#include<fio.h> 

 

#define HELLO_TASK 5 

#define WORLD_TASK 6 

extern void hello_task(uint_32); 

extern void world_task(uint_32);

TASK_TEMPLATE_STRUCT MQX_template_list[] = 

{WORLD_TASK, world_task, 500, 5, "world", 

MQX_AUTO_START_TASK, 0L, 0}, 

{HELLO_TASK, hello_task, 500, 4, "hello", 

0, 0L, 0}, 

{0, 0, 0, 0, 0, 

0, 0L, 0} 

}; 

 

void world_task(uint_32 initial_data) 

_task_id hello_task_id;   //typedef uint_32 _task_idtypedefunsigned long  uint_32

hello_task_id = _task_create(0, HELLO_TASK, 0); //MQX 使用hello_task 模板生成hello_task 的一个实例

if (hello_task_id == MQX_NULL_TASK_ID) { 

printf("\n Could not createhello_task\n"); 

} else { 

printf(" World \n"); 

_mqx_exit(0); 


 

void hello_task(uint_32 initial_data) 

printf(" Hello \n"); 

_task_block(); 


说明(文档摘抄)

    任何任务(创建者)均可以通过调用_task_create()或者_task_create_blocked()创建其它任务(子任务),并传递处理器编号、任务模板索引和任务创建参数。应用程序定义一个创建参数,通常用于为子任务提供初始化信息。一个任务也可以创建一个在任务模板列表中没有定义过的任务,指定任务模板索引为0,这时,MQX把任务创建参数当作一个指向任务模板的指针函数初始化子任务的堆栈。_task_create()函数将子任务挂入任务优先级的就绪队列。如果子任务比创建者的优先级还高,子任务将变成活动任务,因为它是目前优先级最高的就绪任务。如果创建者有更高或者相等的优先级,则依然保持活动状态。_task_create_blocked()函数创建一个被阻塞的任务。该任务将保持非就绪状态直到另一个任务调用_task_ready() 函数。


原创粉丝点击