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

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

Добрый день!

 

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

 

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

 

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

 

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

 

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

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

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


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

Диапазон тактовой частоты от 32кГц до 16МГц.

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

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

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


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

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

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

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

 

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


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

какая разница, какая тактовая - только системный таймер перепрограммируйте и все.

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

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


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

Это в случае 1-16МГц можно было бы, а тут 32кГц снизу.

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

 

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


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

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

 

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

 

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

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

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

 

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

 

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

 

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

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


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

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

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

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

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

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

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

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

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

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