c - VxWorks 5.5 没有用 0xEEEEEEEE 填充堆栈

标签 c vxworks

来自 taskSpawn VxWorks 5.5 文档:

“分配给派生任务的唯一资源是一个指定大小的堆栈stackSize,它是从系统内存分区分配的。堆栈大小应该是一个偶数。任务控制 block (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 似乎仍在工作)。

最佳答案

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

关于c - VxWorks 5.5 没有用 0xEEEEEEEE 填充堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768660/

相关文章:

c - vxworks设置串口波特率失败

c - 用 void * 转换奇怪的指针

c++ - 强制整数缓冲区溢出是否合法?

objective-c - 返回数组中* Fraction对象之和的函数不起作用

c++ - 系统时钟和辅助时钟的区别

c - 使用 VxWorks C 将二进制数据发送到串行端口

c - RAM_HIGH_ADRS 在 VxWorks BSP 中的真正含义是什么?

c++ - 异步过程调用中的 GetLastError 竞争

内核模块(Linux)中编写的中断可以通知Qt中正在运行的程序吗?没有用户空间程序等待/轮询?

c++ - 将 IPv4 地址从 ifaddrs 结构分配给 sockaddr_in 结构