【问题标题】:VxWorks 5.5 not filling stack with 0xEEEEEEEEVxWorks 5.5 没有用 0xEEEEEEEE 填充堆栈
【发布时间】:2014-02-28 17:12:16
【问题描述】:

来自 taskSpawn VxWorks 5.5 文档:

“分配给衍生任务的唯一资源是一个指定大小的堆栈stackSize,它是从系统内存分区分配的。堆栈大小应该是一个偶数。一个任务控制块(TCB)是从堆栈中雕刻出来的, 以及任务名称所需的任何内存。剩余的内存是任务的堆栈,每个字节都用值 0xEE 填充 checkStack( ) 工具。有关堆栈大小检查帮助,请参阅 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 似乎仍在工作)。

【问题讨论】:

  • 向下扫描?英特尔堆栈下降。

标签: c vxworks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    第二个,正如其他人已经建议的那样,您处于堆栈向下增长的架构之一(例如英特尔)。 VxWorks Architecture Supplement 应该告诉您堆栈为您的架构发展的方向。

    您还可以在编译时通过包含vxArch.h 并测试_STACK_DIR 的值来判断_STACK_GROWS_DOWN_STACK_GROWS_UP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2019-02-19
      相关资源
      最近更新 更多