Jörg Wunsch wrote:
> Andreas N. wrote:
>
>> Ich habe -fstack-check mal nur beim Linkerlauf eingefügt - dann kommen
>> (auch bei zu großem Stack) KEINE Warnungen.
>
> Ja, das hatte ich befürchtet.
Ich auch... ;-)
>
>> Wenn ich es beim compilieren und beim linken einfüge, dann kommt bereits
>> nach dem compilieren die Warnung (auch wenn KEIN Stacküberlauf vorhanden
>> ist)
>
> Nun, die Warnung ist gut. :) Es ist eine der beiden da oben:
Es ist die obere. Das habe ich durch verändern des belegten Stacks (in
meiner Testfunktion) getestet.
1 | void stack_overflow_test(void) {
|
2 | int _daten[2000]; // hier erzeuge ich die Stack Overflow Warnung
|
3 | xil_printf("TEST: Stack Overflow!!!");
|
4 | }
|
5 |
|
6 | int main() {
|
7 |
|
8 | /* Wait for interrupts to occur */
|
9 | while(1) {
|
10 | if(one_second_flag){
|
11 | xil_printf("Interrupt bei %d Sekunden.\n\r",count);
|
12 | if(XGpio_DiscreteRead(&gpio_eingang2, 1) == 1) {
|
13 | xil_printf("Ich erzeuge jetzt einen Stack Overflow!!!\r\n");
|
14 | stack_overflow_test();
|
15 | }
|
16 | }
|
17 | }
|
18 | }
|
>
>> ../main.c:106: warning: frame size too large for reliable stack checking
>
> Und die Erklärung, was du machen solltest, folgt auch gleich:
>
>> ../main.c:106: warning: try reducing the number of local variables
>
> Deine Stackframes sind einfach zu groß, und die Warnung sagt dir,
> dass der Stacktest dann (u. U.) nicht funktionieren wird. Die Warnung
> besagt ja nicht, dass das Ergebnis nicht in den Stack passen würde.
Ich weiß aber, dass die Standardmäßige Stackgröße für -fstack-check bei
0x100 steht. Im Linkerskript ist die Größe aber auf 0x900 eingestellt.
Linkerskript (Auszug davon)
1 | /* Linker Script automatically rev'ed up using XPS 9.1 */
|
2 | /*******************************************************************/
|
3 | /* */
|
4 | /* This file is automatically generated by linker script generator.*/
|
5 | /* */
|
6 | /* Version: Xilinx EDK 10.1.03 EDK_K_SP3.6 */
|
7 | /* */
|
8 | /* Copyright (c) 2004 Xilinx, Inc. All rights reserved. */
|
9 | /* */
|
10 | /* Description : MicroBlaze Linker Script */
|
11 | /* */
|
12 | /*******************************************************************/
|
13 |
|
14 | _STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x900;
|
15 | _HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x400;
|
16 |
|
17 | /* Generate Stack and Heap definitions */
|
18 |
|
19 | .heap : {
|
20 | . = ALIGN(8);
|
21 | _heap = .;
|
22 | _heap_start = .;
|
23 | . += _HEAP_SIZE;
|
24 | _heap_end = .;
|
25 | } > ilmb_cntlr_dlmb_cntlr
|
26 |
|
27 | .stack : {
|
28 | _stack_end = .;
|
29 | . += _STACK_SIZE;
|
30 | . = ALIGN(8);
|
31 | _stack = .;
|
32 | __stack = _stack;
|
33 | } > ilmb_cntlr_dlmb_cntlr
|
Gruß,
Andreas