This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

how to use function pointer array???

Hi All

I have use function pointer array like this

main.c
uchar i;
for(i = 0;i<END_COMMAND;i++)
printf("%bu %x\n",i,Func_table[i]);

cmd.h

typedef void (*Func) (void);
void init_func(void);
void reset_func(void);
void end_command(void);

cmd.c

Func Func_Table[] =
{
init_func,
reset_func,
end_command
}

void init_func(void){DO_SOMETHING}
void reset_func(void){DO_SOMETHING}
void end_command(void){DO_SOMETHING}

When I run in Keil IDE Debug mode
it can trace into code and print correct
function address (Ex 0 ff00 1 ff10 2 ff20)
,but when I run into flash,all function address is print zero(ex 0 0 1 0 2 0)
so I got reset when use this Func_Table
why??

Thanks a lot

Parents
  • TYPE BASE LENGTH RELOCATION SEGMENT NAME
    -----------------------------------------------------

    * * * * * * * D A T A M E M O R Y * * * * * * *
    REG 0000H 0008H ABSOLUTE "REG BANK 0"
    DATA 0008H 0005H UNIT _DATA_GROUP_
    000DH 0013H *** GAP ***
    BIT 0020H.0 0001H.1 UNIT _BIT_GROUP_
    0021H.1 0000H.7 *** GAP ***
    IDATA 0022H 0001H UNIT ?STACK

    * * * * * * * X D A T A M E M O R Y * * * * * * *
    XDATA 0000H 011CH UNIT ?XD?MPG450
    XDATA 011CH 0028H UNIT _XDATA_GROUP_
    XDATA 0144H 0019H UNIT ?XD?_RS232_PROCESS?DEBUG
    XDATA 015DH 0009H UNIT ?XD?_DMA_TASK_SCHEDULER?MPG450
    XDATA 0166H 0008H UNIT ?XD?DMA_TASK_EXECUTE?MPG450
    XDATA 016EH 0005H UNIT ?XD?_CHANGE_VIDEO_SIZE?FUNC
    XDATA 0173H 0003H UNIT ?XD?EXINT1_INT_ROUTINE?MPG450
    XDATA 0176H 0003H UNIT ?XD?DRAMC_BIST?FUNC
    XDATA 0179H 0002H UNIT ?XD?SET_CHECKSUM?FUNC
    XDATA 017BH 0001H UNIT ?XD?CPU_UR0_INIT?CPU_API
    XDATA 017CH 0001H UNIT ?XD?_PDMAC_START?MPG450
    XDATA 017DH 0001H UNIT ?XD?MAIN?MPG450
    XDATA 017EH 0001H UNIT ?XD?RS232_INPUT?DEBUG
    BL51 BANKED LINKER/LOCATER V5.03 07/27/2005 10:40:44 PAGE 2


    XDATA 017FH 0001H UNIT ?XD?END_COMMAND?USERCMD

    * * * * * * * C O D E M E M O R Y * * * * * * *
    CODE 0000H 0003H ABSOLUTE
    CODE 0003H 000CH UNIT ?PR?SET_CHECKSUM?FUNC
    CODE 000FH 0001H UNIT ?PR?INIT_MPG450?USERCMD
    CODE 0010H 0001H UNIT ?PR?RESET_MPG450?USERCMD
    0011H 0002H *** GAP ***
    CODE 0013H 0003H ABSOLUTE
    CODE 0016H 07CAH UNIT ?PR?_RS232_PROCESS?DEBUG
    CODE 07E0H 07B2H UNIT ?PR?DMA_TASK_EXECUTE?MPG450
    CODE 0F92H 054AH UNIT ?PR?_DMA_TASK_SCHEDULER?MPG450
    CODE 14DCH 0365H UNIT ?PR?PRINTF?PRINTF
    CODE 1841H 023FH UNIT ?CO?DEBUG
    CODE 1A80H 0194H UNIT ?PR?_CHANGE_VIDEO_SIZE?FUNC
    CODE 1C14H 0194H UNIT ?C?LIB_CODE
    CODE 1DA8H 0135H UNIT ?PR?RS232_INPUT?DEBUG
    CODE 1EDDH 010AH UNIT ?PR?WDT_RESET?WDTC
    CODE 1FE7H 0109H UNIT ?C_INITSEG
    CODE 20F0H 00C8H UNIT ?PR?EXINT1_INT_ROUTINE?MPG450
    CODE 21B8H 009AH UNIT ?PR?_PDMAC_START?MPG450
    CODE 2252H 0090H UNIT ?PR?SYSTEM_INIT?MPG450
    CODE 22E2H 008CH UNIT ?C_C51STARTUP
    CODE 236EH 0070H UNIT ?PR?MAIN?MPG450
    CODE 23DEH 0043H UNIT ?PR?BUS_READY?FUNC
    CODE 2421H 0041H UNIT ?PR?SHOW_MENU?DEBUG
    CODE 2462H 0037H UNIT ?PR?DRAMC_BIST?FUNC
    CODE 2499H 0036H UNIT ?PR?WDTC_INIT?WDTC
    CODE 24CFH 0034H UNIT ?PR?CPU_RAM_INIT?CPU_API
    CODE 2503H 0032H UNIT ?PR?CPU_UR0_INIT?CPU_API
    CODE 2535H 0027H UNIT ?PR?PUTCHAR?PUTCHAR
    CODE 255CH 0026H UNIT ?CO?MPG450
    CODE 2582H 0026H UNIT ?PR?END_COMMAND?USERCMD
    CODE 25A8H 001DH UNIT ?PR?TOINT?TOINT
    CODE 25C5H 000AH UNIT ?PR?_GETKEY?_GETKEY
    CODE 25CFH 0007H UNIT ?PR?CPU_EXINT1_SET?CPU_API

