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

FreeRTOS


Рекомендуемые сообщения

А где прочитать про то,как основной файл проекта (к примеру main.c ) узнает что необходимо работать с остальными файлами .c и искать там функции и где прописывается какие файлы .с мы подключили к проекту?

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

56 минут назад, StationX сказал:

А где прочитать про то,как основной файл проекта (к примеру main.c ) узнает что необходимо работать с остальными файлами .c и искать там функции и где прописывается какие файлы .с мы подключили к проекту?

Это "Стандарт языка Си", или просто учебники любые по языку Си читайте. Это базовые вещи и лучше с ними начинать разбираться на полноценном компе, а не в глухой железке!

Найдите раздел про компиляцию и линковку, препроцессор. Про утилиту MakeFile почитайте, у нее свой язык.

В какой нибудь Visual Studio проект сделайте и попробуйте добавить файл и вызвать из него функцию в качестве практического упражнения.

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, StationX сказал:

А где прочитать про то,как основной файл проекта (к примеру main.c ) узнает что необходимо работать с остальными файлами .c

main.c не работает с остальными .c-файлами. Все исполняемые файлы, добавленные в проект, компилируются отдельно компилятором. А для межфайловой связи, как раз и используются хидеры. Обычно .c файл и .h файл идут парами, и в хидере прописываются все функции и объекты, к которым осуществляется доступ.

Но это всё отдельная тема, и она никак не связана с текущей.

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

  • 2 месяца спустя...

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Доброго дня!

Не могу понять, почему не работает планировщик. Проект компилится, правда, с тремя варнингами. При заливке в МК мигает только один светодиод. Заметил такой момент: если приоритет задач нулевой, то работает задача, объявленная первая по списку. Если приоритет больше нуля, но одинаковый у всех задач - работает последняя объявленная. Если какая-либо задача имеет более высокий приоритет, то работает только она. Но всегда работает только одна задача. 

Для упрощения пользовался freertos 6.1.0, как у Курница. АВР студия 4.19. МК - мега328р.

 

#include <stdlib.h>
#include <string.h>

//#include "_def.h"

#ifdef GCC_MEGA_AVR
  // EEPROM routines used only with the WinAVR compiler. 
//  #include <avr/eeprom.h> 
#endif
// Необходимые файлы ядра 
#include <FreeRTOS.h>
#include <task.h>
#include <croutine.h>

#include "led.h"
/*-----------------------------------------------------------*/
// Функция задачи 1 

