Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS STM32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
MiklPolikov
Всем доброго времени суток.

Никогда раньше не использовал RTOS , и вот думаю начать. Положил глаз на freeRTOS. Работаю с STM32 . Возникли такие вопросы :

1)Как RTOS влияет на производительность и энергопотребления (что одно и то же) .Как я понимаю, для работы RTOS должно постоянно происходить прерывание systic.
Стало быть, появляется как минимум это прерывание с постоянным выполнением какого-то кода какой-то длинны. Для устройств с батарейным питанием где в активном режиме каждые 100мка на
счету это приемлимо ?

2)Как RTOS сочетается со спящими режимами ? Когда процессор максимально заглушен, потребляет 1-2 мка и ждёт прерывания от ноги wakup .

3)Со всеми устройствами процессора RTOS обязывает работать только через свои функции, напрямую к регистрам уже нельзя обращаться ?
Если так, то как быть со всякими тонкостями, которые решаются только на уровне железа ? К примеру, захотелось синхронизировать два таймера с точностью до 1 такта системной частоты.
Если работаешь с регистрами, то можно придумать как это сделать. А после перехода на RTOS подобные "фокусы" будут возможны ?


Заранее благодарю за ответы !
aaarrr
1. В плане экономии электричества в активном режиме работать под RTOS даже удобнее: появляется единая "точка бездействия" (Idle task в случае FreeRTOS), где можно спокойно отправить процессор в WFI. Частоту systick, как и частоту самого процессора, можно динамически менять при необходимости.

2. Замечательно сочетается: неработающему процессору все равно, что на нем не работает - RTOS или что-то еще.

3. Нет у FreeRTOS (как и у большей части мелких ОС) таких функций. Так что "фокусы" никуда не денутся.
x893
К тому же есть режим tickless для совсем малопотребляющих MCU.
MiklPolikov
Цитата(aaarrr @ Jul 20 2013, 02:28) *
3. Нет у FreeRTOS (как и у большей части мелких ОС) таких функций. Так что "фокусы" никуда не денутся.


3) Я просто вижу во всех примерах , что работа происходит не через регистры а через функции системы.
Код
    void vFreeRTOSInitAll()
    {
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_StructInit(&port);
        port.GPIO_Mode = GPIO_Mode_Out_PP;
        port.GPIO_Pin = GPIO_Pin_0;
        port.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &port);
    }



4) И вопрос, вытекающий из 3): если операционка переключается между задачами без ведома задачь,
то как быть с настройками тех же портов ? Или это уже моя забота, что бы задачи вывода и приёма по одному и тому же GPIO не запускались одновременно ?
_Pasha
3.Приведенный Вами код работы с периферией использует функции стандартной библиотеки от st и к собственно FreeRTOS не относится.
4.
Код
taskENTER_CRITICAL();
{
    // работаем с периферией внутри критической секции
}
taskEXIT_CRITICAL();
MiklPolikov
Прокомментируйте пожалуйста мои первые шаги freeRTOS STM32L151 Keil

Что я делаю:
Добавил в папку проекта файлы
FreeRTOS\Source\list.c
FreeRTOS\Source\queue.c
FreeRTOS\Source\tasks.c
FreeRTOS\Source\timers.c
FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c
FreeRTOS\Source\portable\MemMang\heap_2.c

FreeRTOS\Source\include\FreeRTOS.h
FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h
FreeRTOS\Source\include\list.h
FreeRTOS\Source\include\mpu_wrappers.h
FreeRTOS\Source\include\portable.h
FreeRTOS\Source\portable\RVDS\ARM_CM3\portmacro.h
FreeRTOS\Source\include\projdefs.h
FreeRTOS\Source\include\queue.h
FreeRTOS\Source\include\StackMacros.h
FreeRTOS\Source\include\task.h
FreeRTOS\Source\include\timers.h

Файлы *.с добавляю в дерево проекта.
В mail.c пишу
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

