Как значение времени выполнения может быть константой?
Из 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
может означать две вещи:
Если
const
переменная инициализируется константой времени компиляции, она сама является константой времени компиляции.Если он инициализируется во время выполнения, то это константа времени выполнения, что означает, что после инициализации он не может изменить свое значение.
С помощью const
также является хорошим советом для читателей кода, но может также служить подсказкой для компилятора, который может выполнять некоторые оптимизации, которые в противном случае были бы невозможны.
В определении pulStack
:
- Первый
const
Говорит, чтоpulStack
не может изменить то, на что он указывает. (То есть)pulStack[0] = ...
это ошибка - Второй
const
говорит, что значение вpulStack
(то есть на что он указывает) не может быть изменено в рамках блока, в котором он был объявлен. (т.е.) [последующий]pulStack = ...
это ошибка