MTK lis文件的妙用

    技术2022-05-19  20

    学习一个新的平台,总被复杂的调用关系,一大堆的宏所困扰.以MTK为例.在一个版本中集中了非常多的功能,又有不同的芯片功能,程序显得繁复.这种情况对于一个初学者来说就显得很复杂.有无从下手的感觉.

       刚开始时,我也觉得代码不好看.后面发现了一个有用的文件lis.这个文件和bin文件都在build目录下.这个文件指出了交叉引用关系.实际上这是一个ADS固有的功能,对所有以ADS编译的平台都是一样的.以开机初始化为例.

    #if defined(KAL_ON_NUCLEUS)void Application_Initialize (void *first_available_memory)#elif defined(KAL_ON_THREADX)void tx_application_define(void *first_unused_memory)#endif{   /* setlocale(LC_CTYPE,"C"); */   __rt_lib_init(0, 0);   /* passing 0 since we don't use the heap */

       /* Multi-Boot */#ifdef __MULTI_BOOT__

       _boot_mode = *(volatile kal_uint16 *)BOOT_CONFIG_ADDR;      #ifndef L1_NOT_PRESENT   L1D_SetInitMode(_boot_mode);   #endif /* L1_NOT_PRESENT */

    #endif /* __MULTI_BOOT__ */

       systemIntialization();

    #ifdef MTK_PCM   nvrm_init();#endif

       HWDInitialization();      #ifdef _NAND_FLASH_BOOTING_   NFB_InitThirdROM();   NFB_LoadingSecondaryMAUI();   #endif /* _NAND_FLASH_BOOTING_ */

       Drv_Init_Phase2();

       /* Resource initialization */   systemInitializeResource();

       /* check ranges of all message ID */   stack_check_msgid_range();     /* MAUI protocol stack entry routine */   mainp();      #ifdef _MAUI_SOFTWARE_LA_/* under construction !*/#endif /* _MAUI_SOFTWARE_LA_ */

    #ifdef __PRODUCTION_RELEASE__

       #ifdef __MULTI_BOOT__   if ( system_boot_mode!=FACTORY_BOOT )   #endif      WDT_Enable(KAL_TRUE);

    #endif /* __PRODUCTION_RELEASE__ */}这个程序中很多的宏.哪个有个,哪个没有看不出.除非接合mak文件来查看.这也容易出错.在lis文件中就有比较简单的说明.

    init.obj(i.Application_Initialize) refers to lib_init.o(.text) for __rt_lib_init    init.obj(i.Application_Initialize) refers to m12100.obj(i.L1D_SetInitMode) for L1D_SetInitMode    init.obj(i.Application_Initialize) refers to intrCtrl.obj(i.initINTR) for initINTR    init.obj(i.Application_Initialize) refers to isrentry.obj(i.IRQ_LISR_Init) for IRQ_LISR_Init    init.obj(i.Application_Initialize) refers to custom_EMI.obj(i.Initialize_FDD_tables) for Initialize_FDD_tables    init.obj(i.Application_Initialize) refers to kal_debug_error_handling.obj(i.kal_debug_register_print_string_function) for kal_debug_register_print_string_function    init.obj(i.Application_Initialize) refers to kal_error_handling.obj(i.kal_register_fatal_error_handler) for kal_register_fatal_error_handler    init.obj(i.Application_Initialize) refers to kal_nucleus_initialize.obj(i.kal_initialize_mem) for kal_initialize_mem    init.obj(i.Application_Initialize) refers to stack_buff_pool.obj(i.stack_init_buff_pool_info) for stack_init_buff_pool_info    init.obj(i.Application_Initialize) refers to stack_buff_pool.obj(i.stack_resources_init) for stack_resources_init    init.obj(i.Application_Initialize) refers to kal_nucleus_initialize.obj(i.kal_initialize) for kal_initialize    init.obj(i.Application_Initialize) refers to l1dsm.obj(i.L1SM_Init) for L1SM_Init    init.obj(i.Application_Initialize) refers to m11007.obj(i.HW_Divider_Initialization) for HW_Divider_Initialization    init.obj(i.Application_Initialize) refers to SST_intrCtrl.obj(INTERNCODE) for SaveAndSetIRQMask    init.obj(i.Application_Initialize) refers to SST_intrCtrl.obj(INTERNCODE) for RestoreIRQMask    init.obj(i.Application_Initialize) refers to idma.obj(i.idma_load) for idma_load    init.obj(i.Application_Initialize) refers to drv_comm.obj(i.Drv_Init_Phase1) for Drv_Init_Phase1    init.obj(i.Application_Initialize) refers to wdt.obj(i.WDT_Enable) for WDT_Enable    init.obj(i.Application_Initialize) refers to pwic.obj(i.INT_USBBoot) for INT_USBBoot    init.obj(i.Application_Initialize) refers to drv_comm.obj(i.Drv_Init_Phase2) for Drv_Init_Phase2    init.obj(i.Application_Initialize) refers to init.obj(i.systemInitializeResource) for systemInitializeResource    init.obj(i.Application_Initialize) refers to stack_ltlcom.obj(i.stack_check_msgid_range) for stack_check_msgid_range    init.obj(i.Application_Initialize) refers to stack_main.obj(i.mainp) for mainp    init.obj(i.Application_Initialize) refers to init.obj(.bss) for .bss$2    init.obj(i.Application_Initialize) refers to stack_main.obj(i.stack_print) for stack_print    init.obj(i.Application_Initialize) refers to kal_nucleus_error_handling.obj(i.fatal_error_handler) for fatal_error_handler    init.obj(i.Application_Initialize) refers to drv_comm.obj(.data) for system_boot_mode    init.obj(i.Application_Initialize) refers (Special) to divrt_real.o(x$divrt$select) for __use_realtime_division

        从这个交叉调用关系中可看出nvrm_init没有调用到, Nand相关的宏也没有用到.看 程序就非常清晰.不会因为没有用的代码影响了而误入岐途.

       交叉调用关系是非常有用的功能.

    1)我们编的程序是否直正有编译到

    2)我们编的程序被哪些函数调用到.

    3)我们关心的代码段有谁在用.

    4) 了解不开放代码中的函数调用关系.

     


    最新回复(0)