2013-12-08 75 views
1

我一直在使用stm32f103,現在我想在stm32f407上吃一些代碼。 要通過USART接口進行通信我在使用結構的形式FIFO查詢,在頭文件中定義:C/STM32結構指針

#define FIFO_BUF_SIZE   128 

typedef struct { 
    char data[FIFO_BUF_SIZE]; 
    uint16_t startIndex; 
    uint16_t endIndex; 
}FIFO, *ptrFIFO; 

全球這種結構的聲明在源文件:

FIFO RX_Buff={{},0,0}; 
FIFO TX_Buff={{},0,0}; 

現在我希望把從數據字符數組先進先出查詢:

void USART_PrintData(USART_TypeDef * USART, char str[]){ 
    ptrFIFO pTX = &TX_Buff; 
    int i=0; 

    while(str[i]!='\0'){ 
     FIFO_Put(pTX, str[i]); 
     i++; 
    } 
     //here in working program is code for sending data 
     //deleted from program for tests 
} 

void FIFO_Put(ptrFIFO fifo, char data){ 
    uint16_t tmp; 
    tmp = fifo->startIndex; 
    fifo->data[tmp]=data; 
    tmp = (tmp+1)%(FIFO_BUF_SIZE-1); 
    fifo->startIndex=tmp; 
} 

該代碼已經工作的STM32F103但不會對F407。傳遞給FIFO_Put(最後一次登錄後),並寫入FIFO查詢,PROGRAMM去Default_Handler或內存(取決於幽默的)奇怪的地址,但是當採用這種結構我直接正常工作:

void FIFO_Put(char data){ 
    uint16_t tmp; 
    tmp = TX_Buff.startIndex; 
    TX_Buff.data[tmp]=data; 
    tmp = (tmp+1)%(FIFO_BUF_SIZE-1); 
    TX_Buff.startIndex=tmp; 
} 

我沒有想法是什麼錯誤。

感謝您的任何幫助。


我試着調試,問題是在功能FIFO_Put()最後一行:

fifo->startIndex=tmp; 

當函數把最後的跡象FIFO,最後一行程序跳轉後default_handler。 如果我評論這一行,程序工作正常。

+0

對我來說看起來不錯。你可以將它附加到調試器嗎? –

+0

也許這是堆棧大小問題? –

+0

謝謝!這是問題所在。我的項目基於本網站的模板:http://www.freddiechopin.info/。在鏈接器腳本中有兩個堆棧:主堆棧和進程堆棧。第一個的大小設置爲0,當我在1024程序重置開始工作。我想知道爲什麼有兩個堆棧? – nawigator1

回答

0

檢查程序堆棧大小 - 從我的經驗來看,這種未定義的行爲可能是由堆棧溢出引起的。