2016-12-16 49 views
0

私は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 = .; 
} 
+0

アドレス*(volatile unsigned int *)に書き込むことで何を達成しようとしていますか?0x40000000&=〜0x1; ? – Damien

答えて

0

あなたが1または2にconfigCHECK_FOR_STACK_OVERFLOWセットを持っていますか? 2の場合、スタックオーバーフローチェックは、タスクスタックの終わりを検査して、タスクの作成時にそこに書き込まれたパターンが上書きされているかどうかを調べることによって機能します。したがって、タスクのスタックが実際にそのメモリを上書きするのではなく、何か他のものが上書きすることによってそのメモリを破壊している可能性があります。重い負荷(キーを押したまま)でのuart割り込みで説明する問題は、割り込みサービスルーチンに問題があることを示す手がかりになる可能性があります。

configASSERT()が定義されていますか?

+0

はい、その設定は2です。私は現在configASSERT()を使用していません。私は割り込みからすべてのコードを削除したので、割り込みを発生させ、同じエラーが発生します...私はmicroblazeでfast_interruptとしてuartを有効にしています。違いはありますか?実際にはコードが存在せず、スタックを使用しないため意味をなさない。 – Godspped

関連する問題