Reply
  • TYPE BASE LENGTH RELOCATION SEGMENT NAME
    -----------------------------------------------------

    * * * * * * * D A T A M E M O R Y * * * * * * *
    REG 0000H 0008H ABSOLUTE "REG BANK 0"
    DATA 0008H 0005H UNIT _DATA_GROUP_
    000DH 0013H *** GAP ***
    BIT 0020H.0 0001H.1 UNIT _BIT_GROUP_
    0021H.1 0000H.7 *** GAP ***
    IDATA 0022H 0001H UNIT ?STACK

    * * * * * * * X D A T A M E M O R Y * * * * * * *
    XDATA 0000H 011CH UNIT ?XD?MPG450
    XDATA 011CH 0028H UNIT _XDATA_GROUP_
    XDATA 0144H 0019H UNIT ?XD?_RS232_PROCESS?DEBUG
    XDATA 015DH 0009H UNIT ?XD?_DMA_TASK_SCHEDULER?MPG450
    XDATA 0166H 0008H UNIT ?XD?DMA_TASK_EXECUTE?MPG450
    XDATA 016EH 0005H UNIT ?XD?_CHANGE_VIDEO_SIZE?FUNC
    XDATA 0173H 0003H UNIT ?XD?EXINT1_INT_ROUTINE?MPG450
    XDATA 0176H 0003H UNIT ?XD?DRAMC_BIST?FUNC
    XDATA 0179H 0002H UNIT ?XD?SET_CHECKSUM?FUNC
    XDATA 017BH 0001H UNIT ?XD?CPU_UR0_INIT?CPU_API
    XDATA 017CH 0001H UNIT ?XD?_PDMAC_START?MPG450
    XDATA 017DH 0001H UNIT ?XD?MAIN?MPG450
    XDATA 017EH 0001H UNIT ?XD?RS232_INPUT?DEBUG
    BL51 BANKED LINKER/LOCATER V5.03 07/27/2005 10:40:44 PAGE 2


    XDATA 017FH 0001H UNIT ?XD?END_COMMAND?USERCMD

    * * * * * * * C O D E M E M O R Y * * * * * * *
    CODE 0000H 0003H ABSOLUTE
    CODE 0003H 000CH UNIT ?PR?SET_CHECKSUM?FUNC
    CODE 000FH 0001H UNIT ?PR?INIT_MPG450?USERCMD
    CODE 0010H 0001H UNIT ?PR?RESET_MPG450?USERCMD
    0011H 0002H *** GAP ***
    CODE 0013H 0003H ABSOLUTE
    CODE 0016H 07CAH UNIT ?PR?_RS232_PROCESS?DEBUG
    CODE 07E0H 07B2H UNIT ?PR?DMA_TASK_EXECUTE?MPG450
    CODE 0F92H 054AH UNIT ?PR?_DMA_TASK_SCHEDULER?MPG450
    CODE 14DCH 0365H UNIT ?PR?PRINTF?PRINTF
    CODE 1841H 023FH UNIT ?CO?DEBUG
    CODE 1A80H 0194H UNIT ?PR?_CHANGE_VIDEO_SIZE?FUNC
    CODE 1C14H 0194H UNIT ?C?LIB_CODE
    CODE 1DA8H 0135H UNIT ?PR?RS232_INPUT?DEBUG
    CODE 1EDDH 010AH UNIT ?PR?WDT_RESET?WDTC
    CODE 1FE7H 0109H UNIT ?C_INITSEG
    CODE 20F0H 00C8H UNIT ?PR?EXINT1_INT_ROUTINE?MPG450
    CODE 21B8H 009AH UNIT ?PR?_PDMAC_START?MPG450
    CODE 2252H 0090H UNIT ?PR?SYSTEM_INIT?MPG450
    CODE 22E2H 008CH UNIT ?C_C51STARTUP
    CODE 236EH 0070H UNIT ?PR?MAIN?MPG450
    CODE 23DEH 0043H UNIT ?PR?BUS_READY?FUNC
    CODE 2421H 0041H UNIT ?PR?SHOW_MENU?DEBUG
    CODE 2462H 0037H UNIT ?PR?DRAMC_BIST?FUNC
    CODE 2499H 0036H UNIT ?PR?WDTC_INIT?WDTC
    CODE 24CFH 0034H UNIT ?PR?CPU_RAM_INIT?CPU_API
    CODE 2503H 0032H UNIT ?PR?CPU_UR0_INIT?CPU_API
    CODE 2535H 0027H UNIT ?PR?PUTCHAR?PUTCHAR
    CODE 255CH 0026H UNIT ?CO?MPG450
    CODE 2582H 0026H UNIT ?PR?END_COMMAND?USERCMD
    CODE 25A8H 001DH UNIT ?PR?TOINT?TOINT
    CODE 25C5H 000AH UNIT ?PR?_GETKEY?_GETKEY
    CODE 25CFH 0007H UNIT ?PR?CPU_EXINT1_SET?CPU_API

