冰火★逍遥 发表于 2012-9-5 09:33:26

2440堆栈被修改

在对GPACON 进行操作时,用户堆栈会被修改。如果在调用嵌套函数的时候,会到导致函数返回值,返回位置不确定。

embedsky_lhh 发表于 2012-9-5 10:35:21

这个是在神马情况测的,单步调试吗?

冰火★逍遥 发表于 2012-9-5 13:23:21

embedsky_lhh 发表于 2012-9-5 10:35 static/image/common/back.gif
这个是在神马情况测的,单步调试吗?

嗯~
无论GPACON 在程序哪个地方赋值都会改变堆栈的值,而别的端口赋值则不会出现堆栈被修改。

冰火★逍遥 发表于 2012-9-5 13:27:29

冰火★逍遥 发表于 2012-9-5 13:23 static/image/common/back.gif
嗯~
无论GPACON 在程序哪个地方赋值都会改变堆栈的值,而别的端口赋值则不会出现堆栈被修改。

下到NANDFLASH里面运行,程序会由于指针的改变没有顺序执行,中间有段程序会跳过去。结果程序运行不正常。

embedsky_lhh 发表于 2012-9-6 09:21:57

冰火★逍遥 发表于 2012-9-5 13:27 static/image/common/back.gif
下到NANDFLASH里面运行,程序会由于指针的改变没有顺序执行,中间有段程序会跳过去。结果程序运行不正常。 ...

贴下你的代码,你是怎么操作的?

冰火★逍遥 发表于 2012-9-6 11:12:25

embedsky_lhh 发表于 2012-9-6 09:21 static/image/common/back.gif
贴下你的代码,你是怎么操作的?

