Воскресенье, 2024-05-19
Сборник компьютерных технологий
Меню сайта
Категории раздела
My articles [30]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » My articles

FreeRTOS Atmega

1. Скачиваем исходный код и примеры FreeRTOS с офсайта http://www.freertos.org/a00104.html

Нас интересует папка FreeRTOS, добавляем из неё в проект все файлы, кроме файлов папки portable. Затем заходим в portable, находим папку нашего компилятора GCC. Для Atmega там можно подцепить ATMega323; для AtMega 32 bit - AVR32_UC34; для AtSAM - самый широкий выбор.

2. Файл конфигурации FreeRTOS можно позаимствовать из демок. Например, FreeRTOS\Demo\AVR_ATMega323_WinAVR

3. В оригинальном дистрибутиве присутствует устаревший код времён AVR Studio 4. Речь о примере для ATMega323, происходит ошибка компиляции attempt to use poisoned "SIG_OUTPUT_COMPARE1A" Решается двумя путями

Путь А: включить поддержку устаревших возможностей avr-libc. Полный список устаревших (deprecated) возможностей: http://www.nongnu.org/avr-libc/user-manual/group__deprecated__items.html

Для этого пути добавляем информацию для компоновщика согласно иллюстрации:

 

http://www.avrfreaks.net/sites/default/files/Studio6.jpg

 

Путь Б:

Никаких deprecated возможностей. Открываем port.c

Меняем исходный код согласно моему шаблону:


#if configUSE_PREEMPTION == 1

/*
* Tick ISR for preemptive scheduler.  We can use a naked attribute as
* the context is saved at the start of vPortYieldFromTick().  The tick
* count is incremented after the context is saved.
*/
//void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) );
//void SIG_OUTPUT_COMPARE1A( void )
//{
//vPortYieldFromTick();
//asm volatile ( "reti" );
//}

ISR(TIMER1_COMPA_vect, ISR_NOBLOCK)
{
    vPortYieldFromTick();
    //asm volatile ( "reti" );
}

#else

/*
* Tick ISR for the cooperative scheduler.  All this does is increment the
* tick count.  We don't need to switch context, this can only be done by
* manual calls to taskYIELD();
*/
//void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal ) );
//void SIG_OUTPUT_COMPARE1A( void )
//{
//xTaskIncrementTick();
//}


ISR(TIMER1_COMPA_vect, ISR_NOBLOCK)
{
    xTaskIncrementTick();
}
#endif

 

ISR_NOBLOCK разрешает прерывания в прерываниях.

 

Какой таймер использует FreeRTOS? Порт FreeRTOS для AtMega использует TIMER1.

 

В процессе сборки проекта с FreeRTOS 9 из-под Atmel Studio могут возникнуть варнинги
Warning        cast from pointer to integer of different size [-Wpointer-to-int-cast]

 

Категория: My articles | Добавил: DungeonLords (2017-01-15)
Просмотров: 748
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright Forcer, Inc © 2024
    Бесплатный конструктор сайтов - uCoz