Цитата(Aprox @ Apr 19 2012, 14:35)

Ну, а как вы оцениваете на "современность" недавне появление DMA у периферии?
Вы знаете — ну прекрасно отношусь!
Только давайте уточним, что опять имеется ввиду под «современностью» и что означает «недавнее» —
Десять лет (MSP430x15x/16x)?
Пятнадцать-двадцать (M16C, Fujitsu MB90).
Или все двадцать-двадцать пять? PTS (Peripheral Transaction Service) в однокристалках Intel MCS196 (оно и в MCS96 было, но я с ними не работал совсем) был таким хитрым DMA, который при разрешении отрабатывал по тому же запросу, что запрос прерывания, т.е. специальной линии запроса DMA не было, но при разрешении PTS оно перехватывал прерывание на себя, делал пересылку. Когда его задание заканчивалось — он просто переставал перехватывать прерывание на себя и отрабатывал назначенный обработчик.
Или ещё больше — в многокристальных микропроцессорных комплектах, например, КПДП 580ВТ37 aka i8237, перекочевавший позже внутрь чипа в контроллеры на базе i186 и в материнки IBM PC.
Цитата(Aprox @ Apr 19 2012, 14:35)

Я-то не боюсь. Потому, что прерывание вырабатывается UART-ом не по фиксированному кол-ву принятых символов, а по time-out в конце непрерывной посылки. Фактическое число принятых символов можно посмотреть потом в контроллере DMA.
И какой смысл пересылать по одному байту через DMA, чтобы потом по таймауту узнать, что это был один байт?
Цитата(Aprox @ Apr 19 2012, 15:57)

Цитата(ReAl @ Apr 19 2012, 00:22)
Естественно, нестатический метод обработчиком не поставить.
Отчего же? Что нам мешает динамически изменять вектора в контроллере прерываний?
Кгм... Вы имеете понятие о разнице между свободной функцией либо статической функцией-членом класса и нестатической функцией-членом? О неявной передаче указателя this? Что указатель на свободную функцию/статический метод и на функцию-член имеют разные размеры (указатель на нестатический член класса — целая структура из нескольких полей)?
Что аппаратура контроллера по вектору может только вызвать функцию void (*)(void), но не может передать ей указатель на экземпляр класса?
Мдааа.... Я начинаю уставать.....
Цитата(Aprox @ Apr 19 2012, 15:57)

Дело же в другом- ISR должна быть оформлена по другому, не как обычные процедуры и функции.
Несомненно. Для
устаревших контроллеров. Для
современных Cortex-ов это не так — Вы что, действительно этого не знаете?!!
Но и для
устаревших контроллеров некоторые компиляторы поддерживают назначение статических методов класса на вектора, так как указатель на статический метод по форме не отличается от указателя на С-функцию, а их компиляторы умеют оформлять как обработчкик прерываний (это IAR для AVR):
Код
class uart_t
{
public:
...
private:
...
#pragma vector = USART_RXC_vect
static __interrupt void RxHandler(void);
#pragma vector = USART_UDRE_vect
static __interrupt void TxHandler(void);
}
Цитата(Aprox @ Apr 19 2012, 15:57)

Вполне достаточно, чтобы понять- методы в классах нельзя назначать как ISR. В принципе нельзя, независимо от возможностей компилятора.
Вы бы таки сходили по предложенным ссылкам. И подумали о различии статических и нестатических функций-членов. Потом говорили бі «невозможно» по поводу того, что работает (цитаты кода из так и непросмотренных Вами ссылок).
Код
#pragma vector = USART1TX_VECTOR
__interrupt void TUART::TxBUF_Empty_ISR()
{
U1TXBUF = TxBuf.pop();
if(TxBuf.get_count() == 0) DisableTxInt();
}
CODE
class TUart1 : public TCustomUart
{
public:
TUart1(uint32_t baudrate) {hw_init(baudrate);}
protected:
...
virtual void hw_init(uint32_t baudrate);
virtual void write_tx_reg(char ch) { TXBUF0 = ch; }
static interrupt(UART0RX_VECTOR) usart0_rx(void);
static interrupt(UART0TX_VECTOR) usart0_tx(void);
};
...
interrupt(UART0TX_VECTOR) TUart1::usart0_tx(void)
{
OS::TISRW ISR;
char ch;
if (Uart1.TxChannel.get_count())
{
Uart1.TxChannel.pop(ch);
TXBUF0 = ch;
}
else
{
Uart1.tx_active = false;
}
}
Цитата(Aprox @ Apr 19 2012, 15:57)

Что же касается вызвать метод класса из настоящей ISR, то последняя должна размещаться в программном модуле, тоже написанном на С++. И вот, я действительно не знаю- есть ли в компиляторе С++, например IAR,
Ну я опять Вас отправлю
к моему сообщению с кусокм кода, про который Вы написали «коды skipped».
Там это было продемонстрировано для avr-gcc в виде модификации main.cpp из одного из примеров scmRTOS. В C++ файле свободная функция - обработчик прерывания, которая объявлена другом класса и вызывает приватный нестатический метод класса.
И там же я написал, что всё было проверено в железе. Т.е. я и так был уверен. что всё работает, но, как обычно, не хотел выкладывать код с возможными описками.
В примерх scmRTOS обработчики прерываний сидят себе в main.cpp, обработчик системного таймера — в OS_Target_cpp.cpp и всё работет.
IAR же вообще позволяет прямо в описании класса непосредственно статический метод объявить обработчиком, ссылки на примеры по форуму я Вам тоже уже давал.
Так Вы и исходники scmRTOS не смотрели перед тем, как, извините, трындеть тут?
Господи, я думал, Вы хоть язык С++ да его компиляторы знаете... Так же ж страдали за поддержку возможностей языка
современными микроконтроллерами...
Цитата(AHTOXA @ Apr 19 2012, 17:05)

Господа, мы кормим тролля. Ему абсолютно до лампочки все объяснения, его невозможно в чём-то убедить.
Согласен.
Убедить можно того, кто
что-то по теме знает и готов слушать.