MTK lis文件的妙用

学习一个新的平台,总被复杂的调用关系,一大堆的宏所困扰.以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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值