Компилируется.

Что меня смущает:
Есть непонятые файлы heap_1.c heap_2.c heap_3.c heap_4.c. Чем рони различаются, и какой нужен мне ?
Файл FreeRTOSConfig.h беру из папки CORTEX_STM32F103_Keil , просто из-за неимения папки с STM32L151
PDA
Цитата(MiklPolikov @ Jul 21 2013, 09:53) *
Есть непонятые файлы heap_1.c heap_2.c heap_3.c heap_4.c. Чем рони различаются, и какой нужен мне ?

Все зависит от вашей программы и как вы хотите распределять память.

Сергей Борщ
QUOTE (MiklPolikov @ Jul 21 2013, 07:53) *
Есть непонятые файлы heap_1.c heap_2.c heap_3.c heap_4.c. Чем они различаются, и какой нужен мне ?
А в документацию заглянуть? wink.gif
Ruslan1
Цитата(MiklPolikov @ Jul 21 2013, 08:53) *
Прокомментируйте пожалуйста мои первые шаги freeRTOS STM32L151 Keil

Для начала-почитайте документацию. У меня складывается ощущение, что Вы всю информацию пытаетесь получить через форум. Как результат- получается чтение Вам документации вслух окружающими, что не совсем гуд.

Как минимум- прочитайте то что вложено в дистрибутив.
Как оптимум- есть отличные статьи по данному вопросу, обсуждалось например в http://electronix.ru/forum/lofiversion/index.php/t87183.html

Мне очень помог этот цикл статей: http://www.kit-e.ru/articles/micro/2011_5_97.php
MiklPolikov
Цитата(Ruslan1 @ Jul 21 2013, 12:35) *
Для начала-почитайте документацию. У меня складывается ощущение, что Вы всю информацию пытаетесь получить через форум. Как результат- получается чтение Вам документации вслух окружающими, что не совсем гуд.


Вы меня раскусили.
AlexandrY
Цитата(MiklPolikov @ Jul 20 2013, 00:39) *
1)Как RTOS влияет на производительность и энергопотребления (что одно и то же) .Как я понимаю, для работы RTOS должно постоянно происходить прерывание systic.
Стало быть, появляется как минимум это прерывание с постоянным выполнением какого-то кода какой-то длинны. Для устройств с батарейным питанием где в активном режиме каждые 100мка на
счету это приемлимо ?

2)Как RTOS сочетается со спящими режимами ? Когда процессор максимально заглушен, потребляет 1-2 мка и ждёт прерывания от ноги wakup .

3)Со всеми устройствами процессора RTOS обязывает работать только через свои функции, напрямую к регистрам уже нельзя обращаться ?


Эти все вопросы должны были быть отражены в документации на RTOS. Если во FreeRTOS об этом ничего нет, значит выбрали не ту RTOS или решили неправильно ее применить.
Либо потратите огромное время на переделку RTOS. Что потребует детального изучения исходников всей оси и промежуточного софта к ней. А это работа на добрый год.
Качественные оси для оптимизации подребления предлагают специальное API: http://www.mentor.com/embedded-software/nu...ower-management

А так, конечно, неподходящая RTOS утяжелит ситуацию с низким потреблением.




kan35
Цитата(MiklPolikov @ Jul 20 2013, 08:26) *
3) Я просто вижу во всех примерах , что работа происходит не через регистры а через функции системы.
Код
    void vFreeRTOSInitAll()
    {
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_StructInit(&port);
        port.GPIO_Mode = GPIO_Mode_Out_PP;
        port.GPIO_Pin = GPIO_Pin_0;
        port.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &port);
    }



4) И вопрос, вытекающий из 3): если операционка переключается между задачами без ведома задачь,
то как быть с настройками тех же портов ? Или это уже моя забота, что бы задачи вывода и приёма по одному и тому же GPIO не запускались одновременно ?

