Из документации 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
, похоже, все еще работает).