serg_vnovg 0 15 августа, 2012 Опубликовано 15 августа, 2012 · Жалоба Кому приходилось совместить? Программирую микропроцессоры silabs C8051F320 в Silabs IDE. Свободное программное обеспечение. Пока проект был небольшой, все хорошо. Начал более серьезный проект на этом процессоре и столкнулся с проблемой ограничения размера кода. Почитав умных людей решил подключить бесплатный компилчтор SDCC в оболочку прграммирования. Все включилось сразу, но не работает. Подробнее: Тестовый проект (при подключении ограниченого Keil в IDE) #include "hard.h" #include "proc.h" sfr16 TMR2RL = 0xca; // Timer2 reload value sfr16 TMR2 = 0xcc; // Timer2 counter #define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz void SYSCLK_Init (void); void PORT_Init (void); void Timer2_Init (void); void Timer2_ISR (void); void init (void) { // disable watchdog timer PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) SYSCLK_Init (); // Initialize system clock to // 24.5MHz PORT_Init (); // Initialize crossbar and GPIO Timer2_Init (); // Init Timer2 EA = 1; // enable global interrupts } void SYSCLK_Init (void) { OSCICN = 0x80; // 1,5ÌÃö (SYSCLK) RSTSRC = 0x04; // Ñáðîñ ïðîöåññîðà ïðè îòñóòñòâèè òàêòîâîé ÷àñòîòû } void PORT_Init (void) { XBR1 = 0xC0; // Enable crossbar and weak pull-ups } void Timer2_Init (void) { unsigned int per = 1250; // 1 òàêò = 1,5ÌÃö/12 = 125 000 Ãö (100 ãö) TMR2CN = 0x00; // Stop Timer2; Clear TF2; // use SYSCLK/12 as timebase CKCON &= ~0x30; // Timer2 clocked based on T2XCLK; TMR2RL = -per; // Init reload values TMR2 = 0xffff; // set to reload immediately ET2 = 1; // enable Timer2 interrupts TR2 = 1; // start Timer2 } void Timer2_ISR (void) interrupt 5 { TF2H = 0; // clear Timer2 interrupt flag } Компилирует без ошибок. Тот же проект SDCC компилятор генерит ошибку Hard.c:58: syntax error: token -> 'interrupt' ; В документации на компилятор: /* External Interrupt 0 */ void external0_ISR(void) interrupt 0 { P3_1 = 0; /* change state of PIO 3, bit 1 */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 15 августа, 2012 Опубликовано 15 августа, 2012 (изменено) · Жалоба Там в доке неточности, надо __interrupt а они на одних архитектурах так, на других - эдак... И using() не указали вектор. В общем, RTFM еще раз. Изменено 15 августа, 2012 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_vnovg 0 15 августа, 2012 Опубликовано 15 августа, 2012 · Жалоба Спасибо! вечером попробую. Using() это для банка памяти. В silabs нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_vnovg 0 15 августа, 2012 Опубликовано 15 августа, 2012 · Жалоба Да, так и оказалось, __interrupt работает. Где бы почитать RTFM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 16 августа, 2012 Опубликовано 16 августа, 2012 · Жалоба Да, так и оказалось, __interrupt работает. Где бы почитать RTFM? TFM, который надо R, находится в инсталляхе SDCC, либо из их снапшота здесь Более "правильного", увы, не существует. :( Только метод научного тыка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_vnovg 0 17 августа, 2012 Опубликовано 17 августа, 2012 · Жалоба Спасибо за ссылки. Уже смотрел, но это надолго :-( Проект надо делать сейчас. Докладаю для тех, кто еще не пробовал. В оболочке silabs IDE есть настройки для разных компиляторов (в том числе и для SDCC). А в примерах для микропроцессоров silabs есть варианты построения так же для разных компиляторов. В этих примерах основные отличия можно посмотреть ( до изучения полной документации). У меня, спасибо, все заработало. Для меня описания стандартных (почти) определений и библиотечных функций в компиляторе Keil намного привычнее (например битовые переменные), поэтому для скорости работаю в другой конфигурации - Компилятор Keil с таблеткой. Но обязательно перейду на SDCC (чуть попозже). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться