MTK task 小结 2

在 MTK task 小结 2  中 大概描述了下 MMI task 的工作方式:从外部队列获取消息放入内部消息队列,内部消息队列根据消息类型注册的回调函数,进行调用(event 机制,这个又是MMI framework的主要部分之一)。

在MTK上,用户(开发人员)可以根据需要,创建task。

创建一个task 分为 4 步:

1 增加一个task index 到 custom_task_indx_type

2 增加一个mod index 到 custom_module_type

3 把mod 关联到 相应的 task上,因为一个task 可以对应多个mod,所以需要把mod 挂载到 task上。

(用挂载这个词,应该就比较好理解了,task 是MTK 执行的基本单位,所以一个mod 要能独立运行,就要挂载到某个task 上,为什么不一个mod一个task呢,我想task越多,多系统效率影响就越大。那么就可以考虑互斥的mod 挂载到一个task上,反正互斥的,不会同时需要运行,就像音乐,视频,照相机一样,不会同时运行)

4 创建 task 基本信息 到 custom_comp_config_tbl

下面来具体看一个例子。

1 添加 task index

typedef enum {    INDX_CUSTOM1 = RPS_CUSTOM_TASKS_BEGIN,    INDX_CUSTOM2, #ifdef TASK_CREATE_TEST      INDX_TASK_TEST, #endif    RPS_CUSTOM_TASKS_END } custom_task_indx_type;

我们增加了一个 task index  INDX_TASK_TEST

2 添加一个 mod index

typedef enum {    MOD_CUSTOM1 = MOD_CUSTOM_BEGIN,    MOD_CUSTOM2, #ifdef TASK_CREATE_TEST      MOD_TASK_TEST, #endif    MOD_CUSTOM_END } custom_module_type;

我们增加了一个mod index MOD_TASK_TEST

3 挂载mod 到 task上

custom_task_indx_type custom_mod_task_g[ MAX_CUSTOM_MODS ] = {    INDX_CUSTOM1,        /* MOD_CUSTOM1 */    INDX_CUSTOM2,        /* MOD_CUSTOM2 */ #ifdef TASK_CREATE_TEST       INDX_TASK_TEST, #endif    INDX_NIL             /* Please end with INDX_NIL element */ };

这样就把 MOD_TASK_TEST 挂载到 INDX_TASK_TEST上面了,这里的映射关系是通过index 来控制的,也就是说要的到MOD_TASK_TEST 对应的 task index,只要这样 task index = custom_mod_task_g[MOD_TASK_TEST]; ,所以创建过程中,顺序一定要对应好,不然容易出错。

4 创建task 信息

const comptask_info_struct custom_comp_config_tbl[ MAX_CUSTOM_TASKS ] = {    /* INDX_CUSTOM1 */    {"CUST1", "CUST1 Q", 210, 1024, 10, 0,  #ifdef CUSTOM1_EXIST    custom1_create, KAL_FALSE #else       NULL, KAL_FALSE #endif    },     /* INDX_CUSTOM2 */    {"CUST2", "CUST2 Q", 211, 1024, 10, 0,  #ifdef CUSTOM2_EXIST    custom2_create, KAL_FALSE #else    NULL, KAL_FALSE #endif    },
#ifdef TASK_CREATE_TEST    /* INDX_TASK_TEST */    {"TAST_TEST", "TASK_TEST Q", 212, 1024, 10, 0,     task_test_create, KAL_FALSE    }, #endif  };

这样就创建好了task 的信息,这里说task 需要的信息

typedef struct {    kal_char             *comp_name_ptr;  //task 的name    kal_char             *comp_qname_ptr; //外部队列name    kal_uint32           comp_priority;   //优先级    kal_uint16           comp_stack_size; //stack 大小    kal_uint8            comp_ext_qsize;  //外部队列大小    kal_uint8            comp_int_qsize;  //内部队列大小    kal_create_func_ptr  comp_create_func; //task 创建函数    kal_bool             comp_internal_ram_stack; //是否是internal_ram_stack } comptask_info_struct;

task 的优先级是数值越大,优先级越低。由于是MTK 用的是实时操作系统,高优先级的task 只要需要,就会先运行,一直运行,所以task的优先级定义时需要考虑清楚。comp_internal_ram_stack 表示是否使用internal ram stack,internal ram 相对速度要快,但是数量很有限,一般自己创建的不要去使用,容易引起问题。

转自:

http://blog.csdn.net/yanwuxufeng/archive/2010/07/25/5765486.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值