来自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
似乎仍在工作)。
答案 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}}值来判断