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

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 ....

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...