void Port_Init(void)
{
    //CAUTION:Follow the configuration order for setting the ports.
    // 1) setting value(GPnDAT)
    // 2) setting control register(GPnCON)
    // 3) configure pull-up resistor(GPnUP)

    //32bit data bus configuration
    //*** PORT A GROUP
    //Ports: GPA22 GPA21GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12
    //Signal : nFCE nRSTOUT nFRE   nFWEALE   CLEnGCS5 nGCS4 nGCS3 nGCS2 nGCS1
    //Binary :1   1      1, 1   1   1    1   ,1   1   1   1
    //Ports: GPA11   GPA10GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1GPA0
    //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
    //Binary :1       1      1      1   , 1       1      1      1   ,1       1   1      1         
    rGPACON = 0x7fffff;

    //**** PORT B GROUP
    //Ports: GPB10    GPB9    GPB8    GPB7    GPB6   GPB5    GPB4   GPB3   GPB2   GPB1      GPB0
    //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
    //Setting: INPUTOUTPUT   INPUTOUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT
    //Binary :   00,01       00,   01      00   ,01       01,   01   01   ,01      01
    //rGPBCON = 0x000150;(youlong)
    rGPBCON = 0x015550;
    rGPBUP= 0x7ff;   // The pull up function is disabled GPB

    //*** PORT C GROUP for youlong
    //Ports: GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8GPC7   GPC6   GPC5 GPC4 GPC3GPC2GPC1 GPC0
    //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
    //Binary :10   10, 10    10, 10    10, 10   10, 10   10,10   10 , 10   10 , 10   10
    //rGPCCON = 0xaaaaaaaa;      
    //rGPCUP= 0xffff;   // The pull up function is disabled GPC
   
    //*** PORT C GROUP
    //Ports: GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8GPC7   GPC6   GPC5 GPC4 GPC3GPC2GPC1 GPC0
    //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
    //Binary :10   10, 10    10, 10    10, 10   01, 01   01,01   10 , 10   10 , 10   10
    rGPCCON = 0xaaa956aa;      
    rGPCUP= 0xffff;   // The pull up function is disabled GPC   

    //*** PORT D GROUP
    //Ports: GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
    //Signal : VD23VD22VD21VD20VD19VD18VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9VD8
    //Binary : 10    10, 10    10, 10    10, 10   10 , 10   10 , 10   10 , 10   10 ,10   10
    rGPDCON = 0xaaaaaaaa;      
    rGPDUP= 0xffff;   // The pull up function is disabled GPD

    //*** PORT E GROUP
    //Ports: GPE15GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8   GPE7GPE6GPE5   GPE4
    //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN
    //Binary :10   10,10      10,10      10   ,10      10   ,   10    10, 10   00,   
    //-------------------------------------------------------------------------------------------------------
    //Ports:GPE3   GPE2GPE1    GPE0   
    //Signal :IN   IN    IN      IN
    //Binary :00   00,00      00
    //rGPECON = 0xaaaaaaaa;      
    //rGPEUP= 0xffff;   // The pull up function is disabled GPE
        rGPECON = 0xa02aa800; // For added AC97 setting      
    rGPEUP= 0xffff;   

   //*** PORT F GROUP
    //Ports: GPF7   GPF6   GPF5   GPF4      GPF3   GPF2GPF1   GPF0
    //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
    //Setting: Output Output Output Output    EINT3    EINT2 EINT1EINT0
    //Binary :01      01 ,01   01,   10       10, 10   10
    //rGPFCON = 0x55aa;
        rGPFCON = 0x5500;
    rGPFUP= 0xff;   // The pull up function is disabled GPF
        rGPFDAT |= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 4) ;//将键盘对应的四个引脚置为高电平,完成初始化工作

    //*** PORT G GROUP
    //Ports: GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9   GPG8   GPG7      GPG6   
    //Signal : nYPONYMON nXPON XMONEINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
    //Setting: nYPONYMON nXPON XMONEINT19Output   Output   Output   SPICLK1    SPIMOSI1
    //Binary :   11    11 , 11    11, 10      01    ,   01       01   ,    11         11
    //-----------------------------------------------------------------------------------------
    //Ports:    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0   
    //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
    //Setting:SPIMISO1LCD_PWRDN EINT11   nSS0   EINT9    EINT8
    //Binary :   11         11   ,10      11,10      10
    rGPGCON = 0x00a2aaaa;// GPG9 input without pull-up
    rGPGUP= 0xffff;    // The pull up function is disabled GPG

    //*** PORT H GROUP
    //Ports:GPH10    GPH9GPH8 GPH7GPH6GPH5 GPH4 GPH3 GPH2 GPH1GPH0
    //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
    //Binary :   10   ,10   10 , 11    11, 10   10 , 10   10 , 10    10
    rGPHCON = 0x00faaa;
    rGPHUP= 0x7ff;    // The pull up function is disabled GPH

        // Added for S3C2440X, DonGo
        //*** PORT J GROUP
    //Ports: GPJ12   GPJ11       GPJ10    GPJ9    GPJ8      GPJ7      GPJ6      GPJ5      GPJ4      GPJ3      GPJ2      GPJ1   GPJ0
    //Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT CAMDAT CAMDAT CAMDAT CAMDAT CAMDAT CAMDAT CAMDAT
    //Binary :   10      10       10      10       10      10      10      10       10         10      10      10      10
    rGPJCON = 0x02aaaaaa;
    rGPJUP= 0x1fff;    // The pull up function is disabled GPH
   
    //External interrupt will be falling edge triggered.
    rEXTINT0 = 0x22222222;    // EINT
    rEXTINT1 = 0x22222222;    // EINT
    rEXTINT2 = 0x22222222;    // EINT
}void sys_init(void)
{       
        Port_Init();
        Gpio_Init();       
        Isr_Init();
        setlocale(LC_ALL, "C");
}void Main(void)
{
       
        U8 m,n;
        U8 Addr_temp;
        S32 i,j;
        U32 CRC_TEMP1,CRC_TEMP2;
        S32 XXX;
        S32 YYY;
        U32 ADC_Time=1000;
        U32 mpll_val = 0 ;

        sys_init();

//         __rt_lib_init(0,0);
        //init FCLK=400M, so change MPLL first
        mpll_val = (92<<12)|(1<<4)|(1);       

冰火★逍遥 发表于 2012-9-6 11:26:50

embedsky_lhh 发表于 2012-9-6 09:21 static/image/common/back.gif
贴下你的代码,你是怎么操作的?

由于函数里面调用的函数,现场保存于堆栈之中,在0X33ff57d8位置,正常为0x30001013。执行完    rGPACON = 0x7fffff之后,堆栈0X33ff57d8 位置变为 0x30001A3C。一至于跳出函数时返回的位置不对。
页: [1]
查看完整版本: 2440堆栈被修改