Jump to content

    

FreeRTOS - минимальное время тика?

И наконец поставил четвертый брекпоинт в xPortPendSVHandler.

Нахожусь на строчке portEND_SWITCHING_ISR(xHigherPriorityTaskWoken).

2 раза нажимаю Step, попадаю в Task1.

А нажимаю Run, попадаю вначале в xPortPendSVHandler, снова Run и на Task2 на строку после xSemaphoreTake

Edited by maxntf

Share this post


Link to post
Share on other sites

На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели.

Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV.

 

Я тоже замечал, что отладка по шагам в Keil работает несколько "странно", что ли. Поэтому предпочитаю работать в лоб - бряки + Run.

Share this post


Link to post
Share on other sites
На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели.

Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV.

 

Я даже уже перед выполнением:

xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);

Отключаю прерывания TIM10

 

Вот весь проект, убрал все лишнее и переименовал задачи, номер задачи соответствует приоритету, а то я и сам уже начал путаться.

xSemaphoreHandle xSem1ms;
void Task1(void *pParams);
void Task2(void *pParams);

void TIM10_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;	
if(TIM_GetFlagStatus(TIM10, TIM_FLAG_Update) != RESET)
{
		NVIC->ICER[TIM10_IRQn >> 0x05] = (uint32_t)0x01 << (TIM10_IRQn & (uint8_t)0x1F);
		xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken);
		portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
}
int main(void)
{	
NVIC_InitTypeDef NVIC_InitStruct;

RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HSEConfig(RCC_HSE_OFF);
 while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET);

SystemCoreClockUpdate();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStruct.NVIC_IRQChannel = TIM10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 14;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init(&NVIC_InitStruct);

xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL);	
vTaskStartScheduler();

}
void Task1(void *pParams)
{
xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
while(1);
}
void Task2(void *pParams)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

vSemaphoreCreateBinary(xSem1ms);
xSemaphoreTake(xSem1ms, 0);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 16000 - 1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 0;
	TIM_TimeBaseInit(TIM10, &TIM_TimeBaseInitStruct);
	TIM_ClearFlag(TIM10, TIM_FLAG_Update);
	TIM_ITConfig(TIM10, TIM_IT_Update, ENABLE);
	TIM_Cmd(TIM10, ENABLE);

xSemaphoreTake(xSem1ms, 100);	
vTaskDelete(NULL);
}

 

И на всякий случай заново опишу ситуацию.

Со строчки portEND_SWITCHING_ISR(xHigherPriorityTaskWoken) если шагами, попадаем в Task1 - цикл while(1);

А если через Run, то попадаем в Task2 на строку vTaskDelete(NULL);

 

P.S.

И напоследок. Проверил свое убеждение, что командами Step отладчик не попадает в прерывание, а Run попадает. Проверил на том же TIM10. Включил его, сразу установил флаг прерывания - если пройти его шагами, программа дальше пойдет не попадая в прерывания. А если через Run, то в прерывания попадает.

 

Возможно 9 листов "ереси" того стоило? :)

Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому.

Edited by maxntf

Share this post


Link to post
Share on other sites
Возможно 9 листов "ереси" того стоило? :)

Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому.

Ну, тогда можно с уверенностью сказать, что тема себя исчерпала :)

 

Share this post


Link to post
Share on other sites

Пардон, читал уже между строк почти последние дни и не заметил, что ТС нажимает Single Step.

В режиме пошаговой отладки отладчик локально запрещает прерывания, поэтому даже если возникает любое прерывание (насчет системных исключений не уверен) - в обработчик прерывания Вы не попадете. И это правильно - иначе Вы не отладите нормально код. При Step Over и Run обработчики по-любому будут работать как надо (полагаю, у ТС так и есть). Я когда-то тоже напарывался на такие чудеса, но со временем понял, что это более, чем правильное поведение отладчика...

Share this post


Link to post
Share on other sites
...но со временем понял, что это более, чем правильное поведение отладчика...

Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себе:)). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри.

Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

Share this post


Link to post
Share on other sites
Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себе:)). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри.

Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

IAR это позволяет. Именно при пошаговой отладке (у него есть для этого специальная галочка).

Share this post


Link to post
Share on other sites
Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

Начинающему нет особый нужды ходит по шагам под отладчиком, гуляя по прерываниям: поставил куб и вперед и с песней :)

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now