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

FreeRTOS не переключает задачи после одного цикла, FRDM-KL27Z

Плата FRDM-KL27Z.

FreeRTOS после запуска включает каждую задачу по разу, после чего циклически запускает только одну задачу - добавленную первой.
PREEMPTION включён, TIME SLICING включён. В чём может быть проблема?

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

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


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, Svalkash said:

В чём может быть проблема?

 

"Вангую" проблемы с системным таймером RTOS - не настроен сам таймер и/или прерывания от него,

возможны так же проблемы с используемым "портом" - например, выбран неправильный.

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


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Forger сказал:

"Вангую" проблемы с системным таймером RTOS - не настроен сам таймер и/или прерывания от него,

возможны так же проблемы с используемым "портом" - например, выбран неправильный.

Это где настраивается?

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


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

Возможно тупо: эта задача запрещает прерывания и больше их не разрешает.

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


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, jcxz сказал:

Возможно тупо: эта задача запрещает прерывания и больше их не разрешает.

Да не, задачи простейшие.

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


Ссылка на сообщение
Поделиться на другие сайты
20 часов назад, Forger сказал:

Говорю же - конфиги типа PREEMPTION, systickinterrupt, time slicing и др. включены.

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


Ссылка на сообщение
Поделиться на другие сайты
39 minutes ago, Svalkash said:

Говорю же - конфиги типа PREEMPTION, systickinterrupt, time slicing и др. включены.

Хорошо, "разжую" более детально: выше я дал ссылку, где можно найти ГОТОВЫЙ демо-проект под вашу плату.

Суть простая - берете тот проект и сравниваете с вашим. Или берете тот проект и суете туда свой код ПОЭТАПНО.

А поскольку ваш код есть только у вас и больше никто его тут не видел, то физически невозможно однозначно ответить на ваш вопрос "Это где настраивается?".

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


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, Forger said:

А поскольку ваш код есть только у вас и больше никто его тут не видел, то физически невозможно однозначно ответить на ваш вопрос "Это где настраивается?".

Почему нельзя ответить ? Можно - в голове.

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


Ссылка на сообщение
Поделиться на другие сайты
13 minutes ago, x893 said:

Почему нельзя ответить ? Можно - в голове.

Увы, мой телепатический шлем на днях сломался - после подачи питания все задачи по разу запускает и виснет на последней,

перепробовал все настройки, разумеется "PREEMPTION, systickinterrupt, time slicing и др. включены.",

пробовал даже самый козырный вариант - вслепую тыкая разные настройки. Тщетно!

Крайняя меря  (что категорически запретил делать производитель шлема) - гугль, но и тут чуда не произло - ну, нету связи и все тут ((

Видать, придется нести в ремонт ...

 

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


Ссылка на сообщение
Поделиться на другие сайты
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

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


Ссылка на сообщение
Поделиться на другие сайты
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);
    }
}

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, Forger сказал:

При чем тут некий ProcessorExpert???

Дык это - придёт этот самый "профессор Эксперт" и всё поправит. И строчки кода переставит как нужно.  :-D

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


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, Forger сказал:

Попробуйте перечитать второй пост в этой теме еще раз. Там на мой взгляд я указал наиболее вероятную причину.

Имхо - скорее я в посте N5 наванговал наиболее вероятную.  :)))

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

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


Ссылка на сообщение
Поделиться на другие сайты
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 ....

Однако, стараюсь использовать ее очень редко и только там, где без нее ну вообще никак ))

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти