roboforum.ru

Технический форум по робототехнике.

minibot-lib c/c++ lib

minibot-lib c/c++ lib

Vooon » 12 янв 2008, 18:09

предлагаю собрать библиотеку стандартных функций для работы с железом минибота.

начал с описания платформы, пока не закончено.

переехало из вики

Re: minibot-lib c++ lib

Vooon » 29 апр 2008, 21:12

постепенно развиваю библиотеку, но пока довольно медленно,
если кто-то хочет присоединиться, буду рад :)

используемые инструменты:
  • GCC for AVR (WinAVR)
  • Scons (с ним под win придется еще попотеть, toolchain писал чисто под Linux)
  • Mercurial (система контроля версий, для win удобна TortoiseHG)
  • Python2.5 (нужен для работы scons и mercurial)

ссылка на репозиторий: http://hg.vehq.ru/minibot-lib/
комманда для получения копии: hg clone http://hg.vehq.ru/minibot-lib/

(да-да, у меркуриала ссылка на веб-морду и само репо одна :) )

Re: minibot-lib c/c++ lib

Vooon » 05 май 2008, 17:51

SCons fixed. теперь исправно работает под виндой

Re: minibot-lib c/c++ lib

blindman » 17 июл 2008, 17:56

В связи с назревающей второй ревизией минибота, у меня, и не только у меня, появилась мысль о создании библиотек для него на C. И тут меня ткнули носом в этот топик. Почитал, посмотрел. Возникли вопросы:

1. Почему C++? Не очень популярный язык для АВРов. Да и смысл вообще его использовать, если там просто функции, завернутые в namespac'ы ?
2. Чем не устроил make?
3. Почему Mercurial, почему не CVS, не Subversion ?

В, общем суть вопросов одна: зачем использовать инструменты, которые не распространены в среде тех, кто пишет для AVR? Ведь будет мало шансов, что кто-то присоединится, и много шансов что придется все тянуть одному, а это может привести и к смерти проекта, если вдруг сил не хватит.

Re: minibot-lib c/c++ lib

=DeaD= » 17 июл 2008, 18:00

blindman писал(а):1. Почему C++? Не очень популярный язык для АВРов. Да и смысл вообще его использовать, если там просто функции, завернутые в namespac'ы ?

А какие еще варианты? Чистый Си? WinAVR упомянутый очень распространен. Даже iRobot выбрала его для своего iRobot Create (очень к слову похожая концепция на минибота). Или есть какие-то объективные другие данные?

blindman писал(а):В, общем суть вопросов одна: зачем использовать инструменты, которые не распространены в среде тех, кто пишет для AVR? Ведь будет мало шансов, что кто-то присоединится, и много шансов что придется все тянуть одному, а это может привести и к смерти проекта, если вдруг сил не хватит.

Не "если вдруг", а одному 100% сил не хватит, да и смысла тогда нету.

Re: minibot-lib c/c++ lib

blindman » 17 июл 2008, 18:12

=DeaD= писал(а):А какие еще варианты? Чистый Си?

Да. А кое-где и ассемблер. БольшАя (если не бОльшая) часть библиотек - будет системное программирование в чистом виде.

=DeaD= писал(а):Не "если вдруг", а одному 100% сил не хватит, да и смысла тогда нету.

Тем более

Re: minibot-lib c/c++ lib

=DeaD= » 17 июл 2008, 19:32

blindman писал(а):
=DeaD= писал(а):А какие еще варианты? Чистый Си?

Да. А кое-где и ассемблер. БольшАя (если не бОльшая) часть библиотек - будет системное программирование в чистом виде.

Ну ассемблерные вставки нигде не запрещены, а вот WinAVR - всё-таки одна из самых-самых, так что не вижу особых проблем. Разумеется классы применять надо крайне осмотрительно, чай не 2Мб оперативки.

Re: minibot-lib c/c++ lib

blindman » 17 июл 2008, 19:38

=DeaD= писал(а):Разумеется классы применять надо крайне осмотрительно, чай не 2Мб оперативки.

Что-то никак не придумывается где вообще тут классы можно применить .

Re: minibot-lib c/c++ lib

=DeaD= » 17 июл 2008, 20:28

blindman писал(а):Что-то никак не придумывается где вообще тут классы можно применить .

Ну например карту (как минимум маяков, стен и зарядок) можно классом сделать, а внутри структуры данных связанные и методы к ним, чтобы никто своими ручками не испохабил структуры данных внутри.

Re: minibot-lib c/c++ lib

