私はmicroblazeのfreertosポートを使用していますが、タスクのライトを点滅させるシンプルなコードがあり、「スタックオーバーフローのスタックコール」が発生しています。エラーメッセージが実際にタスク名を表示していないことに注意してください。ただし、問題が発生する可能性があると思うタスクが1つしかないと考えると、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 = .;
}
アドレス*(volatile unsigned int *)に書き込むことで何を達成しようとしていますか?0x40000000&=〜0x1; ? – Damien