2016-12-16 67 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