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
Для этого пути добавляем информацию для компоновщика согласно иллюстрации:
Путь Б:
Никаких 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]
|