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

Другие вопросы по тегам