|
|
|
FreeRTOS - минимальное время тика? |
|
|
|
Jun 1 2018, 10:53
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ Jun 1 2018, 13:39) Дык, тогда и не пишите тут то, что вызывает такую реакцию, кстати, вполне естественную реакцию Так вот... Упростил как мог, все выкинул никаких тачлибов и всего остального, только 2 задачи. Код xSemaphoreHandle xSem1ms; volatile uint32_t ctim100us; uint8_t FlagCreateTask; void TIM10_IRQHandler(void) { static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; if(TIM_GetFlagStatus(TIM10, TIM_FLAG_Update) != RESET) { TIM_ClearFlag(TIM10, TIM_FLAG_Update); if(ctim100us) ctim100us--; else { xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken); portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); } } } int main(void) { xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL); vTaskStartScheduler(); } void Task2(void *pParams) {
FlagCreateTask = 0; vSemaphoreCreateBinary(xSem1ms);
xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL); while(1) { if(FlagCreateTask != 0) continue; xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL); } } void Task1(void *pParams) { uint16_t count = 3;
xSemaphoreTake(xSem1ms, 0); FlagCreateTask = 1;
ctim100us = count; Tx_Init();
while(1) { if(xSemaphoreTake(xSem1ms, 10) != pdTRUE) continue; count++; if(count > 9) break; taskENTER_CRITICAL(); ctim100us = count; taskEXIT_CRITICAL(); GPIO_ToggleBits(GPIOB, GPIO_Pin_5);//пин контроля работы программы } TIM_DeInit(TIM10); FlagCreateTask = 0; vTaskDelete(NULL); } После выхода из обработчика прерывания TIM10 в случае выполнения portEND_SWITCHING_ISR(xHigherPriorityTaskWoken) программа попадает в Task2. О Боже, за что?Даже таймер настроен на 100мкс
Сообщение отредактировал maxntf - Jun 1 2018, 10:55
|
|
|
|
|
Jun 1 2018, 11:08
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ Jun 1 2018, 13:53) Так вот... Судя по всему, у обеих задач одинаковые приоритеты. А Task2 вообще ВСЕГДА готова к выполнения. Т.е. всегда что-то делает... Более того, честно говоря, я чуть моск не сломал, пока попытался понять логику работы "флажка" FlagCreateTask Так нифига и не понял, что вы задумали ((( А вообще, прочитайте, наконец, нормальный мануал, как писать проекты под RTOS, посмотрите видео на ютубе, примеры из мануала и т. п. Посмотрите примеры применения, конкретные рабочие примеры. Желательно это делать перед тем, как плодить франкешнейнов самодеятельность, и уж тем более тут это публиковать FreeRTOS запускается с полпинка и работает как и любая друга RTOS, но необходимы хотя бы базовые знания. Решите сначала этот вопрос! Уверяю, ничего сверхсложного тут нет, все через это прошли )) Немного упрощу задачу. Вот яркий пример откровенной самодеятельности: Код while(1) { if(FlagCreateTask != 0) continue; xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL); }
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 1 2018, 11:34
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ Jun 1 2018, 14:08) Судя по всему, у обеих задач одинаковые приоритеты. Судя по чему конкретно? Код xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL); xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL); Цитата(Forger @ Jun 1 2018, 14:08) А вообще, прочитайте, наконец, нормальный мануал, как писать проекты под RTOS... Какие проекты, я про конкретный случай спрашиваю. Убрал то, что моск ломает. Код void Task2(void *pParams) { vSemaphoreCreateBinary(xSem1ms); xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL); while(1); } void Task1(void *pParams) { xSemaphoreTake(xSem1ms, 0); ctim100us = 10; Tx_Init(); xSemaphoreTake(xSem1ms, 10); TIM_DeInit(TIM10); vTaskDelete(NULL); } Если задачи с одинаковым приоритетом, почему? Может где то настройки FreeRTOS? Если Task2 всегда готова к выполнению, то когда срабатывает portEND_SWITCHING_ISR(xHigherPriorityTaskWoken) разве после выхода из прерывания контекст не должен переключится с Task2 на Task1?
Сообщение отредактировал maxntf - Jun 1 2018, 11:35
|
|
|
|
|
Jun 1 2018, 11:46
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ Jun 1 2018, 14:34) Код xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL); xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL); Исходя из мануала Task1 имеет приоритет выше, чем Task2. Признаю, тут я не доглядел (( .... Ненавижу функции с числом параметров больше одного-двух - невозможно разобраться без мануала Цитата Убрал то, что моск ломает. Уже проще Цитата Может где то настройки FreeRTOS? Еще раз на всякий случай приведите настройки (в теге CODEBOX).
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 1 2018, 11:53
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ Jun 1 2018, 14:46) Еще раз на всякий случай приведите настройки (в теге CODEBOX). Для проверки работы приоритетов поменял приоритеты задач - программа в Task1 вообще не попадает, значит приоритеты работают. CODE #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configUSE_PREEMPTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 #define configUSE_IDLE_HOOK 1 #define configUSE_TICK_HOOK 1 #define configMAX_PRIORITIES ( 5 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12 * 1024 ) ) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 1 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1 #define configUSE_MUTEXES 1 #define configQUEUE_REGISTRY_SIZE 5 #define configCHECK_FOR_STACK_OVERFLOW 2 #define configUSE_RECURSIVE_MUTEXES 1 #define configUSE_MALLOC_FAILED_HOOK 1 #define configUSE_APPLICATION_TASK_TAG 0 #define configUSE_COUNTING_SEMAPHORES 1 /* Software timer related definitions. */ #define configUSE_TIMERS 1 #define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) #define configTIMER_QUEUE_LENGTH 10 #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) /* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ #define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 0 #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 /* Standard assert semantics. */ //#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } /* Use the system definition, if there is one */ #ifdef __NVIC_PRIO_BITS #define configPRIO_BITS __NVIC_PRIO_BITS #else #define configPRIO_BITS 4 /* 15 priority levels */ #endif #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 /* The lowest priority. */ #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) /* Priority 5, or 95 as only the top four bits are implemented. */ /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) /* Run time stats related macros. */ #define configGENERATE_RUN_TIME_STATS 0 /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS standard names. */ #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler #endif /* FREERTOS_CONFIG_H */
Сообщение отредактировал maxntf - Jun 1 2018, 12:00
|
|
|
|
|
Jun 2 2018, 12:04
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ Jun 1 2018, 20:06) Что же за отладчик такой, если не секрет? Тот что в Keil. Причем только в пошаговом режиме кнопками Step или Step Over при выходе из обработчика прерываний. А если поставить брекпоинты в задачах, и выйти из прерывания Step Out или Run тогда попадаем куда нужно, то есть в Task2.
|
|
|
|
|
Jun 2 2018, 12:17
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ Jun 2 2018, 15:04) Тот что в Keil. Причем только в пошаговом режиме кнопками Step или Step Over при выходе из обработчика прерываний. А если поставить брекпоинты в задачах, и выйти из прерывания Step Out или Run тогда попадаем куда нужно, то есть в Task2. Оптимизацию отключите, хотя бы для debug сборки. При пошаговой отладке она только вредит. Или как вариант - ходить не по C/C++ исходникам, а в по командам в окне disasm. И вообще, изучайте инструмент, а то вон 8 страниц наплодили по сути на пустом месте
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 2 2018, 12:45
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ Jun 2 2018, 15:17) Оптимизацию отключите, хотя бы для debug сборки. При пошаговой отладке она только вредит. Или как вариант - ходить не по C/C++ исходникам, а в по командам в окне disasm. Оптимизация стоит Level 0, и сделал я это сразу после установки кейла. Никогда оптимизацию не использую. Да хоть по Cи, хоть по disasm. Был бы disbasic думаю так же работал. Эта реплика к чему? Цитата(Forger @ Jun 2 2018, 15:17) И вообще, изучайте инструмент, а то вон 8 страниц наплодили по сути на пустом месте Где про это сказано?
|
|
|
|
|
Jun 2 2018, 12:50
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ Jun 2 2018, 15:45) Оптимизация стоит Level 0, и сделал я это сразу после установки кейла. Никогда оптимизацию не использую. Вангую, что переключение задачи на активную происходит лишь при отработке прерывания системного таймера. Если это так, то это в корне неправильно, нужно разбираться, почему так в Вас работает. Я с таким "багом" столкнулся в старой TNKernel, что, кстати, заставило ее поменять на другую ртос - как раз на freeRTOS В ней такого "бага" нет. Это я сразу проверил, как только освоил. В ней все работает как надо. Но с настройками повозился, к слову, отключил нафик динамическую память (у freeRTOS есть свой типа диспетчер дин. памяти) Если весь код состоит из макросов (define), то старый компилятор кейла (v5) не умеет ходить по макросам. Новый v6 умеет. Возможно, тут есть проблемы. К проекту подключены исходники freeRTOS или заранее собранная библиотека (lib)?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 2 2018, 13:07
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ Jun 2 2018, 15:50) Вангую, что переключение задачи на активную происходит лишь при отработке прерывания системного таймера. Нет. Поставил 3 брекпоинта. Task1, Task2 и в xPortSysTickHandler. Сразу попадаем в Task1. P.S. Возможно я ошибаюсь, но что то мне подсказывает, что по функции Step и Step Over отладчик не может попасть в прерывание, а собственно это и должно произойти после выход из обработчика прерывания TIM10, программа должна попасть в PendSV Handler.
Сообщение отредактировал maxntf - Jun 2 2018, 13:35
|
|
|
|
|
Jun 2 2018, 13:17
|
Частый гость
Группа: Участник
Сообщений: 94
Регистрация: 31-03-18
Пользователь №: 102 799
|
Цитата(maxntf @ Jun 2 2018, 16:07) Нет. Поставил 3 брекпоинта. Task1, Task2 и в xPortSysTickHandler. Сразу попадаем в Task2.
P.S. Возможно я ошибаюсь, но что то мне подсказывает, что по функции Step и Step Over отладчик не может попасть в прерывание, а собственно это и должно произойти после выход из обработчика прерывания TIM10. Ну значит задача просто закончила свою работу и сама вызвала диспетчер. Никакой мистики. Так все операционки устроены
|
|
|
|
|
Jun 2 2018, 13:21
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ Jun 2 2018, 16:07) Нет. Поставил 3 брекпоинта. Task1, Task2 и в xPortSysTickHandler. Сразу попадаем в Task2. Пройдите под отладчиком по окну дизасма, анализирую содержимое стека. В частности при выходе из прерывания. Поставьте бряк внутри вашего прерывания, уже оттуда смотрите по шагам, лучше в окне дизасм. И приведите код этого "проекта" (в теге CODEBOX) Цитата(Моисей Самуилович @ Jun 2 2018, 16:17) Ну значит задача просто закончила свою работу и сама вызвала диспетчер. Никакой мистики. Так все операционки устроены © " Слышу звон, да не знаю, где он"
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|