реклама на сайте
подробности

 
 
9 страниц V  « < 7 8 9  
Reply to this topicStart new topic
> FreeRTOS - минимальное время тика?
maxntf
сообщение Jun 2 2018, 13:24
Сообщение #121


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



И наконец поставил четвертый брекпоинт в xPortPendSVHandler.
Нахожусь на строчке portEND_SWITCHING_ISR(xHigherPriorityTaskWoken).
2 раза нажимаю Step, попадаю в Task1.
А нажимаю Run, попадаю вначале в xPortPendSVHandler, снова Run и на Task2 на строку после xSemaphoreTake

Сообщение отредактировал maxntf - Jun 2 2018, 13:24
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 2 2018, 13:30
Сообщение #122


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели.
Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV.

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
maxntf
сообщение Jun 2 2018, 13:58
Сообщение #123


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Цитата(Forger @ Jun 2 2018, 16:30) *
На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели.
Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV.


Я даже уже перед выполнением:
Код
xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);

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

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

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 листов "ереси" того стоило? sm.gif
Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому.

Сообщение отредактировал maxntf - Jun 2 2018, 14:15
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 2 2018, 14:15
Сообщение #124


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(maxntf @ Jun 2 2018, 16:58) *
Возможно 9 листов "ереси" того стоило? sm.gif
Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому.

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jun 2 2018, 18:00
Сообщение #125


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Пардон, читал уже между строк почти последние дни и не заметил, что ТС нажимает Single Step.
В режиме пошаговой отладки отладчик локально запрещает прерывания, поэтому даже если возникает любое прерывание (насчет системных исключений не уверен) - в обработчик прерывания Вы не попадете. И это правильно - иначе Вы не отладите нормально код. При Step Over и Run обработчики по-любому будут работать как надо (полагаю, у ТС так и есть). Я когда-то тоже напарывался на такие чудеса, но со временем понял, что это более, чем правильное поведение отладчика...
Go to the top of the page
 
+Quote Post
maxntf
сообщение Jun 2 2018, 19:44
Сообщение #126


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Цитата(Arlleex @ Jun 2 2018, 21:00) *
...но со временем понял, что это более, чем правильное поведение отладчика...

Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себеsm.gif). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри.
Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jun 2 2018, 19:50
Сообщение #127


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(maxntf @ Jun 2 2018, 22:44) *
Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себеsm.gif). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри.
Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

IAR это позволяет. Именно при пошаговой отладке (у него есть для этого специальная галочка).
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 2 2018, 19:50
Сообщение #128


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(maxntf @ Jun 2 2018, 22:44) *
Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

9 страниц V  « < 7 8 9
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 13:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.02501 секунд с 7
ELECTRONIX ©2004-2016