来自 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/