VxWorks 5.5 не заполняет стек 0xEEEEEEEE
Из документации по 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
кажется работает до сих пор).
2 ответа
Попробуйте 'stack_addr--;' - Спорим, ты на Intel, где стеки растут вниз. Вы просматриваете действительные данные стека - адреса возврата и локальные переменные, некоторые из которых не инициализированы.
Мое первоначальное предположение состояло в том, что задача была порождена VX_NO_STACK_FILL
, который говорит vxworks не инициализировать стек 0xEE
, Но, глядя на ваш код, вы просто используете VX_FP_TASK
(для поддержки с плавающей запятой). Поэтому стек должен быть правильно инициализирован.
Это действительно оставляет две возможности. Первый (и более маловероятный) заключается в том, что что-то другое пишет там, где этого не должно быть, но вы, вероятно, увидите странное поведение в другом месте (и я мог бы ожидать checkStack
чтобы показать что что-то было разбито)
Второе, как уже предлагали другие, заключается в том, что вы находитесь на одной из архитектур (например, Intel), где стек растет вниз. Дополнение к архитектуре VxWorks должно указывать направление развития стека для вашей архитектуры.
Вы также можете сказать об этом во время компиляции, включив vxArch.h
и тестирование стоимости _STACK_DIR
за _STACK_GROWS_DOWN
или же _STACK_GROWS_UP