maxntf 0 2 июня, 2018 Опубликовано 2 июня, 2018 (изменено) · Жалоба И наконец поставил четвертый брекпоинт в xPortPendSVHandler. Нахожусь на строчке portEND_SWITCHING_ISR(xHigherPriorityTaskWoken). 2 раза нажимаю Step, попадаю в Task1. А нажимаю Run, попадаю вначале в xPortPendSVHandler, снова Run и на Task2 на строку после xSemaphoreTake Изменено 2 июня, 2018 пользователем maxntf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 2 июня, 2018 Опубликовано 2 июня, 2018 · Жалоба На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели. Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV. Я тоже замечал, что отладка по шагам в Keil работает несколько "странно", что ли. Поэтому предпочитаю работать в лоб - бряки + Run. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 2 июня, 2018 Опубликовано 2 июня, 2018 (изменено) · Жалоба На всякий случай посмотрите, останавливается ли счет таймера (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 листов "ереси" того стоило? :) Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому. Изменено 2 июня, 2018 пользователем maxntf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 2 июня, 2018 Опубликовано 2 июня, 2018 · Жалоба Возможно 9 листов "ереси" того стоило? :) Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому. Ну, тогда можно с уверенностью сказать, что тема себя исчерпала :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 2 июня, 2018 Опубликовано 2 июня, 2018 · Жалоба Пардон, читал уже между строк почти последние дни и не заметил, что ТС нажимает Single Step. В режиме пошаговой отладки отладчик локально запрещает прерывания, поэтому даже если возникает любое прерывание (насчет системных исключений не уверен) - в обработчик прерывания Вы не попадете. И это правильно - иначе Вы не отладите нормально код. При Step Over и Run обработчики по-любому будут работать как надо (полагаю, у ТС так и есть). Я когда-то тоже напарывался на такие чудеса, но со временем понял, что это более, чем правильное поведение отладчика... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 2 июня, 2018 Опубликовано 2 июня, 2018 · Жалоба ...но со временем понял, что это более, чем правильное поведение отладчика... Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себе:)). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри. Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 2 июня, 2018 Опубликовано 2 июня, 2018 · Жалоба Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себе:)). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри. Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать. IAR это позволяет. Именно при пошаговой отладке (у него есть для этого специальная галочка). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 2 июня, 2018 Опубликовано 2 июня, 2018 · Жалоба Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать. Начинающему нет особый нужды ходит по шагам под отладчиком, гуляя по прерываниям: поставил куб и вперед и с песней :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться