Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » CERGEI » FreeRtos and stm32


FreeRtos and stm32

Сообщений 1 страница 23 из 23

1

Начну статьи по FreeRtos.
Почему вообще нужна rtos ?  Кто писал объемные программы под микроконтроллер знает,что что нужен цикл и в котором все крутится и в цикле как можно меньше задержек. Также при написании кода программист сам выбирает алгоритм написания и какими операторами это совершить. Но самое сложное не написать и отладить код,а потом по прошествии времени вспомнить что и от чего зависит в коде даже с комментариями.
Что дает RTOS :
1) Модульность, когда каждая задача отвечает за свои функции и имея свой приоритет
2) Атомарность, когда задача не может изменить переменные другой задачи.А принимает и передает значения через очереди.
3) Упрощает читаемость кода

Почему FreeRtos :
1) Бесплатна
2) Поддержка не один год и выпуск новых версий

Сам сайт FreeRtos
Статьи Андрей Курниц Kurniz.pdf

Загружаем FreeRtos с официального сайта.
Создание проекта стандартно,только создаем отдельную папку под rtos
http://s7.uploads.ru/t/0uovx.png
Наполняем папочку,сначала забираем порты под свой микропроцессор,так как у нас stm32f103c8t6 ,то идем в папочку ARM_CM3. Качаем от туда в свой проект файлы port.c и portmacro.h
http://s3.uploads.ru/t/2JMNX.png
http://s7.uploads.ru/t/cUTMW.png

Далее качаем из FreeRtos файлы основные из  папки Source,все остальное кроме папки portable.
http://s5.uploads.ru/t/Ono5e.png

Также нужен файлик для работы с памятью из папочки MemMang нужную версию,различия можно почитать на сайте FreeRtos( если кратко то версия выше там можно освобождать память и собирать в кучи для следующего выделения,но если проект статический и задачи не уничтожаются во время выполнения то пойдет и heap_1.c )
http://sa.uploads.ru/t/trwfB.png

Получаем вот так такое наполнение у нас в проекте :

http://s3.uploads.ru/t/LltxJ.png
http://s4.uploads.ru/t/sgUzi.png

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

Код:
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"

//#include "croutine.h"
//#include "queue.h"
 
 
/*** descript RTOS ***/
TaskHandle_t xTask1_Handle,
             xTask2_Handle;
             
typedef struct TaskParam_t {
char string[32]; 
long period; 
} TaskParam;

TaskParam xTP1, xTP2;
/*-----------------------------------------------------------*/

void vTask1( void *pvParameters )
{
	volatile TaskParam *pxTaskParam;
	TickType_t xLastWakeTime;
	pxTaskParam = (TaskParam *) pvParameters;
	xLastWakeTime=xTaskGetTickCount();
	for( ;; )
	{
    
    GPIOC->ODR ^= GPIO_ODR_ODR13;
    vTaskDelayUntil(&xLastWakeTime,pxTaskParam->period);
    //vTaskDelay(pxTaskParam->period);
	}
	
}

void vTask2( void *pvParameters )
{
	volatile long ul;
	volatile TaskParam *pxTaskParam;
	pxTaskParam = (TaskParam *) pvParameters;
	for( ;; )
	{
    vTaskDelay(pxTaskParam->period);
	}
	//vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
int main( void )
{
	RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
	// miganie PC13
    GPIOC->CRH&=~GPIO_CRH_MODE13;
	  GPIOC->CRH|=GPIO_CRH_MODE13_1;   //  50 mgh
	  GPIOC->CRH|=GPIO_CRH_MODE13_0;
	  GPIOC->CRH&=~GPIO_CRH_CNF13; 
	

	xTP1.period = 500L;
	xTP2.period = 3000L;
	
	xTaskCreate( vTask1, 
    ( const char * ) "Task1",
    configMINIMAL_STACK_SIZE,
    (void*)&xTP1, 
    1,
    &xTask1_Handle );
    
	xTaskCreate( vTask2, ( const char * ) "Task2", 
               configMINIMAL_STACK_SIZE, 
	              (void*)&xTP2, 
                	2, 
                 &xTask2_Handle );

	vTaskStartScheduler();
	return 1;
}


FreeRTOSConfig.h

Код:
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
 *
 * See http://www.freertos.org/a00110.html.
 *----------------------------------------------------------*/
 
 
#define configUSE_PREEMPTION    	1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION	0
#define configUSE_TICKLESS_IDLE    	0
#define configCPU_CLOCK_HZ    	( ( unsigned long ) 72000000 )
#define configTICK_RATE_HZ    	( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES    	5
#define configMINIMAL_STACK_SIZE    128
#define configTOTAL_HEAP_SIZE    	( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN    	16
#define configUSE_16_BIT_TICKS    	0
#define configIDLE_SHOULD_YIELD    	1
#define configUSE_MUTEXES    	1
#define configUSE_RECURSIVE_MUTEXES    1
#define configUSE_COUNTING_SEMAPHORES    1
#define configUSE_ALTERNATIVE_API    0 /* Deprecated! */
#define configQUEUE_REGISTRY_SIZE    10
#define configUSE_QUEUE_SETS    	0
#define configUSE_TIME_SLICING    	0
#define configUSE_NEWLIB_REENTRANT    0
#define configENABLE_BACKWARD_COMPATIBILITY	0
 
/* Hook function related definitions. */
#define configUSE_IDLE_HOOK    	0
#define configUSE_TICK_HOOK    	0
#define configCHECK_FOR_STACK_OVERFLOW    0
#define configUSE_MALLOC_FAILED_HOOK    0
 
/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS    0
#define configUSE_TRACE_FACILITY    0
#define configUSE_STATS_FORMATTING_FUNCTIONS	0
 
/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES    	0
#define configMAX_CO_ROUTINE_PRIORITIES	2
 
/* Software timer related definitions. */
#define configUSE_TIMERS    	1
#define configTIMER_TASK_PRIORITY    3
#define configTIMER_QUEUE_LENGTH    10
#define configTIMER_TASK_STACK_DEPTH    configMINIMAL_STACK_SIZE
 
///* Interrupt nesting behaviour configuration. */
//#define configKERNEL_INTERRUPT_PRIORITY    255
//#define configMAX_SYSCALL_INTERRUPT_PRIORITY	191
 
 
 
 
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
 
#define INCLUDE_vTaskPrioritySet    1
#define INCLUDE_uxTaskPriorityGet    1
#define INCLUDE_vTaskDelete    	1
#define INCLUDE_vTaskCleanUpResources    1
#define INCLUDE_vTaskSuspend    	1
#define INCLUDE_vTaskDelayUntil    	1
#define INCLUDE_vTaskDelay    	1
#define INCLUDE_xResumeFromISR    	1
#define INCLUDE_xTaskGetSchedulerState    1
#define INCLUDE_xTaskGetCurrentTaskHandle	0
#define INCLUDE_uxTaskGetStackHighWaterMark	0
#define INCLUDE_xTaskGetIdleTaskHandle    0
#define INCLUDE_xTimerGetTimerDaemonTaskHandle	0
#define INCLUDE_pcTaskGetTaskName    0
#define INCLUDE_eTaskGetState    	0
#define INCLUDE_xEventGroupSetBitFromISR	1
#define INCLUDE_xTimerPendFunctionCall    1
 
 
 
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
 


/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY     255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	191 /* equivalent to 0xb0, or priority 11. */


/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15.  This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.  Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY	15

#endif /* FREERTOS_CONFIG_H */


http://sd.uploads.ru/t/TmOiz.png

Простите что сумбурно немного,тема нелегкая.Поправки,замечания,вопросы пишите если интересно.

Позже опишу файлик настройки  FreeRTOSConfig.h и подводные камни freertos.

Проект на кейле,stm32f103c8t6 Ссылка

Отредактировано CERGEI (2018-03-08 16:37:50)

2

О приоритетах поподробней, пожалуйста!

Как указать приоритет на единицу больший задачи IDLE?
Как указать приоритет на единицу меньший максимально возможного?

3

Приоритет дается при создании задачи,также можно динамически его понизить или повысить в ходе работы программы.
Каждой задаче назначается приоритет от 0 до (configMAX_PRIORITIES — 1). Меньшее значение приоритета соответствует меньшему приоритету. Наиболее низкий приоритет у задачи «бездействие», значение которого определено в tskIDLE_PRIORITY как 0. Изменяя значение configMAX_PRIORITIES, можно определить любое число возможных приоритетов,однако уменьшение configMAX_PRIORITIES позволяет уменьшить объем ОЗУ, потребляемый ядром.

configMAX_PRIORITIES прописывается в FreeRTOSConfig.h

Простите что пока не продолжил тему,немного навалилась работа основная.

Отредактировано CERGEI (2018-03-22 13:19:46)

4

Чтоб не описывать по сто раз мне FreeRTOSConfig.h пару хороших ссылок:
1) Источник на английском https://www.freertos.org/a00110.html
2) Также хорошее описание на русском с изиэлектроникс http://easyelectronics.ru/ustanovka-i-k … ertos.html

5

Типа книжка... интересная... по этой теме появилась...
http://forum.easyelectronics.ru/viewtop … a5#p555717

6

7

Интересно

8

Интересно что куча забирает оперативную память под задачи и т д  и мы утыкаемся в границу RAM . Пора пробовать в будущем stm32f407..... :)

http://s3.uploads.ru/t/oSIqu.png

9

Пишу код с задачами и таймером + дисплей ssd1306 (от досика) и опа иногда у меня уходит в ступор при обмене с шиной i2c. Не всегда,но иногда зависает после старта и выдачей адреса и зависание на цикле. Применяя в обертке с taskENTER_CRITICAL(); и taskEXIT_CRITICAL(); не дало положительных результатов. Пока тупо не запретил все прерывания в наглую в обертке :

Код:
        
     __disable_irq ();
     ssd1306_Puts(txt_setup,2);  // text and stroka
     ssd1306_update(2);
    __enable_irq (); 

На работу пока оси это не повлияло,буду тестить дальше. Есть подозрение на таймер,который просто мигает на плате светодиодом. Для чего тогда taskENTER_CRITICAL ? думал для отключения переключения задач и таймеров и остановки планировщика.
Надо собачку изучить и подвязать ))

10

А ты не пробовал и2с на прерываниях сделать чтобы пнуть передачу и отдать управление другим задачам. Тоже интересуюсь вопросами ОС, но пишу свою... опять взялся за нее...

11

В этом проекте не буду переписывать уже, а то завязну. В следущем проекте перепишу обмен по i2c и то индикатор хочу применить уже nextion по usart.

12

CERGEI Как ты считаешь хватит ли 32 задач на все случаи жизни, как по мне это много.

13

32 задачи?

14

да хватит ли для одного проекта 32 задачи, я вот думаю нафига больше

15

Да хватит конечно,вон мне пока и 3 задач хватает :) Не помнишь был такой Tester( если не ошибаюсь на форуме микрочипа) то он свою ось тоже писал. Называлась OSA , я пользовался ей,пока не кончилась поддержка ее. Но грамотный был человек

Это глюк кейла или я что не пойму ? Разные переменные,но указатель в одну ячейку памяти,а если не ставить volatile то вообще в программу не вставляет компилятор,я в шоке :)

http://s3.uploads.ru/t/NL20X.png

16

ты имеешь в виду адрес переменной самой или данных куда она указывает?

17

Попробовал без хала и все заработало, чудеса да и только. Сырой хал в связке с ртос, глюков куча, все вызовы переписанны у них по своему...

18

Вот я задумался позволяет ли FreeRTOS создавать стеки на разных типах памяти SDRAM, SRAM, CCMRAM в одном проекте?

19

Если честно,то не дорос до расположения стеков в разных типах памяти.Хотя фриртос как раз и берет кучу в оперативке и там все задачи и фарш  пихает в оперативку как я понял для быстроты работы. Можно спросить зачем изобретать велосипед ? когда есть фриртос хотя бы, сколько времени на это уйдет ? или заработать хотите на этом в будущем ))

20

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

21

Проверил время переключения между задачами в FreeRTOS таким кодом:

Код:
void Task_1(void *Arg)
{
  while(1)
  {
   aaa = DWT->CYCCNT;
  }
}

void Task_2(void *Arg)
{
  while(1)
  {
   bbb = DWT->CYCCNT;
   __NOP();  // тут мы останавливаемся
  }
}


получилось 265 тактов.

22

MasterElectric написал(а):

Вот я задумался позволяет ли FreeRTOS создавать стеки на разных типах памяти SDRAM, SRAM, CCMRAM в одном проекте?

Изначально из коробки - нет , она берет из кучи. Иожно отделить кучу фриРтос от кучи всего остального проекта, переписав ее функции выделения памяти
pvPortMalloc и vPortFree так, чтоб они работали со "своей" кучей, а функции malloc и free - со своей.

Тогда можно и так сделать.
А чтоб сделать разные кучи для разных задач, это надо уже в макросах создания задач ковыряться и передавать им параметр желаемой кучи.
Как мне кажется.

23

Интересно про приоритеты прерываний : Чтоб вызвать функцию API RTOS из прерывания нужно чтоб приоритет прерывания был не выше configMAX_SYSCALL_INTERRUPT_PRIORITY  ?

http://s8.uploads.ru/t/ZX0xY.png

http://sg.uploads.ru/t/sivpc.png


Вы здесь » Микроконтроллеры » CERGEI » FreeRtos and stm32