Проблема заключается в следующем :
Необходимо за 100 тактов таймера частотой Fosc/8 = 7.373/8 Mhz = 921.5 Khz выести через USART минимум 10 байт данных. Лучше даже 15.
Есть следующая функция, написанная на IAR C 3.11 :
Код
void MA_PutCharCh0_USART( unsigned char Data )
{
/*--- Wait for USART data register empty ---*/
while( !(UCSR0A & __BIT_MASK( UDRE0 ) ) )
{
/*--- Do nothing ---*/
;
}
/*--- Send a character ---*/
UDR0 = Data;
} /* MA_PutCharCh0_USART */
{
/*--- Wait for USART data register empty ---*/
while( !(UCSR0A & __BIT_MASK( UDRE0 ) ) )
{
/*--- Do nothing ---*/
;
}
/*--- Send a character ---*/
UDR0 = Data;
} /* MA_PutCharCh0_USART */
Очень много теряется на ожидание - я успеваю в этом случае выводить только 2 байта данных.
Я пробовал организовать очередь вывода через линейный однонаправленный список - но здесь нет шансов. Функция malloc(..) выполняется очень долго.
Думаю что алгоритм должен быть таким :
1. Занести данные в очередь вывода
2. Если не установлен UDRE0, выйти из процедуры, иначе занести данные в UDR0 и удалить их из буффера
Все это нужно повторять как-то циклически, причем параллельно с программой прерывания...
Может можно организовать очередь вывода на ASMе без использования динамической памяти?
И как тогда запараллелить с прерыванием вывод данных из очереди в USART ?
Уже второй день не могу придумать как это реализовать в IAR C.
Сейчас MA_PutCharCh0_USART() вызывается в теле прерывания всего два раза
