VxWorks 5.5没有用0xEEEEEEEE填充堆栈

时间:2013-12-25 02:59:55

标签: c vxworks

来自taskSpawn VxWorks 5.5文档:

“分配给生成任务的唯一资源是指定大小stackSize的堆栈,它是从系统内存分区分配的。堆栈大小应该是一个偶数。从堆栈中刻出一个任务控制块(TCB) ,以及任务名称所需的任何内存。剩余的内存是任务的堆栈,每个字节都填充了checkStack()工具的值0xEE。有关堆栈大小检查帮助,请参阅checkStack()的手册条目。 “

然而,当试图通过产生一个全新的任务来扫描堆栈时:

int scan_the_stack(...)
{
    printf("Going to scan the stack forward\n");

    int i = 0;
    int* stack_addr = &i;
    for (int i = 0; i < 100; i++)
    {
        printf("%d : %X\n", i, *stack_addr);
        stack_addr++;
    }

    return 0;
}

void spawn_scan_stack()
{ 
     taskSpawn("tScanner",     /* name of new task (stored at pStackBase) */
                    150,            /* priority of new task */
                    VX_FP_TASK,     /* task option word */
                    10000,          /* size (bytes) of stack needed plus name */
                    scan_the_stack, /* entry point of new task */
                    0,              /* 1st of 10 req'd args to pass to entryPt */
                    0,0,0,0,0,0,0,0,0);
}

我没有获得预期的连续“EEEEEEEE”,而是将一些“EE”与其他值混合在一起:

-> spawn_scan_stack
    value = 80735920 = 0x4cfeeb0
    -> Going to scan the stack forward
    0 : 0
    1 : 4CFEE1C
    2 : 2
    3 : EEEEEEEE
    4 : EEEEEEEE
    5 : EEEEEEEE
    6 : EEEEEEEE
    7 : 0
    8 : 0
    9 : 0
    10 : 4CFEE70
    11 : 2951F4
    12 : 0
    13 : 0
    14 : EEEEEEEE
    15 : EEEEEEEE
    16 : EEEEEEEE
    17 : EEEEEEEE
    18 : EEEEEEEE
    19 : 0
    20 : 0
    21 : 0
    22 : 0
    23 : 0
    24 : EEEEEEEE
    25 : EEEEEEEE
    26 : EEEEEEEE
    27 : EEEEEEEE
    28 : 0
    29 : 0
    30 : 0
    31 : 0
    32 : 0
    33 : 0
    34 : 0
    35 : 0
    36 : 0
    37 : 0
    38 : 0
    39 : 0
    40 : 96
    41 : FF630
    42 : 20
    43 : 11000001
    44 : 19BDD /*...*/

问题是为什么堆栈没有填充EEEEEEE(checkStack似乎仍在工作)。

2 个答案:

答案 0 :(得分:1)

试试'stack_addr--;' - 打赌你在英特尔那里堆栈增长。您正在查看有效的堆栈数据 - 返回地址和本地变量,其中一些是未初始化的。

答案 1 :(得分:0)

我最初的假设是该任务是使用VX_NO_STACK_FILL生成的,它告诉vxworks不要将堆栈初始化为0xEE。但是,查看代码,只需使用VX_FP_TASK(用于浮点支持)。所以堆栈应该正确初始化。

这确实留下了两种可能性。第一个(也是更不可能的)是其他东西在不应该写的地方,但你可能会在其他地方看到奇怪的行为(我可能期望checkStack表明某些东西被粉碎了)

第二个,正如其他人已经建议的那样,你处于堆栈向下增长的架构之一(例如intel)。 VxWorks架构补充应该告诉您堆栈在架构方面的发展方向。

您也可以在编译时通过包含vxArch.h并测试_STACK_DIR_STACK_GROWS_DOWN的{​​{1}}值来判断