Как значение времени выполнения может быть константой?

Из FreeRTOS включите файл /StackMacros.h:

#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )

#define taskCHECK_FOR_STACK_OVERFLOW()                                                              \
{                                                                                                   \
    const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack;                         \
    const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5;                                          \
                                                                                                    \
    if( ( pulStack[ 0 ] != ulCheckValue ) ||                                                \
        ( pulStack[ 1 ] != ulCheckValue ) ||                                                \
        ( pulStack[ 2 ] != ulCheckValue ) ||                                                \
        ( pulStack[ 3 ] != ulCheckValue ) )                                             \
    {                                                                                               \
        vApplicationStackruHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName );   \
    }                                                                                               \
}

#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

Если я правильно понимаю, pxCurrentTCB - это структура ядра для запуска процесса, а начало точек процесса pxStack укладывается в стек. Каждый раз он отличается, но каким-то образом его можно хранить в постоянном значении?

2 ответа

Решение

Ключевое слово const может означать две вещи:

  1. Если const переменная инициализируется константой времени компиляции, она сама является константой времени компиляции.

  2. Если он инициализируется во время выполнения, то это константа времени выполнения, что означает, что после инициализации он не может изменить свое значение.

С помощью const также является хорошим советом для читателей кода, но может также служить подсказкой для компилятора, который может выполнять некоторые оптимизации, которые в противном случае были бы невозможны.

В определении pulStack:

  1. Первый const Говорит, что pulStack не может изменить то, на что он указывает. (То есть) pulStack[0] = ... это ошибка
  2. Второй const говорит, что значение в pulStack (то есть на что он указывает) не может быть изменено в рамках блока, в котором он был объявлен. (т.е.) [последующий] pulStack = ... это ошибка
Другие вопросы по тегам