blindman » 17 июл 2008, 20:34

Возможно. Но это уже прикладная область. Я же говорю в первую очередь о взаимодействии с железом.

Re: minibot-lib c/c++ lib

=DeaD= » 17 июл 2008, 20:38

blindman писал(а):Возможно. Но это уже прикладная область. Я же говорю в первую очередь о взаимодействии с железом.

А вы это на разных языках писать будете? :wink:

Re: minibot-lib c/c++ lib

blindman » 17 июл 2008, 20:56

=DeaD= писал(а):Ну ассемблерные вставки нигде не запрещены, а вот WinAVR - всё-таки одна из самых-самых, <skip>

Предлагаю употреблять термин "avr-gcc"

Добавлено спустя 1 минуту 29 секунд:
=DeaD= писал(а):А вы это на разных языках писать будете? :wink:

Почему нет? Никаких проблем вызвать код на C из C++. А наооборот ?

Добавлено спустя 14 минут 14 секунд:
Попробую пояснить свою мысль.

Если мы используем код на C++ в низкоуровневых библиотеках, мы тем самым не оставляем выбора тем, кто их будет использовать. То есть или пиши на C++, или на C, но тогда уж сам. А эти фундаментальные библиотеки следует делать максимально доступными.

В прикладной области я в принципе не против использования C++. Но только там, где без этого безусловно не обойтись, и только для функций достаточно высокого уровня (критерий? хз. Интуиция :D ). То есть если ты уж влез в такие дебри, а сам писать не хочешь, будь добр принять то, что тебе предлагается :D

Re: minibot-lib c/c++ lib

=DeaD= » 17 июл 2008, 21:17

blindman писал(а):Если мы используем код на C++ в низкоуровневых библиотеках, мы тем самым не оставляем выбора тем, кто их будет использовать. То есть или пиши на C++, или на C, но тогда уж сам. А эти фундаментальные библиотеки следует делать максимально доступными.

Тут разумеется согласен - в 99% случаев функциональность си++ не нужна и нужно вписываться в чистый си.

Re: minibot-lib c/c++ lib

EdGull » 17 июл 2008, 21:28

кстати, а трудно вот этот код переделать под прием комманд с уарта и и2ц на воспроизведение указанных файлов?

Код: Выделить всёРазвернуть
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Project : PCM Player
Version : 0.0.0.6
Date    : 19.01.2006
Author  : Pavel Sirotkin
Mail to : pol_s@list.ru


Chip type       : ATmega32
Fuses Settings   : CKSEL = 1110, SUT = 01, CKOPT = 0
Program type    : Application
Clock frequency : 16,000000 MHz
Memory model    : Small
Heap         : 0x300
Data Stack      : 0x100
Return Stack   : 64
Compiler      : IAR EWAVR 4.12A
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/

#include "main.h"

// Заголовок WAV файла
typedef struct
{
   unsigned char id_riff[4];   // 4 byte
   unsigned long len_riff;      // 4 byte

   unsigned char id_chuck[4];   // 4 byte
   unsigned char fmt[4];      // 4 byte
   unsigned long len_chuck;   // 4 byte

   unsigned int  type;         // 2 byte
   unsigned int  channels;      // 2 byte
   unsigned long freq;         // 4 byte
   unsigned long bytes;      // 4 byte
   unsigned int  align;      // 2 byte
   unsigned int  bits;         // 2 byte

   unsigned char id_data[4];   // 4 byte
   unsigned long len_data;      // 4 byte
} TitleWave;// 44 byte

/*
---------------------------------------------------------------------------------------------
   Глобальные переменные
---------------------------------------------------------------------------------------------
*/
volatile unsigned char   data;
unsigned char         song;
unsigned char         play;
unsigned char         gotoNextSong;
__flash char         FileNames [10][11] =
{
   "muson01.wav","muson02.wav","muson03.wav","muson04.wav","muson05.wav",
   "muson06.wav","muson07.wav","muson08.wav","muson09.wav","muson10.wav"
};

/*
=============================================================================================
   Проверка заголовка WAV файла на соответсвие параметрам воспроизведения.
   Формат WAV файла должен быть:   PCM 8 бит 16000 КГц Моно.
=============================================================================================
*/
unsigned char WaveComp (char const __flash name[])
{
   //~~~~~~~~~~~~~
   FILE      *f;
   TitleWave   tw;
   //~~~~~~~~~~~~~

   f = fopenc(name,READ);
   if ( f==0 ) return (1);                           // Не открыть файл
   fread(&tw,sizeof(TitleWave),1,f);
   fclose(f);
   
   if ( strncmp_G(tw.id_riff,"RIFF",4) != 0 ) return (1);   // Не совпал идентификатор RIFF
   if ( strncmp_G(tw.id_chuck,"WAVE",4) != 0 ) return (1);   // Не совпал идентификатор CHUCK
   if ( strncmp_G(tw.fmt,"fmt ",4)!= 0 ) return (1);      // Не совпал идентификатор FMT
   if ( tw.type != 1 ) return (1);                     // Тип данных - не выборка
   if ( tw.channels != 1 ) return (1);                  // Не моно
   if ( tw.freq != 16000 ) return (1);                  // Не 16000 КГц
   if ( tw.bytes != 16000 ) return (1);
   if ( tw.bits != 8 ) return (1);                     // Не 8 бит
   if ( strncmp_G(tw.id_data,"data",4)!= 0 )return (1);   // Не совпал идентификатор DATA
   
   return (0);
}

/*
=============================================================================================
   MAIN.
=============================================================================================
*/
void main ()
{
   //~~~~~~~~~~
   FILE   *fp;
   //~~~~~~~~~~
   
   while (!initialize_media()){};
   
   PCMDDR = 0xFF;
   PCMPort = 0x00;
   
   PORTD_Bit2 = 1;
   PORTD_Bit3 = 1;
   
   // Sleep enable
   MCUCR |= (1 << SE);
   
   // External Interrupts enable
   GICR |= (1 << INT1)|(1 << INT0);
   
   SEI();
   
   
   while(1)
   {
      if (play)
      {
         GICR &= ~(1 << INT0);
         // Timer/Counter 0 initialization
         TCCR0 |= (1 << CS01);
         TCNT0 = 0x89;
         // Timer(s)/Counter(s) Interrupt(s) initialization
         TIMSK |= (1 << TOIE0);
         
         if (!WaveComp (FileNames[song]))
         {
            fp = fopenc(FileNames[song], READ);
            while ( ((fp -> position) < (fp -> length)) && !gotoNextSong )
            {
               data = fgetc(fp);
               SLEEP();
            };
            fclose(fp);
            if (!gotoNextSong) play = 0;
            gotoNextSong = 0;
         }
         else song = 0;
         
         // Stop Timer0
         TCCR0 &= ~(1 << CS01);
         TIMSK &= ~(1 << TOIE0);
         GICR |= (1 << INT0);
      }
      else SLEEP();
   };
}

/*
=============================================================================================
   Timer0 interrupt.
=============================================================================================
*/
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf (void)
{
   PCMPort = data;
   TCNT0 = 0x89;
}

/*
=============================================================================================
   External interrupt0.
=============================================================================================
*/
#pragma vector = INT0_vect
__interrupt void Int0_Isr (void)
{
   _delay_ms(1000);
   while (!PIND_Bit2){};
   play = 1;
}

/*
=============================================================================================
   External interrupt1.
=============================================================================================
*/
#pragma vector = INT1_vect
__interrupt void Int1_Isr (void)
{
   _delay_ms(1000);
   while (!PIND_Bit3){};
   gotoNextSong = 1;
   play  = 1;
   song++;
}



Re: minibot-lib c/c++ lib

=DeaD= » 17 июл 2008, 21:44

EdGull писал(а):кстати, а трудно вот этот код переделать под прием комманд с уарта и и2ц на воспроизведение указанных файлов?

Вообще вроде несложно, только я например на IAR не работал, но вот в этом блок всё проигрывается, надо только вместо FileNames[song] поставить имя файла нужное (ну и куски отвечающие за инициализацию не забыть):
Код: Выделить всёРазвернуть
         GICR &= ~(1 << INT0);
         // Timer/Counter 0 initialization
         TCCR0 |= (1 << CS01);
         TCNT0 = 0x89;
         // Timer(s)/Counter(s) Interrupt(s) initialization
         TIMSK |= (1 << TOIE0);
         
         if (!WaveComp (FileNames[song]))
         {
            fp = fopenc(FileNames[song], READ);
            while ( ((fp -> position) < (fp -> length)) && !gotoNextSong )
            {
               data = fgetc(fp);
               SLEEP();
            };
            fclose(fp);
         }
         else song = 0;
         
         // Stop Timer0
         TCCR0 &= ~(1 << CS01);
         TIMSK &= ~(1 << TOIE0);
         GICR |= (1 << INT0);


Rambler\'s Top100 Mail.ru counter