void vTask1( void *pvParameters) {//green
volatile uint32_t k1;

  while(1)  {    
    PORTC ^= (1 << PC1);		// Инвертировать бит 0 порта PORTF     	
    for( k1 = 0; k1 < 40000; k1++ )   {}	// Задержка на некоторый период Т1
  }
  // Уничтожить задачу, если произошел выход 
  // из бесконечного цикла (в данной реализации выход 
  // заведомо не произойдет) 
  vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
// Функция задачи 2, подобная задаче 1 

void vTask2( void *pvParameters ) {	//red
volatile uint32_t k2;

  while(1)  {    
    PORTC ^= (1 << PC5);    
    for( k2 = 0; k2 < 160000; k2++ ) {}  
  }

  vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
// Функция задачи 3 

void vTask3( void *pvParameters ) {		//bright
volatile uint32_t k3;

  while(1)  {    
    PORTB ^= (1 << PB1);    
    for( k3 = 0; k3 < 250000; k3++ ) {}  	
  }

  vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
int main( void )
{
  DDRC |= (1<<DDC5)|(1<<DDC1);
  DDRB |=(1<<DDB1);  
 
  // Создать задачу 1, заметьте,  что реальная программа должна 
  // проверять возвращаемое  значение, чтобы убедиться, 
  // что задача создана успешно 
/*  xTaskCreate(vTask1,  // Указатель на функцию, реализующую задачу
      configMINIMAL_STACK_SIZE,  // Размер стека - минимально необходимый
      NULL,  // Параметр, передаваемый задаче, - не используется 
      1,  // Приоритет = 1 
      NULL );  // Получение дескриптора задачи - не используется 
  */    
  // Создать задачу 2 
  	  //xTaskCreate(  vTask1,  0, configMINIMAL_STACK_SIZE, NULL, 2, NULL );
  // Запустить планировщик. Задачи начнут выполняться. 
  xTaskCreate(  vTask3,  0, configMINIMAL_STACK_SIZE, NULL, 0, NULL );
  xTaskCreate(  vTask2,  0, configMINIMAL_STACK_SIZE, NULL, 0, NULL );

  vTaskStartScheduler();
  return 0;
}
/*-----------------------------------------------------------*/

v5.rar

Изменено пользователем boris911
Ссылка на комментарий
Поделиться на другие сайты

Похоже мало памяти. Всего 2 К памяти. Две задачи + задача бездействия 3 * 200 * 2 = 1200 и куча 1500 = 2700 Байт

#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 200 )
#define configTOTAL_HEAP_SIZE		( (size_t ) ( 1500 ) )

Уменьшите в FreeRTOSConfig.h

#define configMINIMAL_STACK_SIZE    ( ( unsigned short ) 100 )

#define configTOTAL_HEAP_SIZE        ( (size_t ) ( 1000 ) )

А вообще надо проверять при создании задач, созданы они или нет.

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

Указанные вами параметры уменьшил, толку нет (они были больше рекомендованных Курницем, у него минимум для стека 85, для кучи - 1500. То я уже экспериментировал, и забыл вернуть). 

Создание задач контролирую логическим анализатором  отдельные ножки (макросы sb1,sb2 и т.д. (set_bit), каналы на ЛА считаются от нулевого, т.е. sb1==channel_0...). Первый скрин - таск 3 и таск 2, обе с нулевым приоритетом, второй - задача 2 с приоритетом 1, задача 3 с приоритетом 0. В первом случае есть реакция только на канале 2, во втором - только на канале - 1. Нулевой канал(задача 1) в main.c не использовался. 

Получается, создается только одна задача. 

p.s. Пояснение к диаграммам ЛА: удержание кнопкой Reset в 0, запуск ЛА, отпускание кнопки на Reset.

 

#include <stdlib.h>
#include <string.h>

#include "_def.h"

#ifdef GCC_MEGA_AVR
  // EEPROM routines used only with the WinAVR compiler. 
//  #include <avr/eeprom.h> 
#endif
// Необходимые файлы ядра 
#include <FreeRTOS.h>
#include <task.h>
#include <croutine.h>

#include "led.h"
/*-----------------------------------------------------------*/
// Функция задачи 1 

void vTask1( void *pvParameters) {//
volatile uint32_t k1;
	sb1
  while(1)  {    
    PORTC ^= (1 << PC1);		// Инвертировать бит 0 порта PORTF     	
    for( k1 = 0; k1 < 40000; k1++ )   {}	// Задержка на некоторый период Т1
  }
  // Уничтожить задачу, если произошел выход 
  // из бесконечного цикла (в данной реализации выход 
  // заведомо не произойдет) 
  vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
// Функция задачи 2, подобная задаче 1 

void vTask2( void *pvParameters ) {	//green
volatile uint32_t k2;
	sb2
  while(1)  {    
    PORTC ^= (1 << PC5);    
    for( k2 = 0; k2 < 160000; k2++ ) {}  
  }

  vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
// Функция задачи 3 

void vTask3( void *pvParameters ) {		//red
volatile uint32_t k3;
	sb3
  while(1)  {    
    PORTB ^= (1 << PB1);    
    for( k3 = 0; k3 < 250000; k3++ ) {}  	
  }

  vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
int main( void )
{
  DDRC |= (1<<DDC5)|(1<<DDC1);
  DDRB |=(1<<DDB1);  
  DDRD |= (1<<DDD5)|(1<<DDD6)|(1<<DDD7);
  PORTD |= (0<<PD5)|(0<<PD6)|(0<<PD7);
  // Создать задачу 1, заметьте,  что реальная программа должна 
  // проверять возвращаемое  значение, чтобы убедиться, 
  // что задача создана успешно 
/*  xTaskCreate(vTask1,  // Указатель на функцию, реализующую задачу
      configMINIMAL_STACK_SIZE,  // Размер стека - минимально необходимый
      NULL,  // Параметр, передаваемый задаче, - не используется 
      1,  // Приоритет = 1 
      NULL );  // Получение дескриптора задачи - не используется 
  */    
  // Создать задачу 2 
  	  //xTaskCreate(  vTask1,  0, configMINIMAL_STACK_SIZE, NULL, 2, NULL );
  // Запустить планировщик. Задачи начнут выполняться. 
  xTaskCreate(  vTask3,  0, configMINIMAL_STACK_SIZE, NULL, 0, NULL );
  xTaskCreate(  vTask2,  0, configMINIMAL_STACK_SIZE, NULL, 0, NULL );

  vTaskStartScheduler();
  return 0;
}
/*-----------------------------------------------------------*/

task3.jpg

task2.jpg

Изменено пользователем boris911
Ссылка на комментарий
Поделиться на другие сайты

Неправильно проверял создание задач. Надо же по возвращаемому значению. Уже интереснее. Создаются обе. Причем в указанном в коде порядке, вне зависимости от приоритета. Но выполняется по-прежнему только одна.

Код:

 

#include <stdlib.h>
#include <string.h>

#include "_def.h"

#ifdef GCC_MEGA_AVR
  // EEPROM routines used only with the WinAVR compiler. 
//  #include <avr/eeprom.h> 
#endif
// Необходимые файлы ядра 
#include <FreeRTOS.h>
#include <task.h>
#include <croutine.h>
/*-----------------------------------------------------------*/
// Функция задачи 1 

void vTask1( void *pvParameters) {//
volatile uint32_t k1;
  while(1)  {    
    PORTC ^= (1 << PC1);		// Инвертировать бит 0 порта PORTF     	
    for( k1 = 0; k1 < 40000; k1++ )   {}	// Задержка на некоторый период Т1
  }
}
/*-----------------------------------------------------------*/
// Функция задачи 2

void vTask2( void *pvParameters ) {	//green
volatile uint32_t k2;
  while(1)  {    
    PORTC ^= (1 << PC5);    
    for( k2 = 0; k2 < 160000; k2++ ) {}  
  }
}
/*-----------------------------------------------------------*/
// Функция задачи 3 

void vTask3( void *pvParameters ) {		//red
volatile uint32_t k3;
  while(1)  {    
    PORTB ^= (1 << PB1);    
    for( k3 = 0; k3 < 250000; k3++ ) {}  	
  }
}
/*-----------------------------------------------------------*/
int main( void )
{
  DDRC |= (1<<DDC5)|(1<<DDC1);	//выводы светодиодов на выход
  DDRB |=(1<<DDB1);  			//выводы светодиодов на выход
  DDRD |= (1<<DDD5)|(1<<DDD6)|(1<<DDD7);	//выводы для контроля на выход
  PORTD |= (0<<PD5)|(0<<PD6)|(0<<PD7);		//выводы для контроля на ноль

  if(xTaskCreate(  vTask3,  0, configMINIMAL_STACK_SIZE, NULL, 0, NULL )) {
  	sb3;
  }		
  if (xTaskCreate(  vTask2,  0, configMINIMAL_STACK_SIZE, NULL, 1, NULL )) {
  	sb2;
	}	

  vTaskStartScheduler();

  return 0;
}
/*-----------------------------------------------------------*/

 

 

tasks2.jpg

Изменено пользователем boris911
Ссылка на комментарий
Поделиться на другие сайты

22 минуты назад, snn_krs сказал:

У вас в FreeRTOSConfig.h

#define configUSE_CO_ROUTINES         1

использование сопрограмм, а вы создаете задачи. Поставьте

#define configUSE_CO_ROUTINES         0

Без изменений. При нулевых приоритетах работает таск3, при других одинаковых - таск2. 

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

@Alex теоретически должно работать, вот наткнулся на похожую проблему

http://forum.easyelectronics.ru/viewtopic.php?f=49&t=21298

Но пустая замена циклов на vTaskDelay пока результата не даёт, что-то еще не так сконфигурировано. 

Я только начинаю вникать в freertos, поэтому понимаю еще очень мало.

Изменено пользователем boris911
Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, boris911 сказал:

Но пустая замена циклов на vTaskDelay пока результата не даёт

Даже если результат не дала, всё-таки советую оставить vTaskDelay на время экспериментов.

И ещё. На сколько я помню ( могу ошибаться, память у меня короткая), с нулевым приоритетом нельзя запускать собственные задачи. С таким приоритетом крутится только задача бездействия.

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

Светятся оба, не мигают.

main.c

//#include <stdlib.h>
//#include <string.h>

#include "_def.h"

// Íåîáõîäèìûå ôàéëû ÿäðà 
#include <FreeRTOS.h>
#include <task.h>

/*-----------------------------------------------------------*/
// Ôóíêöèÿ çàäà÷è 1

void vTask1( void *pvParameters ) {	//green
	while(1) {
        PORTB ^= (1 << PB1);    
		vTaskDelay(200);
	}
}
/*-----------------------------------------------------------*/
// Ôóíêöèÿ çàäà÷è 2
void vTask2( void *pvParameters ) {		//red
	while(1) {
        PORTC ^= (1 << PC5);    
		vTaskDelay(500);
	}
}
/*-----------------------------------------------------------*/
int main( void )
{
  DDRC |= (1<<DDC5);	//âûâîäû ñâåòîäèîäîâ íà âûõîä
  DDRB |= (1<<DDB1);  			//âûâîäû ñâåòîäèîäîâ íà âûõîä
  
  DDRD |= (1<<DDD5)|(1<<DDD6)|(1<<DDD7);	//âûâîäû äëÿ êîíòðîëÿ íà âûõîä
  PORTD |= (0<<PD5)|(0<<PD6)|(0<<PD7);		//âûâîäû äëÿ êîíòðîëÿ íà íîëü

  if(xTaskCreate( vTask1, 0, configMINIMAL_STACK_SIZE, NULL, 1, NULL )) {
  	sb3;
  }		
  if (xTaskCreate( vTask2, 0, configMINIMAL_STACK_SIZE, NULL, 1, NULL )) {
  	sb2;
  }	

  vTaskStartScheduler();
	
  return 0;
}
/*-----------------------------------------------------------*/

FreeRTOSConfig.h

/*
    FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.

*/

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include <avr/io.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_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#define configCPU_CLOCK_HZ			( ( unsigned long ) 16000000 )
#define configTICK_RATE_HZ			( ( portTickType ) 1000 )
#define configMAX_PRIORITIES		( ( unsigned portBASE_TYPE ) 4 )
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 100 )
#define configTOTAL_HEAP_SIZE		( (size_t ) ( 1000 ) )
#define configMAX_TASK_NAME_LEN		( 8 )
#define configUSE_TRACE_FACILITY	0
#define configUSE_16_BIT_TICKS		1
#define configIDLE_SHOULD_YIELD		0
#define configQUEUE_REGISTRY_SIZE	0

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 		0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet		0
#define INCLUDE_uxTaskPriorityGet		0
#define INCLUDE_vTaskDelete				0
#define INCLUDE_vTaskCleanUpResources	0
#define INCLUDE_vTaskSuspend			0
#define INCLUDE_vTaskDelayUntil			0
#define INCLUDE_vTaskDelay				1


#endif /* FREERTOS_CONFIG_H */

v9.jpg

Изменено пользователем boris911
Ссылка на комментарий
Поделиться на другие сайты

5 minutes ago, boris911 said:

Светятся оба. Не мигают.

Значит задачи не выполняются. Поставте в main перед return 0 выключение одного светодиода и задержку цикл for. Если будет мигать, значит планировщик вылетает из-за недостатка памяти.

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

@snn_krs светится, не мигает.

int main( void )
{
  DDRC |= (1<<DDC5);	//âûâîäû ñâåòîäèîäîâ íà âûõîä
  DDRB |= (1<<DDB1);  			//âûâîäû ñâåòîäèîäîâ íà âûõîä
  
  DDRD |= (1<<DDD5)|(1<<DDD6)|(1<<DDD7);	//âûâîäû äëÿ êîíòðîëÿ íà âûõîä
  PORTD |= (0<<PD5)|(0<<PD6)|(0<<PD7);		//âûâîäû äëÿ êîíòðîëÿ íà íîëü

  if(xTaskCreate( vTask1, 0, configMINIMAL_STACK_SIZE, NULL, 1, NULL )) {
  	sb3;
  }		
  if (xTaskCreate( vTask2, 0, configMINIMAL_STACK_SIZE, NULL, 1, NULL )) {
  	sb2;
  }	

  vTaskStartScheduler();

	CB(PORTB,1); //clear_bit
	for(u32 i=0;i<500000;i++) {}
	
  return 0;
}

 

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

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

Надо было внимательней сообщения читать. В АтмелСтудио начиная с 4 версии поменяли названия обработчиков прерываний. Попробуйте вставить в начало файла строку

#define SIG_OUTPUT_COMPARE1A TIMER1_COMPA_vect

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

Хэндлер поменял непосредственно в самом port.c, no changes.

Протеусом не владею, в самой студии можно пошагово смотреть, только толку от этого, когда отладчик заходит в дебри функций самой ОС. 

Да, пришлось переехать на студию 6.2, четверка под десятой виндой виснет просто ужас. 

 

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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