目录
一、程序入口main
程序的入口函数main( )位于init.c文件,而main主函数中调用setup_arch( )进行了内存/时钟等初始化,并创建了模式任务处理,并在任务处理app_task_handler( )中分别分别进行了任务的初始化app_init( )和任务的调度处理app_main( )。
主函数main( ) 代码如下(示例):
int main()
{
#if(CONFIG_CPU_BR25)
#if (TCFG_DEC2TWS_ENABLE ||RECORDER_MIX_EN || TCFG_DRC_ENABLE || TCFG_USER_BLE_ENABLE || TCFG_DEC_APE_ENABLE || TCFG_DEC_FLAC_ENABLE || TCFG_DEC_DTS_ENABLE || TCFG_USER_EMITTER_ENABLE)
clock_set_sfc_max_freq(100 * 1000000, 100 * 1000000);
#else
#if ((TCFG_AEC_ENABLE) && (TCFG_USER_TWS_ENABLE))
clock_set_sfc_max_freq(80 * 1000000, 80 * 1000000);
#else
clock_set_sfc_max_freq(64 * 1000000, 64 * 1000000);
#endif
#endif
#endif
wdt_close();
os_init();
setup_arch();
board_early_init();
task_create(app_task_handler, NULL, "app_core");
os_start();
local_irq_enable();
while (1) {
asm("idle");
}
return 0;
}
创建的任务处理函数app_task_handler( )代码如下(示例):
static void app_task_handler(void *p)
{
app_init();
app_main();
}
-
steup_arch( )函数:该函数主要进行内存的初始化、看门狗初始化、时钟的初始化、初始io及系统时间的初始化等芯片的初始化功能(大致理解为程序的运行环境做准备)
-
app_init( )函数:该函数则是为任务(模式)进行准备,进行解码初始化、按键开机检测和CUP复位部分操作等
- app_main( )函数:任务主函数app_main则在app_mian.c中进行处理,其中比较重要的是对开机初始模式进行设置,并循环根据app_task_loop( )获取并设置的最新的模式任务
二、模式启动/选择
当开始通过app_main( )函数设置首任务或进行任务模式切换时,便会执行app_task_loop( )判定并开始相应模式的任务,当发生任务模式更改时,会根据变量app_curr_task跳转执行:
三、任务消息/操作处理
所有app模式/任务主要可分为三部分:模式初始化--消息处理--模式退出。当初始化完毕后变获取消息,当有消息处理推送出来时,则进行响应处理,直到退出该模式
music模式代码如下(示例):
3.1 消息事件响应处理
消息处理又分为模式消息处理和公共消息处理,当有消息事件推出时,先在当前模式进行处理响应的消息后,若不进行处理(返回false)后才会丢到公共事件中去判定处理。
以music模式为例:当推送按键消息KEY_VOL_UP出来后,会先在按键消息入口函数music_key_event_opr( )中执行并判定消息是否已经处理后,若未处理则推送到按键公共事件处理函数app_common_key_msg_deal( )进行处理
music模式的模式消息事件处理如下(示例):
公共消息处理如下(示例):
四、模式切换
当需要切换模式时,可根据app_task_switch_to( )函数进行切换。包括当前任务的获取/模式配置表/跳转下一模式等操作函数均在app_task_switch.c文件中进行处理
(1)app_task_switch_to( )函数:用于切换到指定模式,通常在切换到指定模式时会对跳转的模式进行条件判断,以及退出的模式(如蓝牙后台则不需退出蓝牙)等进行判定后,才可正常跳转
(2)app_task_switch_prev( )函数和app_task_switch_next( )函数:分别对应跳转到上一个模式、下一个模式的操作。进行上、下一模式切换时是通过遍历模式任务列表,因此需将要切换的模式添加到列表数组中方可进行操作,未添加的无法通过上下模式切换函数进行切换操作。
(3)app_get_curr_task( )函数:主要用于判定当前的任务模式;
(4)app_task_switch_check( )函数:模式进入检查,有一些需设备在线的情况(如音乐模式需TF卡/U盘播放,录音模式需内存卡储存等),则需在进入相应模式时先判断有无设备在线,有设备在线可进入,没有设备时则进入下一个模式