Children
  • TYPE BASE LENGTH RELOCATION SEGMENT NAME
    -----------------------------------------------------

    * * * * * * * D A T A M E M O R Y * * * * * * *
    REG 0000H 0008H ABSOLUTE "REG BANK 0"
    DATA 0008H 0005H UNIT _DATA_GROUP_
    000DH 0013H *** GAP ***
    BIT 0020H.0 0001H.1 UNIT _BIT_GROUP_
    0021H.1 0000H.7 *** GAP ***
    IDATA 0022H 0001H UNIT ?STACK

    * * * * * * * X D A T A M E M O R Y * * * * * * *
    XDATA 0000H 009CH UNIT ?XD?MPG450
    XDATA 009CH 0028H UNIT _XDATA_GROUP_
    XDATA 00C4H 0019H UNIT ?XD?_RS232_PROCESS?DEBUG
    XDATA 00DDH 0009H UNIT ?XD?_DMA_TASK_SCHEDULER?MPG450
    XDATA 00E6H 0008H UNIT ?XD?DMA_TASK_EXECUTE?MPG450
    XDATA 00EEH 0005H UNIT ?XD?_CHANGE_VIDEO_SIZE?FUNC
    XDATA 00F3H 0003H UNIT ?XD?EXINT1_INT_ROUTINE?MPG450
    XDATA 00F6H 0003H UNIT ?XD?DRAMC_BIST?FUNC
    XDATA 00F9H 0002H UNIT ?XD?SET_CHECKSUM?FUNC
    XDATA 00FBH 0001H UNIT ?XD?CPU_UR0_INIT?CPU_API
    XDATA 00FCH 0001H UNIT ?XD?_PDMAC_START?MPG450
    XDATA 00FDH 0001H UNIT ?XD?MAIN?MPG450
    XDATA 00FEH 0001H UNIT ?XD?RS232_INPUT?DEBUG
    BL51 BANKED LINKER/LOCATER V5.03 07/27/2005 10:38:22 PAGE 2


    XDATA 00FFH 0001H UNIT ?XD?END_COMMAND?USERCMD

    * * * * * * * C O D E M E M O R Y * * * * * * *
    CODE 0000H 0003H ABSOLUTE
    CODE 0003H 000CH UNIT ?PR?SET_CHECKSUM?FUNC
    CODE 000FH 0001H UNIT ?PR?INIT_MPG450?USERCMD
    CODE 0010H 0001H UNIT ?PR?RESET_MPG450?USERCMD
    0011H 0002H *** GAP ***
    CODE 0013H 0003H ABSOLUTE
    CODE 0016H 07CAH UNIT ?PR?_RS232_PROCESS?DEBUG
    CODE 07E0H 07B2H UNIT ?PR?DMA_TASK_EXECUTE?MPG450
    CODE 0F92H 054AH UNIT ?PR?_DMA_TASK_SCHEDULER?MPG450
    CODE 14DCH 0365H UNIT ?PR?PRINTF?PRINTF
    CODE 1841H 023FH UNIT ?CO?DEBUG
    CODE 1A80H 0194H UNIT ?PR?_CHANGE_VIDEO_SIZE?FUNC
    CODE 1C14H 0194H UNIT ?C?LIB_CODE
    CODE 1DA8H 0135H UNIT ?PR?RS232_INPUT?DEBUG
    CODE 1EDDH 010AH UNIT ?PR?WDT_RESET?WDTC
    CODE 1FE7H 00C8H UNIT ?PR?EXINT1_INT_ROUTINE?MPG450
    CODE 20AFH 009AH UNIT ?PR?_PDMAC_START?MPG450
    CODE 2149H 0090H UNIT ?PR?SYSTEM_INIT?MPG450
    CODE 21D9H 008CH UNIT ?C_C51STARTUP
    CODE 2265H 0085H UNIT ?C_INITSEG
    CODE 22EAH 0070H UNIT ?PR?MAIN?MPG450
    CODE 235AH 0043H UNIT ?PR?BUS_READY?FUNC
    CODE 239DH 0041H UNIT ?PR?SHOW_MENU?DEBUG
    CODE 23DEH 0037H UNIT ?PR?DRAMC_BIST?FUNC
    CODE 2415H 0036H UNIT ?PR?WDTC_INIT?WDTC
    CODE 244BH 0034H UNIT ?PR?CPU_RAM_INIT?CPU_API
    CODE 247FH 0032H UNIT ?PR?CPU_UR0_INIT?CPU_API
    CODE 24B1H 0027H UNIT ?PR?PUTCHAR?PUTCHAR
    CODE 24D8H 0026H UNIT ?CO?MPG450
    CODE 24FEH 0026H UNIT ?PR?END_COMMAND?USERCMD
    CODE 2524H 001DH UNIT ?PR?TOINT?TOINT
    CODE 2541H 000AH UNIT ?PR?_GETKEY?_GETKEY
    CODE 254BH 0007H UNIT ?PR?CPU_EXINT1_SET?CPU_API

  • Sorry

    May anyone tell me what is the diffent
    between this two linker map

    The fisrt one cann't run any thing!!
    The second will get reset when use
    function pointer table

    The source code only has one place diffent
    the first add [ code ] key word !!

    Thanks a lot

  • I think nobody is able to figure out your programming problem from the posted MAP files.

    When you get a RESET, you should analyse the problem using the debugger.

    I suggest that you start with a small example frist. Take a look to A51.PDF, Chapter 9, Using the Overlay Control, Pointer to a Function in Arrays or Tables.

    Reinhard

  • Thanks

    The Code I have run very well before,
    I just distributed code into many c file
    add [code] key world cann't run any,
    I add [NOOVERLAY],the result is the same><

    Thanks again,I will try to read DOC more