Jump to content

    

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

Плата FRDM-KL27Z.

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

Edited by Svalkash

Share this post


Link to post
Share on other sites
1 hour ago, Svalkash said:

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

 

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

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

Share this post


Link to post
Share on other sites
1 час назад, Forger сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
10 часов назад, jcxz сказал:

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

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

Share this post


Link to post
Share on other sites
20 часов назад, Forger сказал:

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

Share this post


Link to post
Share on other sites
39 minutes ago, Svalkash said:

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

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, Forger said:

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

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

Share this post


Link to post
Share on other sites
13 minutes ago, x893 said:

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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);
    }
}

 

 

Share this post


Link to post
Share on other sites
10 часов назад, Forger сказал:

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

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

Share this post


Link to post
Share on other sites
10 часов назад, Forger сказал:

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

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

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

Share this post


Link to post
Share on other sites
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 ....

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now