Svalkash 0 7 октября, 2018 Опубликовано 7 октября, 2018 (изменено) · Жалоба Плата FRDM-KL27Z. FreeRTOS после запуска включает каждую задачу по разу, после чего циклически запускает только одну задачу - добавленную первой. PREEMPTION включён, TIME SLICING включён. В чём может быть проблема? Изменено 7 октября, 2018 пользователем Svalkash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 7 октября, 2018 Опубликовано 7 октября, 2018 · Жалоба 1 hour ago, Svalkash said: В чём может быть проблема? "Вангую" проблемы с системным таймером RTOS - не настроен сам таймер и/или прерывания от него, возможны так же проблемы с используемым "портом" - например, выбран неправильный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Svalkash 0 7 октября, 2018 Опубликовано 7 октября, 2018 · Жалоба 1 час назад, Forger сказал: "Вангую" проблемы с системным таймером RTOS - не настроен сам таймер и/или прерывания от него, возможны так же проблемы с используемым "портом" - например, выбран неправильный. Это где настраивается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 7 октября, 2018 Опубликовано 7 октября, 2018 · Жалоба 20 minutes ago, Svalkash said: Это где настраивается? Тынц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба Возможно тупо: эта задача запрещает прерывания и больше их не разрешает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Svalkash 0 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба 10 часов назад, jcxz сказал: Возможно тупо: эта задача запрещает прерывания и больше их не разрешает. Да не, задачи простейшие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Svalkash 0 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба 20 часов назад, Forger сказал: Тынц Говорю же - конфиги типа PREEMPTION, systickinterrupt, time slicing и др. включены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба 39 minutes ago, Svalkash said: Говорю же - конфиги типа PREEMPTION, systickinterrupt, time slicing и др. включены. Хорошо, "разжую" более детально: выше я дал ссылку, где можно найти ГОТОВЫЙ демо-проект под вашу плату. Суть простая - берете тот проект и сравниваете с вашим. Или берете тот проект и суете туда свой код ПОЭТАПНО. А поскольку ваш код есть только у вас и больше никто его тут не видел, то физически невозможно однозначно ответить на ваш вопрос "Это где настраивается?". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 32 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба 1 hour ago, Forger said: А поскольку ваш код есть только у вас и больше никто его тут не видел, то физически невозможно однозначно ответить на ваш вопрос "Это где настраивается?". Почему нельзя ответить ? Можно - в голове. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба 13 minutes ago, x893 said: Почему нельзя ответить ? Можно - в голове. Увы, мой телепатический шлем на днях сломался - после подачи питания все задачи по разу запускает и виснет на последней, перепробовал все настройки, разумеется "PREEMPTION, systickinterrupt, time slicing и др. включены.", пробовал даже самый козырный вариант - вслепую тыкая разные настройки. Тщетно! Крайняя меря (что категорически запретил делать производитель шлема) - гугль, но и тут чуда не произло - ну, нету связи и все тут (( Видать, придется нести в ремонт ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Svalkash 0 9 октября, 2018 Опубликовано 9 октября, 2018 · Жалоба 23 часа назад, Forger сказал: Хорошо, "разжую" более детально: выше я дал ссылку, где можно найти ГОТОВЫЙ демо-проект под вашу плату. Суть простая - берете тот проект и сравниваете с вашим. Или берете тот проект и суете туда свой код ПОЭТАПНО. А поскольку ваш код есть только у вас и больше никто его тут не видел, то физически невозможно однозначно ответить на ваш вопрос "Это где настраивается?". Проект рассчитан не на голую FreeRTOS, а на наличие ProcessorExpert. Не уверен, что при его отсутствии всё будет вести себя нормально. Я уже не говорю о том, что там совершенно другая версия RTOS. Попытался вытащить конфиг и вставить в свой проект. Не помогло. Вот файлы, связанные с моим проектом. FreeRTOSConfig.h MKL27Z64xxx4_RTOS_test.c board.c board.h clock_config.c clock_config.h peripherals.c peripherals.h pin_mux.c pin_mux.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 9 октября, 2018 Опубликовано 9 октября, 2018 · Жалоба 50 minutes ago, Svalkash said: Проект рассчитан не на голую FreeRTOS, а на наличие ProcessorExpert. Не уверен, что при его отсутствии всё будет вести себя нормально. Я уже не говорю о том, что там совершенно другая версия RTOS. При чем тут некий ProcessorExpert??? Quote Попытался вытащить конфиг и вставить в свой проект. Не помогло. Вы почему-то вбили себе в голову, что проблема кроется лишь в настройках freertos. Попробуйте перечитать второй пост в этой теме еще раз. Там на мой взгляд я указал наиболее вероятную причину. Пройдите по шагам в отладчике. Убедитесь, что происходит вызов прерывания SysTick и соотв. вход в SysTick_Handler, реализованный freertos, а не какую-то постороннюю функцию. Для упрощения оставьте только одну задачу с задержкой, уберите для начала нафик PRINTF, ибо его тупое применение где можно и где нельзя может наплодить кучу проблем на ровном месте. Добейтесь, чтобы такой код работал не "зависая", а уже ПОТОМ суйте туда свой код, ЧАСТЯМИ, поэтапно: static void sec_task(void *pvParameters) { for (;;) { vTaskDelay(1); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 10 октября, 2018 Опубликовано 10 октября, 2018 · Жалоба 10 часов назад, Forger сказал: При чем тут некий ProcessorExpert??? Дык это - придёт этот самый "профессор Эксперт" и всё поправит. И строчки кода переставит как нужно. :-D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 10 октября, 2018 Опубликовано 10 октября, 2018 · Жалоба 10 часов назад, Forger сказал: Попробуйте перечитать второй пост в этой теме еще раз. Там на мой взгляд я указал наиболее вероятную причину. Имхо - скорее я в посте N5 наванговал наиболее вероятную. :))) На днях я, когда отлаживал (свой код), забыл в одном месте в конце критической секции поставить выход из неё (разрешение прерываний). И получил аналогичное поведение программы - выполнялась только одна задача. Хотя это была uCOS, но это, думаю, не принципиально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 10 октября, 2018 Опубликовано 10 октября, 2018 · Жалоба 21 minutes ago, jcxz said: Имхо - скорее я в посте N5 наванговал наиболее вероятную. :))) ТС выложил часть исходников, в частности в его файле MKL27Z64xxx4_RTOS_test.c все нужное есть. Код действительной примитивный, за исключением скрытых граблей в ввиде PRINTF, который тут врядли полностью reentrant. Да и стек жрет он весьма непредсказуемо. И не исключено, что тут он даже обращается к куче ... Quote На днях я, когда отлаживал (свой код), забыл в одном месте в конце критической секции поставить выход из неё (разрешение прерываний). И получил аналогичное поведение программы - выполнялась только одна задача. Хотя это была uCOS, но это, думаю, не принципиально. А я уже давно использую такие критические секции (саму идею "стырил" из scmRTOS): class CriticalSection { public: inline CriticalSection() __attribute__((always_inline)) { __asm volatile ("CPSID i"); } inline ~CriticalSection() __attribute__((always_inline)) { __asm volatile ("CPSIE i"); } }; Это - простейшая реализация, без запоминания предыдущего состояния флажков разрешения прерываний. Но если используется RTOS, то она как раз самое то. Работает просто: достаточно лишь создать объект CriticalSection внутри например функции и при выходе из нее автоматом будут разрешены прерывания (вызывается деструктор). Также его можно объявлять внутри любой группы фигурных скобок { }, даже внутри циклов, если конечно пишем на плюсах. Весьма удобно: for (...) { CriticalSection cs; ... } или так: if (condition) { CriticalSection cs; ... } else .... Однако, стараюсь использовать ее очень редко и только там, где без нее ну вообще никак )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться