刚开始时,我也觉得代码不好看.后面发现了一个有用的文件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
{
__rt_lib_init(0, 0);
#ifdef __MULTI_BOOT__
_boot_mode = *(volatile kal_uint16 *)BOOT_CONFIG_ADDR;
#ifndef L1_NOT_PRESENT
L1D_SetInitMode(_boot_mode);
#endif
#endif
systemIntialization();
#ifdef MTK_PCM
nvrm_init();
#endif
HWDInitialization();
#ifdef _NAND_FLASH_BOOTING_
NFB_InitThirdROM();
NFB_LoadingSecondaryMAUI();
#endif
Drv_Init_Phase2();
systemInitializeResource();
stack_check_msgid_range();
mainp();
#ifdef _MAUI_SOFTWARE_LA_
#endif
#ifdef __PRODUCTION_RELEASE__
#ifdef __MULTI_BOOT__
if ( system_boot_mode!=FACTORY_BOOT )
#endif
WDT_Enable(KAL_TRUE);
#endif
}
这个程序中很多的宏.哪个有个,哪个没有看不出.除非接合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) 了解不开放代码中的函数调用关系.