113
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 3 '2011
www.kite.ru
компоненты
микроконтроллеры
MCU = atmega323
и заменить ее на
MCU = atmega128
Для
редактирования файлов можно
применить простой, но удобный тексто-
вый редактор Programmers Notepad, кото-
рый поставляется вместе с компилятором
WinAVR (рис. 7), запустить который мож-
но выполнив
Пуск
→
Все программы →
WinAVR-20100110
→
Programmers Notepad
[WinAVR] или
C:/WinAVR-20100110/pn/pn.exe
(в случае установки WinAVR на диск C:/).
Помимо прочего Programmers Notepad по-
зволяет производить сборку (buid) проекта
прямо из окна редактора.
Далее необходимо исключить из компиляции
большинство исходных файлов проекта, отве-
чающих за демонстрацию всех возможностей
FreeRTOS, оставив лишь основной файл
main.c.
То есть заменить фрагмент файла
makefile:
SRC = \
main.c \
ParTest/ParTest.c \
serial/serial.c \
regtest.c \
$(SOURCE_DIR)/tasks.c \
$(SOURCE_DIR)/queue.c \
$(SOURCE_DIR)/list.c \
$(SOURCE_DIR)/croutine.c \
$(SOURCE_DIR)/portable/MemMang/heap_1.c \
$(PORT_DIR)/port.c \
$(DEMO_DIR)/crflash.c \
$(DEMO_DIR)/integer.c \
$(DEMO_DIR)/PollQ.c \
$(DEMO_DIR)/comtest.c
на:
SRC = \
main.c \
$(SOURCE_DIR)/tasks.c \
$(SOURCE_DIR)/queue.c \
$(SOURCE_DIR)/list.c \
$(SOURCE_DIR)/croutine.c \
$(SOURCE_DIR)/portable/MemMang/heap_1.c \
$(PORT_DIR)/port.c
Подготовительный этап закончен. Теперь
можно переходить к редактированию фай-
ла
main. c. Его содержимое должно принять
вид:
#include
#include
#ifdef GCC_MEGA_AVR
/* EEPROM routines used only with the WinAVR compiler. */
#include
#endif
/* Необходимые файлы ядра */
#include “FreeRTOS.h”
#include “task.h”
#include “croutine.h”
/*-----------------------------------------------------------*/
/* Функция задачи 1 */
void vTask1( void *pvParameters )
{
/* Квалификатор volatile запрещает оптимизацию
/* переменной ul */
volatile unsigned long ul;
/* Как и большинство задач, эта задача содержит
/* бесконечный цикл */
for( ;; )
{
/* Инвертировать бит 0 порта PORTF */
PORTF ^= (1 << PF0);
/* Задержка на некоторый период Т1*/
for( ul = 0; ul < 4000L; ul++ )
{
/* Это очень примитивная реализация задержки,
/* в дальнейших примерах будут использоваться
/* API-функции */
}
}
/* Уничтожить задачу, если произошел выход
/* из бесконечного цикла (в данной реализации выход
/* заведомо не произойдет) */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
/* Функция задачи 2, подобная задаче 1 */
void vTask2( void *pvParameters )
{
volatile unsigned long ul;
for( ;; )
{
/* Инвертировать бит 1 порта PORTF */
PORTF ^= (1 << PF1);
/* Задержка на некоторый период Т2*/
for( ul = 0; ul < 8000L; ul++ )
{
}
}
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
short main( void )
{
/* Биты 0, 1 порта PORTF будут работать как ВЫХОДЫ */
DDRF |= (1 << DDF0) | (1 << DDF1);
/* Создать задачу 1, заметьте, что реальная программа должна
/* проверять возвращаемое значение, чтобы убедиться,
/* что задача создана успешно */
xTaskCreate(vTask1, /* Указатель на функцию,
/* реализующую задачу */
(signed char *) “Task1”, /* Текстовое имя задачи.
/* Только для наглядности */
configMINIMAL_STACK_SIZE, /* Размер стека –
/* минимально необходимый*/
NULL,
/* Параметр, передаваемый задаче, –
/* не используется */
1,
/* Приоритет = 1 */
NULL ); /* Получение дескриптора задачи – не используется */
/* Создать задачу 2 */
x Ta s k C r e a t e ( v Ta s k 2 , ( s i g n e d c h a r * ) “ Ta s k 2 ” ,
configMINIMAL_STACK_SIZE, NULL, 1, NULL );
/* Запустить планировщик. Задачи начнут выполняться. */
vTaskStartScheduler();
return 0;
}
/*-----------------------------------------------------------*/
Для сборки проекта из среды Programmers
Notepad необходимо выбрать пункт меню
Достарыңызбен бөлісу: