Перейти к содержанию
    

Silabs IDE + SDCC

Кому приходилось совместить?

Программирую микропроцессоры 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 */

}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там в доке неточности, надо __interrupt

а они на одних архитектурах так, на других - эдак...

И using() не указали вектор. В общем, RTFM еще раз.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, так и оказалось, __interrupt работает. Где бы почитать RTFM?

TFM, который надо R, находится в инсталляхе SDCC, либо из их снапшота здесь

Более "правильного", увы, не существует. :( Только метод научного тыка.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ссылки. Уже смотрел, но это надолго :-(

Проект надо делать сейчас.

Докладаю для тех, кто еще не пробовал. В оболочке silabs IDE есть настройки для разных компиляторов (в том числе и для SDCC). А в примерах для микропроцессоров silabs есть варианты построения так же для разных компиляторов. В этих примерах основные отличия можно посмотреть ( до изучения полной документации). У меня, спасибо, все заработало. Для меня описания стандартных (почти) определений и библиотечных функций в компиляторе Keil намного привычнее (например битовые переменные), поэтому для скорости работаю в другой конфигурации - Компилятор Keil с таблеткой. Но обязательно перейду на SDCC (чуть попозже).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...