MTK平台学习---TASK的创建

分类: MTK平台


MTK平台是非常优秀的一个平台,曾经的山寨机之父,下面我将介绍下在MTK平台下如何去创建自己的任务。

一、基础知识

        在学习如何创建任务之前,我们需要了解一些基本概念,以及一些和任务相关的数据结构,了解了这些之后,我们就能更好的理解如何去创建任务了。MTK中关于任务的概念有两个,一个是TASK,另外一个则是MODULE,这两个有什么区别呢,task是操作系统层面的概念,MTK使用的是nucleus plus实时操作系统,其任务即TASK可以理解为一个线程,而一个TASK下面可以有很多的MODULE,MODULE是软件平台设计者因为某种需要而设计的。TASK是一个执行单元,MODULE主要是用于传递消息,在MTK中,消息传递是以MODULE为单位src_mod -> des_mod,而不是以TASK为单位。MTK并不支持动态的创建任务,所以任务的创建是静态的,需要事先定义好。而且任务的创建函数对程序开发人员来说是不可见的,MTK提供了几张数据表,让开发人员来装填,装填好这几张表之后,系统就会自动创建我们想要创建的任务了。cunstomer_config.h文件中的枚举类型数据结构custom_task_indx_type、custom_module_type,前面一个枚举类型是用来定义任务索引的,后面的一个枚举类型是用来定义MOD索引的,开发人员新定义的任务时,需要在这个地方添加新的索引。另外一个文件就是customer_config.c文件中的custom_task_index_type类型的变量,custom_mod_task_g变量的装填,这一步的作用主要就是将一个MOD和一个任务关联起来,即将MOD挂载到TASK上面。

         MTK创建TASK的基本结构体:

typedef struct

 {
         kal_char                         *comp_name_ptr;                   -----        任务的名称
         kal_char                         *comp_qname_ptr;                 -----        任务所属队列的名称
         kal_uint32                      comp_priority;                          -----        任务的优先级,0~255
         kal_uint16                      comp_stack_size;                   -----        任务堆栈的大小
         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;

comp_internal_ram_stack相对速度要快,但是数量有限,一般自己创建的任务不要去使用,容易引起问题。

         typedef struct

             {
                    kal_task_func_ptr                comp_entry_func;                      ----      task的入口函数
                    task_init_func_ptr                comp_init_func;                         ----      task的初始化函数
                    task_cfg_func_ptr                comp_cfg_func;                         ----      task的配置函数
                    task_reset_func_ptr            comp_reset_func;                     ----      task的重置函数
                    task_end_func_ptr              comp_end_func;                        ----     task的终止函数
             } comptask_handler_struct;

            task的入口函数是必须的,这个函数告诉系统,初始化完相应的task控制块后,就要进入该函数来运行。

            task的初始化函数是在进入task入口函数之前被调用,用来初始化可能需要的资源,可选。task终止函数是,当task结束是要调用,用来释放资源,可选。

            二、任务的创建过程

                     有了上面的基础知识,再创建MTK的任务时,理解起来就容易多了,创建任务主要分为以下的几个

            步骤:

                              第一步:增加一个task  index到custom_config.h中的枚举类型custom_task_indx_type中。

                              第二步:增加一个mode index到custom_config.h中的枚举类型custom_module_type中。

                              第三步:把mod和task进行关联,因为一个task可以对应多个mod,所以需要将mod挂载到

                                              task上,挂载的方法是在custom_config.c中的

                                              custom_mod_task_g[ MAX_CUSTOM_MODS ]数组中添加刚刚在第一步中所增加

                                               的那个task index,这样就能够通过mode index索引到相应的task  index,也就建

                                               立了二者的对应关系。

                              第四步:添加task基本信息到custom_config.c中的custom_comp_config_tbl中。

                              第五步:上面的各种数据信息装填完毕之后,接下来就开始编写自己的任务的实现的函数。

              三、任务创建的举例说明

                       如果我们想创建一个任务名称为FD_TEST4 ,优先级为219,堆栈大小为4096 byte的任务,采用

                       如下的方法来创建这个任务:

                        第一步:添加TASK INDEX

typedef enum

    {
             INDX_CUSTOM1 = RPS_CUSTOM_TASKS_BEGIN,
             INDX_CUSTOM2,
             #ifdef __FLAVOR_VENDOR_SDK__
                  INDX_VS,
             #endif

             // LXL

                 INDX_FD_TEST4,                       ----- 此处添加TASK INDEX         

                 RPS_CUSTOM_TASKS_END
      } custom_task_indx_type;

第二步:添加MOD INDEX      

            typedef enum

               {
                       MOD_CUSTOM1 = MOD_CUSTOM_BEGIN,
                       MOD_CUSTOM2,
                       #ifdef __FLAVOR_VENDOR_SDK__
                            MOD_VS,
                      #endif

                      MOD_FD_TEST4,                            -----  在此处添加MODE INDEX

                      MOD_CUSTOM_END
               } custom_module_type;

第三步:将MOD挂载到TASK上

               

              custom_task_indx_type custom_mod_task_g[ MAX_CUSTOM_MODS ] =
                {
                        INDX_CUSTOM1,        /* MOD_CUSTOM1 */
                        INDX_CUSTOM2,        /* MOD_CUSTOM2 */
                        #ifdef __FLAVOR_VENDOR_SDK__
                              INDX_VS,
                        #endif

                        INDX_FD_TEST4,
                        INDX_NIL             /* Please end with INDX_NIL element */
                };

 

第四步:装填创建人物的数据结构

              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
                            },

//   此处添加TASK任务的数据结构信息

 {"FD_TEST4",   "FD_TEST4_Q", 219, 1024, 30, 0, fd_test4_create, KAL_FALSE}       

};

第五步:编写任务的创建函数fd_test4_create

   kal_bool fd_test4_create(comptask_handler_struct **handle)
     {
              static const comptask_handler_struct custom_handler_info =
                       {
                               fd_test4_fun,                          /* task entry function */
                               NULL,                                     /* task initialization function */
                               NULL,                                     /* task configuration function */
                               NULL,                                     /* task reset handler */
                               NULL,                                    /* task termination handler */
                        };
                    
              *handle = (comptask_handler_struct *)&custom_handler_info;
               return KAL_TRUE;
   }

               注意此函数的返回值,入口函数是固定的,因为这个函数是在任务创建时由系统自动

               调用的,而我们想要实现的功能,则在函数fd_test4_fun中实现。

             四、结束

                       上面就是MTK任务的创建过程,我也是刚开始接触这个平台,还有很多不懂的地方,如果有说的

               不对的地方,希望大家能够指出来,一起进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值