Здравствуйте. Выбрал FreeRTOS для программирования МК AVR(в основном Atmega8,16,32..). В качестве рабочей среды использую AVR Studio 4.19 + AVR-TOOLCHAIN-3.3.0.710, а для обучения взял "FreeRTOS — операционная система для микроконтроллеров" Андрея Курница. И у меня естнственно возникают вопросы.
1. В первом примере (мигание 2мя светодиодами) используется задержка в задачах следующего типа:
Код
for( ul = 0; ul < 4000L; ul++ ) {}
. Но с этой формой задержки у меня работает только одна задача, та которая первая вызывается в главном теле (
Код
short main( void ) {....}
). Если использую одну из ф-ий задержек/сна vTaskDelay("Тик"), то работают обе ф-ии на ура. Так вот вообще такая запись как у Курница допускается или автор ее привел просто для понятия, но она никогда не будет работать? Ниже привожу код main.c и FreeRTOSConfig.h.
2. При компиляции этого кода у меня получился hex размером 11кб, на мой взгляд много. Делал все строго по инструкции автора, удалил все ненужное. Автор пишет, что размер ядра составляет 4-9кб, но это пик при использовании всех ф-ии. Так вот, почему же у меня при использовании 2х простых задач получилось уже 11кб? Можно ли как-нибудь программно отключить ненужные файлы.
3. Рассматривать FreeRTOS стал из-за ее популяризации(довольно много находил статей по ней). Может более опытные подскажут какая ОС более оптимальна в соотношении размера hex файла, возможностей и доступности документации?
Пишу сюда, потому, что в инете это единственное место на мой взгляд где можно получить ответы по FreeRTOS. Помгоите разобраться. С уважением Дмитрий.
main.c
Код
#include "FreeRTOS.h"
#include "task.h"
void vTask1( void *pvParameters )
{
volatile unsigned long ul;
for(;; )
{
PORTC ^= (1 << PC0);
for( ul = 0; ul < 4000L; ul++ )
{
}
}
vTaskDelete( NULL );
}
void vTask2( void *pvParameters )
{
volatile unsigned long ul;
for(;; )
{
PORTC ^= (1 << PC1);
for( ul = 0; ul < 8000L; ul++ )
{
}
}
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
int main( void )
{
DDRC |= (1 << DDC0) | (1 << DDC1);
xTaskCreate( vTask1, (signed char *) "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL );
xTaskCreate( vTask2, (signed char *) "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL );
vTaskStartScheduler();
return 0;
}
FreeRTOSConfig.h
Код
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#include <avr/io.h>
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0//Отключаю vApplicationIdleHook()
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) 8000000 )
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 85 )
#define configTOTAL_HEAP_SIZE ( (size_t ) ( 1500 ) )
#define configMAX_TASK_NAME_LEN ( 8 )
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 1
#define configIDLE_SHOULD_YIELD 1
#define configQUEUE_REGISTRY_SIZE 0
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 1
#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 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 0
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#endif /* FREERTOS_CONFIG_H */