2016-12-16 154 views
0

我正在使用一個freertos端口的microblaze,並且我有一些簡單的代碼在任務中閃爍一下,我得到一個「任務溢出它的堆棧調用」。注意錯誤消息實際上並沒有打印任務名稱,但考慮到我只有一項任務,我認爲那裏可能存在問題。FreeRTOS任務堆棧溢出問題

我也有一個uart中斷髮射,每次接收到一個角色時也是如此,但是效果很好。在我附加的鏈接腳本中,我增加了堆棧和堆大小,但仍然遇到了這個問題。如果我禁用main_task,我不會得到堆棧溢出,這意味着它可能與任務有關?我也應該說它的工作正常,但如果我繼續擊中輸入在將發出中斷的uart,我最終會得到這個錯誤。

任何幫助將是真正有用的,因爲我在我的智慧在這裏結束。提前致謝。

void 
main_task() 
{ 
    int counter = 0; 
    while(1) 
    { 
     if ((counter++%2) == 0) 
     { 
     *(volatile unsigned int*)0x40000000 &= ~0x1; 
     } 
     else 
     { 
     *(volatile unsigned int*)0x40000000 |= 0x1; 
     } 
     vTaskDelay(200); 
    } 
} 

int main() 
{ 
    xTaskCreate((void(*)(void*)) main_task, "main_task", 4096, NULL, 3, &xCreatedTask); 
    vTaskStartScheduler(); 
} 

這是鏈接描述我使用:

STARTUP(crt0.o) 
ENTRY(_start) 

_STACK_SIZE = 0x4000; 
_HEAP_SIZE = 0x4000; 

MEMORY 
{ 
    mig_7series_0 : ORIGIN = 0x80000000, LENGTH = 0x10000000 
} 

SECTIONS 
{ 
.vectors.reset 0x0 : { 
    KEEP (*(.vectors.reset)) 
} 

.vectors.sw_exception 0x8 : { 
    KEEP (*(.vectors.sw_exception)) 
} 

.vectors.interrupt 0x10 : { 
    KEEP (*(.vectors.interrupt)) 
} 

.vectors.hw_exception 0x20 : { 
    KEEP (*(.vectors.hw_exception)) 
} 

.text : { 
    *(.text) 
    *(.text.*) 
    *(.gnu.linkonce.t.*) 
} > mig_7series_0 

.rodata : { 
    __rodata_start = .; 
    *(.rodata) 
    *(.rodata.*) 
    *(.gnu.linkonce.r.*) 
    __rodata_end = .; 
} > mig_7series_0 

.sdata2 : { 
    . = ALIGN(8); 
    __sdata2_start = .; 
    *(.sdata2) 
    *(.sdata2.*) 
    *(.gnu.linkonce.s2.*) 
    . = ALIGN(8); 
    __sdata2_end = .; 
} > mig_7series_0 

.sbss2 : { 
    __sbss2_start = .; 
    *(.sbss2) 
    *(.sbss2.*) 
    *(.gnu.linkonce.sb2.*) 
    __sbss2_end = .; 
} > mig_7series_0 

.data : { 
    . = ALIGN(4); 
    __data_start = .; 
    *(.data) 
    *(.data.*) 
    *(.gnu.linkonce.d.*) 
    __data_end = .; 
} > mig_7series_0 

.sdata : { 
    . = ALIGN(8); 
    __sdata_start = .; 
    *(.sdata) 
    *(.sdata.*) 
    *(.gnu.linkonce.s.*) 
    __sdata_end = .; 
} > mig_7series_0 

.sbss (NOLOAD) : { 
    . = ALIGN(4); 
    __sbss_start = .; 
    *(.sbss) 
    *(.sbss.*) 
    *(.gnu.linkonce.sb.*) 
    . = ALIGN(8); 
    __sbss_end = .; 
} > mig_7series_0 

.tdata : { 
    __tdata_start = .; 
    *(.tdata) 
    *(.tdata.*) 
    *(.gnu.linkonce.td.*) 
    __tdata_end = .; 
} > mig_7series_0 

.tbss : { 
    __tbss_start = .; 
    *(.tbss) 
    *(.tbss.*) 
    *(.gnu.linkonce.tb.*) 
    __tbss_end = .; 
} > mig_7series_0 

.bss (NOLOAD) : { 
    . = ALIGN(4); 
    __bss_start = .; 
    *(.bss) 
    *(.bss.*) 
    *(.gnu.linkonce.b.*) 
    *(COMMON) 
    . = ALIGN(4); 
    __bss_end = .; 
} > mig_7series_0 

_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start)/2); 

_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start)/2); 

/* Generate Stack and Heap definitions */ 

.heap (NOLOAD) : { 
    . = ALIGN(8); 
    _heap = .; 
    _heap_start = .; 
    . += _HEAP_SIZE; 
    _heap_end = .; 
} > mig_7series_0 

.stack (NOLOAD) : { 
    _stack_end = .; 
    . += _STACK_SIZE; 
    . = ALIGN(8); 
    _stack = .; 
    __stack = _stack; 
} > mig_7series_0 

_end = .; 
} 
+0

你想通過寫入地址*(volatile unsigned int *)0x40000000&=〜0x1; ? – Damien

回答

0

你有configCHECK_FOR_STACK_OVERFLOW設置爲1或2?如果是2,則通過檢查任務堆棧的結束來查看堆棧溢出檢查是否工作,以查看在任務創建時寫入的模式是否被覆蓋。因此,它可能並非實際上是覆蓋該內存的任務堆棧,而是其他內容通過寫入內存而破壞了該內存。在高負載情況下(按住一個鍵),用uart中斷描述的問題可能是中斷服務程序中存在問題的線索。

您是否定義了configASSERT()

+0

是它的設置爲2.我目前不使用configASSERT()。我從中斷中刪除了所有代碼,所以我所做的就是激發中斷併發生相同的錯誤...我將uart作爲microblaze中的fast_interrupt。這會有所作爲嗎?沒有意義,因爲沒有代碼,所以沒有堆棧使用。 – Godspped