Кстати, работа с битами портов в STM32 через библиотеку происходит атомарно, блокировать переключение контекста не требуется. Для инициализации - да, требуется блокировать.
Что касается выбора RTOS, то FreeRTOS самая популярная система, есть TCP, много народу использует, будет у кого спросить совет если что. Не требуется вникать в тонкости работы, достаточно инструкции на сайте.
Начинать проще всего так: скачать с сайта дистрибутив и взять за основу проект на вашем контроллере (или самом близком) и писать свою задачу.
MiklPolikov
Вопрос :
Как быть , если я изменяю тактовую частоту процессора во время работы программы ? В активном режиме она 4 либо 16 МГц, а перед уходом в глубокий сон
64 КГц. При этом ведь будет меняться квант времени, и все таймеры операционки.
Разная частота во время разных процессов и разных спящих режимов нужна для сокращения энергопотребления.
kolobok0
Цитата(MiklPolikov @ Aug 13 2013, 10:38) *
..При этом ведь будет меняться квант времени, и все таймеры операционки....


у фриртоса вроде как всё завязано на SysTick. Его и надо по уму подправлять. В зависмом от камня в коде StdLibrary, есть инициализация системных частот (файлик system_stm32<бла-бла-бла>.c) и переинициализация вроде как там была (SystemCoreClockUpdate). Правильные параметры лучше глянуть запустив понтовый эксел скрипт от ST (STM32<бла-бла-бла>_Clock_Configuration_V<бла-бла-бла>.xls).

Т.е. складывается следующая картина:
подготовились к смене частоты, поменяли частоту, вызвали переинициализацию системных частот из Std, и если потребовалось - заново переинициализировали SysTick. Кстати код инициализации во фриртосе вроде как port.c файлик, у него внутри - ближе к концу надо смотреть вроде как sm.gif
MiklPolikov
Начал работать с FreeRTOS , пока всё нравится. Боялся что процессор будет занят переключениями между задачь больше чем самими задачами и за удобства при программировании придётся заплатить увеличением тактовой частоты и потребления. А сейчас, глядишь, с операционкой ещё и время выполнения программы уменьшится !

Провёл такой эксперимент :

Процессор STM32 частота 16Мгц компилятор Keil 4.6
Без операционки цикл while ( 1 ) { LED_ON ; LED_OFF } крутится с частотой 2МГц при 0 оптимизации и 3.2 МГц при максимальной оптимизации.
С операционкой, когда есть две задачи , одна включает светодиод вторая выключает, с форсированным переключением контекста(т.е. задачи не ждут системную частоту а переключаются сразу ) светодиод мигает с частотой 49 КГц при 0 оптимизации и 63 КГц при максимальной оптимизации. Таким образом, на переключение между задачами уходит около 120 тактов процессора, в задачах нет переменных которые нужно было бы сохранять в стеке.
kolobok0
Цитата(MiklPolikov @ Nov 20 2013, 21:24) *
Начал работать с FreeRTOS , пока всё нравится...


Что пришлось доделывать-переделывать:

1) переделал кусочки кода на азме. Чтоб было можно ещё и шутдаунить ртос(требуется по задаче). Правда повторный старт, что то не захотел работать. Было упёрся рогом, но потом поразмыслив - решил рестартить камень весь целяком - так стабильней.
2) код содержит логические ошибки. так например при создании таска, внутри программы выделения памяти учитывается направление роста стэка(типа подпрограмма универсальная), а вот при её вызове направление зашито глухо. ну это так - косметические копейки.
3) попробывал при выходе последней версии данной оси - быстро вставить в проект. вс без проблем, только при запуске таймеров - нитка диспетчера таймеров (с более высоким приоритетом) наглухо уходит в бесконечный цикл. Упираться рогом не стал - тупо отключил нахфик. Для меня переизбыток по функционалу.

это те огрехи, что увидел.
ось не плохо работает. режим динамической подгрузки кода. притензий нет...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.