Jump to content

    

FreeRTOS - динамическое изменение тактовой частоты

Добрый день!

 

Вопрос по freertos - как правильно реализовать динамическое изменение тактовой частоты и частоту смены задачи в STM32.

 

Интересует следующий момент - есть две задачи первая меняет по заданным событиям тактовую частоту, вторая мигает светодиодом. Период мигания задается функциями vTaskDelayUntil.

 

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

 

Первая мысль которая приходит в голову - определить макросы configCPU_CLOCK_HZ и configTICK_RATE_HZ как переменные, при изменении тактового сигнала менять переменные и вызывать повторно prvSetupTimerInterrupt(), сбрасывать текущее значение счетчика системного таймера.

 

Устройство с батарейным питанием, большую часть времени спит. Диапазон тактовой частоты от 32кГц до 16МГц.

Не хотелось бы модифицировать исходники, может быть есть стандартное решение?

Share this post


Link to post
Share on other sites
Диапазон тактовой частоты от 32кГц до 16МГц.

Не хотелось бы модифицировать исходники, может быть есть стандартное решение?

При соотношении рабочих частот 1:500 без модификации, боюсь, никак не обойтись.

Share this post


Link to post
Share on other sites
Устройство с батарейным питанием, большую часть времени спит. Диапазон тактовой частоты от 32кГц до 16МГц.

Не хотелось бы модифицировать исходники, может быть есть стандартное решение?

Ну и работайте всегда на 16Mhz а потом спите. Перед входом в спячку можете, конечно и тактовую сбросить. Но Работать всегда на полной. А во вторых, какая разница, какая тактовая - только системный таймер перепрограммируйте и все.

 

Share this post


Link to post
Share on other sites
какая разница, какая тактовая - только системный таймер перепрограммируйте и все.

Это в случае 1-16МГц можно было бы, а тут 32кГц снизу. Впрочем, случись мне экономить электричество, я бы в режиме 32кГц просто выключал бы ОС за ненадобностью.

Share this post


Link to post
Share on other sites
Это в случае 1-16МГц можно было бы, а тут 32кГц снизу.

Разница, если, конечно, за системный тик контекст успеет переключиться ну и поработать еще немного :). Другое дело, что запускать систему на таких частотах крайне странно. Чем не утраивает сон на приличных мегагерцах - неведомо :(.

 

Share this post


Link to post
Share on other sites

Вариант с стабильной максимальной частотой и сном при простое - подходит для большинства задач.

 

Другое дело в следующей ситуации

 

устройство ждет нажатия кнопки и спит,

кнопку нажали - взвели флаг и снова спать,

кнопку отпустили - работаем

 

Зачем запускать осциллятор на 16 МГц чтобы взвести флаг? Ведь можно от внешнего часового кварца (уже есть и постоянно включен) работать и не тратить лишнего времени...

 

Операционная система тут не участвует - задача сама легла спать, сама проснулась - как Freertos'у сообщить что прошло уже 10 секунд, а не 10 милисекунд как она считает (тактовая частота была выключена), и что пора все задачи разбудить давно...

 

Уважаемые ГУРУ - есть вопрос - большая просьба - дайте на него ответ, не нужно спрашивать почему вопрос возник...

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
Sign in to follow this