FreeRTOS任务堆栈溢出问题

时间:2016-12-16 20:11:31

标签: c freertos

我正在使用一个freertos端口的microblaze,我有一些简单的代码,在任务中闪烁灯光,我得到一个"任务溢出其堆栈调用"。请注意,错误消息实际上并没有打印出任务名称,但考虑到我只有一个任务,我认为可能存在问题。

每次收到一个角色时,我也会触发一个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 = .;
}

1 个答案:

答案 0 :(得分:0)

您有configCHECK_FOR_STACK_OVERFLOW设置为1还是2?如果为2,那么堆栈溢出检查的工作原理是检查任务堆栈的结尾,以查看在创建任务时写入的模式是否已被覆盖。因此,有可能它实际上不是任务的堆栈覆盖该内存,而是其他东西通过写入来破坏该内存。您在重负载(按住某个键)时使用uart中断描述的问题可能是中断服务程序中出现问题的线索。

您是否定义了configASSERT()

相关问题