gpt4 book ai didi

c - FreeRTOS任务堆栈溢出问题

转载 作者:行者123 更新时间:2023-11-30 16:52:31 28 4
gpt4 key购买 nike

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

每次接收到字符时,我也会触发一个 uart 中断,但这效果很好。在我附加的链接器脚本中,我将堆栈和堆大小增加到相当大,但我仍然遇到这个问题。如果我禁用 main_task 我不会出现堆栈溢出,这意味着它可能与任务有关?我还应该说它工作正常,但如果我继续在 uart 中按 Enter 键,这将发出中断,我最终会收到此错误。

任何帮助都会非常有帮助,因为我在这里束手无策。提前致谢。

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 = .;
}

最佳答案

你有configCHECK_FOR_STACK_OVERFLOW吗?设置为 1 或 2?如果为 2,则堆栈溢出检查通过检查任务堆栈的末尾来查看创建任务时写入的模式是否已被覆盖。因此,有可能实际上并不是任务堆栈覆盖了该内存,而是其他东西通过覆盖该内存而破坏了该内存。您所描述的重负载(按住某个键)下的 uart 中断问题可能是中断服务例程中存在问题的线索。

你有configASSERT()吗?定义?

关于c - FreeRTOS任务堆栈溢出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41191787/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com