`
izuoyan
  • 浏览: 9377074 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在MTK中添加TASK与常用函数分析

阅读更多

声明TASK的ID和MOD类型
在custom_config.h中custom_task_indx_type添加ID

如:

typedef enum {
INDX_CUSTOM1 = RPS_CUSTOM_TASKS_BEGIN,
INDX_CUSTOM2,
#if defined(__MIIPTS_TASK_SUPPORT__)
INDX_MIIPTS,
#endif
#if defined(__ELIVE_SUPPORT__)
INDX_ELIVE,
#if defined(__ELIVE_IPTV_SUPPORT__) || defined(__ELIVE_RDO_SUPPORT__)
INDX_ELIVECORE,
#endif
#endif
#if defined(__MOTION_SENSOR_SUPPORT_MMI_NEW__)
INDX_GSENSOR,
#endif
#if defined(FLASHLIGHT_LED_SUPPORT)
INDX_FLASHLIGHT,
#endif
#if defined(BCT3288_SUPPORT)
INDX_BCT3288LED,
#endif

#if defined(__OPEN_PLATFORM_SUPPORT__)
INDX_CUSTOM_OPEN,
#if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
INDX_MQQ,
#endif // #if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
#endif // #if defined(__OPEN_PLATFORM_SUPPORT__)

RPS_CUSTOM_TASKS_END
} custom_task_indx_type;

中的

#if defined(FLASHLIGHT_LED_SUPPORT)
INDX_FLASHLIGHT,
#endif
为新加ID;

在custom_module_type中添加模块类型

如:

typedef enum {
MOD_CUSTOM1 = MOD_CUSTOM_BEGIN,
MOD_CUSTOM2,
#if defined(__MIIPTS_TASK_SUPPORT__)
MOD_MIIPTS,
#endif
#if defined(__ELIVE_SUPPORT__)
MOD_ELIVE,
#if defined(__ELIVE_IPTV_SUPPORT__) || defined(__ELIVE_RDO_SUPPORT__)
MOD_ELIVECORE,
#endif
#endif
#if defined(__MOTION_SENSOR_SUPPORT_MMI_NEW__)
MOD_SC_GSENSOR,
#endif
#if defined(FLASHLIGHT_LED_SUPPORT)
MOD_FLASHLIGHT,
#endif
#if defined(BCT3288_SUPPORT)
MOD_BCT3288LED,
#endif

#if defined(__OPEN_PLATFORM_SUPPORT__)
MOD_CUSTOM_OPEN,
#if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
MOD_MQQ,
#endif // #if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
#endif // #if defined(__OPEN_PLATFORM_SUPPORT__)

MOD_CUSTOM_END
} custom_module_type;

#if defined(FLASHLIGHT_LED_SUPPORT)
MOD_FLASHLIGHT,
#endif
为新加MOD的类型;

在custom_config.c中的数组custom_mod_task_g中把声明的ID加入:

如:

custom_task_indx_type custom_mod_task_g[ MAX_CUSTOM_MODS ] =
{
INDX_CUSTOM1, /* MOD_CUSTOM1 */
INDX_CUSTOM2, /* MOD_CUSTOM2 */
#if defined(__MIIPTS_TASK_SUPPORT__)
INDX_MIIPTS, // MOD_MIIPTS
#endif
#if defined(__ELIVE_SUPPORT__)
INDX_ELIVE,
#if defined(__ELIVE_IPTV_SUPPORT__) || defined(__ELIVE_RDO_SUPPORT__)
INDX_ELIVECORE,
#endif
#endif
#if defined(__MOTION_SENSOR_SUPPORT_MMI_NEW__)
INDX_GSENSOR,
#endif
#if defined(FLASHLIGHT_LED_SUPPORT)
INDX_FLASHLIGHT,
#endif
#if defined(BCT3288_SUPPORT)
INDX_BCT3288LED,
#endif

#if defined(__OPEN_PLATFORM_SUPPORT__)
INDX_CUSTOM_OPEN, /* MOD_CUSTOM_OPEN */
#if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
INDX_MQQ, /* MOD_QQ */
#endif // #if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
#endif // #if defined(__OPEN_PLATFORM_SUPPORT__)

INDX_NIL /* Please end with INDX_NIL element */
};
在函数custom_comp_config_tbl中添加TASK的实现函数和TASK的信息声明

如:

{
/* 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
},
#if defined(__MIIPTS_TASK_SUPPORT__)
{"MiiPTS", "MiiPTS Q", 212, 1024*4, 10, 0, miipts_task_create, KAL_FALSE},
#endif
#if defined(__ELIVE_SUPPORT__)
{"ELIVE", "ELIVE Q", KAL_PRIORITY_CLASS17+2, 1024*3, 80, 0,
Elive_create, KAL_FALSE} ,
#if defined(__ELIVE_IPTV_SUPPORT__) || defined(__ELIVE_RDO_SUPPORT__)
{"ELIVECORE", "ELIVECORE Q", KAL_PRIORITY_CLASS17+4, 1024*3, 20, 10,
EliveCoreTask, KAL_FALSE} ,
#endif
#endif

#if defined(__MOTION_SENSOR_SUPPORT_MMI_NEW__)
/* INDX_GSENSOR */
{"Gsensor", "Gsensor Q", 195, 1024, 20, 10,
SC_gsensor_create, KAL_FALSE},
#endif
#if defined(FLASHLIGHT_LED_SUPPORT)
/* INDX_FLASHLIGHT */
{"FLHLT", "FLHLT Q", 200, 1024, 10, 0,
SC_flashlight_create, KAL_FALSE},
#endif
#if defined(BCT3288_SUPPORT)
/* INDX_BCT3288LED */
{"BCT3288", "BCT3288 Q", 200, 1024, 20, 0,
SC_BCT3288Flashlight_create, KAL_FALSE},
#endif


#if defined(__OPEN_PLATFORM_SUPPORT__)
{ "CUSTOPEN", "CUSTOPEN Q", 220, 4096, 64, 0, Open_TaskCreate, KAL_FALSE },
#if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
{ "MQQ", "MQQ Q", 212, 4096, 100, 10, mqq_create, KAL_FALSE },
#endif // #if defined(OPEN_CUSTOM_PRODUCT_QQ_DOWN_07A) && !defined(WIN32)
#endif // #if defined(__OPEN_PLATFORM_SUPPORT__)

}

中的

#if defined(FLASHLIGHT_LED_SUPPORT)
/* INDX_FLASHLIGHT */
{"FLHLT", "FLHLT Q", 200, 1024, 10, 0,
SC_flashlight_create, KAL_FALSE},
#endif
如果TASK需要与别的TASK交互,要使用消息,消息ID在文件custom_sap.h中定义,该头文件被包含在文件stack_msgs.h中,最终合并入msg_type枚举中。

如:

MSG_ID_CUSTOM1_CUSTOM2 = CUSTOM_MSG_CODE_BEGIN,
MSG_ID_CUSTOM2_CUSTOM1,
#if defined(__MIIPTS_TASK_SUPPORT__)
MSG_ID_MIIPTS_ENCODE_REQ,
MSG_ID_MIIPTS_ENCODE_CNF,
MSG_ID_MIIPTS_DECODE_REQ,
MSG_ID_MIIPTS_DECODE_CNF,
#endif // __MIIPTS_TASK_SUPPORT__
#ifdef __ELIVE_SUPPORT__
MSG_ID_ELIVE_BASE,
MSG_ID_ELIVE_END = MSG_ID_ELIVE_BASE + 50,
#endif
#if defined(__ALLKEY_EINT_FOR_KEYBOARD__)
MSG_ID_ALLKEYBOARD,
#endif
#if defined(__MOTION_SENSOR_SUPPORT_MMI_NEW__)
MSG_ID_GSENSOR_CHECK_START_REQ,
MSG_ID_GSENSOR_CHECK_STOP_REQ,
MSG_ID_GSENSOR_CHECK_ROTATE_IND,
#endif
#if defined(FLASHLIGHT_LED_SUPPORT)
MSG_ID_FLASHLIGHT_PLAY_REQ,
MSG_ID_FLASHLIGHT_STOP_REQ,
#endif
#ifdef __MMI_IMAP__
MSG_ID_IMAP,
#endif
#if defined(FIVE_CLAM_SUPPORT)
MSG_ID_FIVE_CLAM_SUPPORT,
#endif
#if defined(FOUR_CLAM_SUPPORT)
MSG_ID_FOUR_CLAM_SUPPORT,
#endif
#if defined(E73_TWO_CLAM_SUPPORT)
MSG_ID_TWO_CLAM_SUPPORT,
#endif
#if defined(BCT3288_SUPPORT)
MSG_ID_BCT3288FLASHLIGHT_LEFTKEY_PRESS,
MSG_ID_BCT3288FLASHLIGHT_RIGHTKEY_PRESS,
MSG_ID_BCT3288FLASHLIGHT_UPKEY_PRESS,
MSG_ID_BCT3288FLASHLIGHT_DOWNKEY_PRESS,
MSG_ID_BCT3288FLASHLIGHT_RIGHT_ROTATE,
MSG_ID_BCT3288FLASHLIGHT_LEFT_ROTATE,
MSG_ID_BCT3288FLASHLIGHT_MP3_EFFECT,
MSG_ID_BCT3288FLASHLIGHT_STOP_REQ,
MSG_ID_BCT3288FLASHLIGHT_ROTATE_CNF,
#endif
中的

#if defined(FLASHLIGHT_LED_SUPPORT)
MSG_ID_FLASHLIGHT_PLAY_REQ,
MSG_ID_FLASHLIGHT_STOP_REQ,
#endif
再看TASK函数的实现和调用:

kal_bool SC_flashlight_create(comptask_handler_struct **handle)
{
static const comptask_handler_struct custom_handler_info =
{
SC_flashlight_task_main,/* task entry function */
SC_flashlight_init,/* 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;
}

task的处理函数,主要是获取TASK的ID函数kal_get_my_task_index和获取消息内容函数receive_msg_ext_q:
void SC_flashlight_task_main(task_entry_struct * task_entry_ptr)
{
ilm_struct current_ilm;
kal_uint32 my_index;

kal_get_my_task_index(&my_index);

while(1)
{
receive_msg_ext_q( task_info_g[task_entry_ptr->task_indx].task_ext_qid,
&current_ilm);
stack_set_active_module_id( my_index, current_ilm.dest_mod_id);
if(current_ilm.msg_id==MSG_ID_FLASHLIGHT_PLAY_REQ)
{
//ET6204_init();
SC_et6204_play(&current_ilm);
}
else if(current_ilm.msg_id==MSG_ID_FLASHLIGHT_STOP_REQ)
{
StopTimer(LED_FLASH_TIMER);
ET6204_ALL_OFF();
Poweroff_ET6204();
}
free_ilm( &current_ilm);
}
}

初始化函数,进入该TASK里需要初始化的全局变量等:

kal_bool SC_flashlight_init(task_indx_type indx)
{
ET6204_init();
return KAL_TRUE;
}

消息处理函数,主要是收到消息的处理函数,掌握et6204_light_play_ind的定义与使用:

void SC_et6204_play(ilm_struct *ilm_ptr)
{
kal_uint16 et6204_display[7];
int i;
et6204_light_play_ind *play_data = (et6204_light_play_ind *)(ilm_ptr->local_para_ptr);

ET6204_POWER_HIGH;
ET6204_ALL_OFF();
if (get_phnset_led_setting() == 0)
{
ET6204_ALL_OFF();
Poweroff_ET6204();
return;
}

if(play_data->type == 0xf0)
{
et6204_incoming_flag=TRUE;
flash_count = 0;
et6204_incoming_number[et6204_incoming_length] = 0x30+10; //jacky added
et6204_incoming_length ++;
mmi_incoming_start_et6204_ind_nubmer();
return;
}
/*else if(play_data->type == 0x02)
{
et6204_audioplayer_flag = TRUE;
mmi_audioplayer_start_et6204_ind();
return;
}*/
else
{
g_led_count = 0;
g_ec6204_type = play_data->type;
g_ec6204_play_num = play_data->play_num;
mmi_start_et6204();
}
}
消息发送,主要是如何填充消息和发送函数OslMsgSendExtQueue:

void mmi_et6204_stop_display()
{
MYQUEUE Message;
et6204_light_play_ind *et6204_play_req;

ET6204_POWER_LOW;
et6204_incoming_flag = FALSE;
et6204_poweron_flag = FALSE;
et6204_audioplayer_flag = FALSE;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
Message.oslMsgId = MSG_ID_FLASHLIGHT_STOP_REQ;
et6204_play_req = OslConstructDataPtr(sizeof(et6204_light_play_ind));
et6204_play_req->type= 1;

Message.oslDataPtr = (oslParaType*) et6204_play_req;
Message.oslPeerBuffPtr = NULL;
Message.oslSrcId = MOD_MMI;
Message.oslDestId = MOD_FLASHLIGHT;
OslMsgSendExtQueue(&Message);
return;
}
void mmi_et6204_start_display(kal_uint8 type,kal_uint8 play_num)
{
MYQUEUE Message;
et6204_light_play_ind *et6204_play_req;
//kal_prompt_trace(MOD_BMT,"mmi_et6204_start_display::");
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
StopTimer(LED_FLASH_TIMER);
Message.oslMsgId = MSG_ID_FLASHLIGHT_PLAY_REQ;
et6204_play_req = OslConstructDataPtr(sizeof(et6204_light_play_ind));
et6204_play_req->type= type;
et6204_play_req->play_num= play_num;

Message.oslDataPtr = (oslParaType*) et6204_play_req;
Message.oslPeerBuffPtr = NULL;
Message.oslSrcId = MOD_MMI;
Message.oslDestId = MOD_FLASHLIGHT;
OslMsgSendExtQueue(&Message);
return;
}

数据结构:

typedef struct __et6204_light_play_ind
{
LOCAL_PARA_HDR
kal_uint8type;
kal_uint8play_num;
}et6204_light_play_ind;

typedef enum
{
ET6204_POWER_ON,
ET6204_INCOMING_IND,
ET6204_POWER_OFF,
ET6204_AUDIOPLAYER,
ET6204_NEW_MESSAGE,
ET6204_END
}ET6204_LIGHT_ID;

分享到:
评论

相关推荐

    在MTK中添加TASK与常用函数分析.rar

    在MTK(MediaTek)平台开发中,添加TASK(任务)和理解常用函数是至关重要的。这涉及到操作系统层面的编程,通常与实时性、多线程处理和资源管理相关。以下是对这一主题的详细分析: 一、MTK平台概述 MTK是由台湾...

    MTK event事件分析总结

    在MMI Task中,核心的事件处理函数是`ProtocolEventHandler`,它负责找到与接收到的事件ID匹配的处理函数。这通常是通过遍历预先定义的`protocolEventHandler`数组来完成的,数组中包含了每个事件及其对应的处理函数...

    MTK平台任务创建详解

    在MTK中使用的Nucleus Plus实时操作系统中,每个**TASK** 可以理解为一个独立的线程,负责执行特定的功能或服务。 - **MODULE**:则是一个更为抽象的概念,主要用于消息传递。在一个**TASK** 下可以包含多个**MODULE...

    mtk\MTK程序分析.pptmtk\MTK程序分析.ppt

    MTK程序分析主要探讨的是基于MediaTek平台的程序设计与执行流程。MediaTek是一个知名的芯片制造商,其开发的软件框架...通过对FMT和MMI的深入分析,开发者可以更好地掌握如何在MTK环境中设计高效、稳定且可扩展的程序。

    MTK audio 架构

    在Media Task层中,media task启动后,med_task_main在获得外部消息后,调用med_main((void*)&cur_task, (void*)&msg)函数,处理音频播放请求。media task将音频播放请求发送到音频驱动层,音频驱动层将音频信号发送...

    MTK开发资料文档

    MMI Task是整个MTK开发框架中的一个重要组件,其执行流程如下: 1. **等待消息事件**:MMI Task处于空闲状态时,会等待新的消息事件被发送到MMI队列中。 2. **读取消息**:一旦有新的消息到达MMI队列,MMI Task会...

    MTK 手机开发源码

    MTK(MediaTek)手机开发源码涉及到的是在Android系统中针对MediaTek芯片进行的定制化开发工作。MediaTek是一家知名的半导体公司,其芯片广泛应用于智能手机、平板电脑等移动设备。在MTK手机开发过程中,了解和掌握...

    精通MTK嵌入式编程

    本地参数是在MMI和L4通信过程中用于传递特定上下文信息的数据结构,它们通常不跨进程传递,仅在MMI Task内部使用。 总之,精通MTK嵌入式编程意味着要深入理解MMI和L4间的通信机制,掌握硬件驱动的编写,熟悉上层...

    MTK_面试的几个主要问题

    * SetLeftSoftkeyFunction:内部主要流程包括注册左软键处理器、刷新软键区域图像、执行关联函数和将函数与特定的输入关联起来。 * ChangeLeftSoftkey:主要执行流程包括设置左软键图表、文字和刷新左软键显示区域。...

    C语言内存池算法MTK任务内存申请和释放

    MTK内存管理机制中的`mtk_task_malloc`和`mtk_task_free`函数提供了对这种特殊内存管理的支持。这两个函数的工作方式如下: - `mtk_task_malloc(void **p, int size);`:此函数尝试为用户分配指定大小的内存。值得...

    MTK专题集(讲述MTK各个重要功能模块)

    MTK专题集是针对MediaTek(MTK)平台进行深入讲解的一个系列,主要涵盖了MTK系统中的各个重要功能模块。这些模块共同构成了一个完整的手机或者设备操作系统,确保了系统的稳定运行和用户交互体验。 1. **...

    MTK架构分析.ppt Framework启动流程/Queue/Event/History相关介绍

    ●函数MMI_task主要完成的是不停的读取protocol task中的消息,然后根据消息和参数进行相应的处理函数 。 ●在函数MMI_task里读取了消息后,用一个switch语句来选择处理方式 。 ●当系统收到这个消息MSG_ID_MMI_EQ_...

    MTK中的nvram的操作实现.docx

    首先,NVRAM任务由`nvram_task_main`函数驱动,这个函数在一个无限循环中运行,不断地接收和处理消息。消息是通过消息队列(message queue)传递的,这在多任务环境下提供了异步通信的能力。当接收到一个消息时,`...

    MTK专题集讲述MTK各个重要功能模块

    ### MTK专题集知识点概述 #### 一、MTK概览 MTK(MediaTek)是一种广泛应用于移动设备和通信产品的技术平台。...通过本专题集的学习,开发者可以更加深入地理解MTK的架构设计,从而提高其在实际项目中的应用能力。

    mtk -软件结构综合概述

    为了更好地与Nucleus OS兼容,MTK设计了AKA(Adaptive Kernel Adaptor)适配层,该层通过一系列API提供了系统服务函数,包括原始操作、定时器、队列、内存管理和事件处理等功能。这些服务为其他任务的开发提供了便利...

    MTK入门文档(有一个加菜单的例子)

    在MTK平台中,我们可以添加一个字符串,例如STR_GLOBAL_OK。首先,我们需要给这个字符串起一个名字,即ID。然后,我们可以用ADD_APPLICATION_STRING2()函数来添加这个字符串,如ADD_APPLICATION_STRING2(STR_GLOBAL_...

    MTK平台NVRAM的机制

    通过细致地划分数据类型和使用场景,MTK平台确保了NVRAM能够在复杂多变的移动环境中稳定运行,同时提供了灵活的恢复机制,保障用户数据的安全与设备的可靠性。理解MTK平台NVRAM的内部运作,对于开发者和维护人员来说...

    mtk 11A经验总结

    根据提供的标题、描述以及部分代码内容,我们可以梳理出与MTK 11A...通过对这些函数的调用顺序和功能分析,可以深入了解MTK 11A系统在拨号和短信发送方面的内部机制。这对于理解MTK平台上的电话应用逻辑非常有帮助。

Global site tag (gtag.js) - Google Analytics