Прикручиваем scmRTOS к AVR Studio 4

Рыская на просторах интернета не нашел толкового руководства по прикручиванию scmRTOS к AVRStudio, посему решил восполнить этот пробел.
Итак, пациенты
scmRTOS v3.10 можно взять тут
AVR Studio 4 c прикрученным к ней WinAVR
Качаем и распаковываем scmRTOS
В winAVR создаем новый проект под нужный МК (я создаю под ATMega8)
Теперь самое интересное, так как scmRTOS написана на c++, то нам надо указать в настройках студии путь к правильному компилятору ибо, по-умолчанию, это путь к компилятору чистого “C”

Из опций убираем –std=gnu99 (чтобы компилятор не кидал на него Warning)
Далее в настройках проекта указываем путь к исходникам scmRTOS


Не забываем, что из папки с примерами scmRTOS надо скопировать в папку с проектом конфигурационные файлы для OS
Например отсюда
  • 1-EventFlag/src/scmRTOS_TARGET_CFG.h
  • 1-EventFlag/src/scmRTOS_CONFIG.h
  • 1-EventFlag/src/pin_macros.h

Добавляем их в проект


В scmRTOS_CONFIG.h прописываем
  • #define scmRTOS_PROCESS_COUNT 2 //используем 2 процесса RTOS
  • #define scmRTOS_SYSTIMER_HOOK_ENABLE 0 //отключаем вызов пользовательской функции void OS::SystemTimerUserHook при переполнении таймера
  • #define scmRTOS_IDLE_HOOK_ENABLE 0 //отключаем вызов пользовательской функции IdleProcessUserHook()
  • #define scmRTOS_CONTEXT_SWITCH_SCHEME 0 //используем способ прямой передачи управления

Теперь наша первая программа на RTOS, как обычно “Hello World” светодиодами

#define F_CPU 8000000
#include <util/delay.h>	
#include <avr/io.h> 
#include <scmRTOS.h>

typedef OS::process<OS::pr0, 80> TProc1;
typedef OS::process<OS::pr1, 80> TProc2;

TProc1 Proc1;
TProc2 Proc2;

#define LED1 6
#define LED2 7
#define LED_DDR DDRD
#define LED_PORT PORTD

int main()
{
    LED_DDR = 0xFF;
    LED_PORT = (1<<LED1)|(1<<LED2);
    TCCR0 = 0x03;  //предделитель на 64                
    TIMSK |=  (1 << TOIE0);  //разрешаем прерывание по переполнению таймера
    OS::Run(); //запускаем OS
}


namespace OS 
{
    template<> OS_PROCESS void TProc1::Exec()
    {
        for(;;)
        {
	    LED_PORT ^= (1<<LED1);
	    Sleep(500/2);  //В качестве системного таймера используется Timer/Counter0 со значе-
                           //нием предделителя, равным 64, что дает при 8 МГц тактовой частоты период
                           //переполнения 2.048 мс. - соответственно тут получаем задержку в 500 мс
       }
   }
}

namespace OS 
{
   template<> OS_PROCESS void TProc2::Exec()
   {
       for(;;)
       {
           LED_PORT ^= (1<<LED2);
           Sleep(120/2);
       }
   }
}



Компилируем… получаем кучу ошибок
Смотрим, в самом начале
..\scmRTOS\AVR/OS_Target.h:121:28: error: scmRTOS_CONFIG.h: No such file or directory
Получается, что компилятор не находит наши файлы конфига, хорошо добавим в пути проекта текущую директорию



Компилируем…опять ошибки (но уже гораздо меньше)
Смотрим куча ошибок undefined reference to…, получается, что компилятор не находит реализацию самих функций
Добавляем все *.cpp *.S файлы из директории с scmRTOS
Получается что-то вроде этого


Компилируем – все ОК

Заливаем в железо или протеус, любуемся
(проект для студии и для протеуса смотрим в аттачах)
  • +3
  • 22 сентября 2011, 23:15
  • Lekster
  • 2
Файлы в топике: proteus.zip, scm_rtos_avrstudio.zip

Комментарии (15)

RSS свернуть / развернуть
Ты это сам в протеусе проверял? Он работать не будет. Для работе в протеусе нужно выбрать прямой способ переключения контекста.
Т.к. протеус неумеет генерить прерывания от бутлоадера.

Вот этот момент
Sleep(500/2);

Вообще непонял. Это даст 368мс. Да и запись какая то чудная. Зачем что-то делить?

В еклипсе это прекручивается намного быстрее и удобней. Особенно для авр.
Также уже давно вышла 4я версия.
0
  • avatar
  • a9d
  • 22 сентября 2011, 23:41
Также там есть удобные скрипты для работы с пинами.
И в конфигах никогда не использую магические числа.
0
  • avatar
  • a9d
  • 22 сентября 2011, 23:44
Естественно проверял, как ни странно, но работает
насчет 368мс, а это ты как считал? при предделителе 64 на 8 МГц переполнение через 2.048 мс, поэтому задержка должна получится в районе 500 / 2 * 2.048 ~ 512 мс, на самом деле чуть больше конечно
C Eclips'om надо будет попробовать подружить на досуге, хотя мне NetBeans больше нравится
0
Да быть такого неможет. Я совершенно недавно проверял в самом новом протеуссе. Работает только при прямом переключении контекста.

С задержкой правда. Неправильно посчитал переполнение.
0
  • avatar
  • a9d
  • 23 сентября 2011, 00:03
хм, пользую 7.6 SP0 (Build 8304) — если глаза меня не обманывают, то моргает :)
какой у тебя протеус? затести в нем, может фишка протеуса
0
7.8

В старых версия отладка тоже не работала.
0
  • avatar
  • a9d
  • 23 сентября 2011, 00:11
Кстати, я использовал способ прямой передачи управления, добавил в статью инфо, чтоб не смущало
0
7.6 sp4 build 8741 — работает.
0
  • avatar
  • basil
  • 27 сентября 2011, 12:39
Lekset здравствуйте.
у меня такая проблема не хочет компилится проект пишит что нет в директории фаила RTOSscm.h хотя я все все подключил к проекту все файлы но все равно вылизает 11 ошибок AvrStudio 4.16 build 628 стоит на компе
Что я сделал не так?
0
Значит не правильно указал все пути.
Также лучше переходи на Studio 5.1. Там компилятор по свежее, он даст выигрыш почти в сто байт флеша.
И лучше уже используй SCMRtos 4.0, на него дока получше будет и функционал расширен.
0
Хорошо спасибо попробую с новой Студией
0
Попробовал с новой студией одна ошибка осталась не как не хочет компилироватся
Все пути проложил ошибок этом нет. Вот такую ошибку показывает в нижнем окне:
make: *** No rule to make target `OS_Target_cpp.o', needed by `rtos_1.elf'. Stop.
Build failed with 1 errors and 0 warnings…
Что может быть?
0
Скинь чтоль окошко, где пути с инклуд директориями прописываются
Фишка по идее все равно в путях должна быть, либо не все файлы подключил к проекту
И еще в старой студии точно была фишка, если путь слишком длинный ее глючило, либо если путь содержит директории с киррилическими символами (либо на пути к проекту директории с киррилическими симмволами типа c:\мои документы\my project)
0
Теперь самое интересное, так как scmRTOS написана на c++, то нам надо указать в настройках студии путь к правильному компилятору ибо, по-умолчанию, это путь к компилятору чистого “C”
Можно и лучше это не делать. Там по умолчанию выбран исполняемый файл avr-gcc.exe, он сам по расширению компилируемого файла определяет вызывает нужный фронтэнд Си, С++ или Асм.
0
Вот пути которые я проложил в инклуде:
первый путь D:\scm_rtos_avrstudio\scmRTOS\AVR
второй D:\scm_rtos_avrstudio\scmRTOS\Common
и третий D:\scm_rtos_avrstudio\rtos_1
Кириллице в путях у меня нет
Вроде пути не длинные но компелироватся что то не хочет та же ошибка
make: *** No rule to make target `OS_Target_cpp.o', needed by `rtos_1.elf'.  Stop.
Build failed with 1 errors and 0 warnings...
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.