Перейти к содержанию
    

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

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

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

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

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

Изменено пользователем maxntf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На всякий случай посмотрите, останавливается ли счет таймера (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 листов "ереси" того стоило? :)

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

Изменено пользователем maxntf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...но со временем понял, что это более, чем правильное поведение отладчика...

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...