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, похоже, все еще работает).


person Nickolay Kondratyev    schedule 25.12.2013    source источник
comment
Сканировать вниз? Стеки Intel выходят из строя.   -  person Martin James    schedule 25.12.2013


Ответы (2)


Попробуйте 'stack_addr--;' - Держу пари, вы на Intel, где стеки растут вниз. Вы просматриваете действительные данные стека - адреса возврата и локальные переменные, некоторые из которых не инициализированы.

person Martin James    schedule 25.12.2013

Мое первоначальное предположение состояло в том, что задача была порождена с VX_NO_STACK_FILL, что говорит vxworks не инициализировать стек до 0xEE. Но, глядя на ваш код, вы просто используете VX_FP_TASK (для поддержки с плавающей запятой). Таким образом, стек должен быть правильно инициализирован.

Это действительно оставляет две возможности. Первый (и более маловероятный) заключается в том, что что-то еще пишет там, где этого быть не должно, но вы, вероятно, увидите странное поведение в другом месте (и я могу ожидать, что checkStack покажет, что что-то было разбито)

Второй, как уже было предложено другими, заключается в том, что вы находитесь на одной из архитектур (например, Intel), где стек растет вниз. В Дополнении по архитектуре VxWorks должно быть указано, в каком направлении растет стек для вашей архитектуры.

Вы также можете узнать это во время компиляции, включив vxArch.h и проверив значение _STACK_DIR для _STACK_GROWS_DOWN или _STACK_GROWS_UP.

person mjs    schedule 28.02.2014