Код:
USART1->DR = *tx_buffer++;
if (--tx_size == 0) {
USART1->CR1 &= ~USART1_TXEIE; // Disable TXE interrupt
USART1->CR1 |= USART1_TCIE; // Enable TC interrupt
}
Код кривой.
неоч понятно, чем кривой код?
Не то что бы я большой спец по сям, но конкретно с этими ++ и -- уже вроде б разобрался... Оно эквивалентно:
Код:
USART1->DR = *tx_buffer;
tx_buffer++;
tx_size--;
if (tx_size == 0) {
USART1->CR1 &= ~USART1_TXEIE; // Disable TXE interrupt
USART1->CR1 |= USART1_TCIE; // Enable TC interrupt
}
Вообще, конечн, я оч не приветствую совмещение ++/-- с другими операндами. Именно из-за этой путаницы, когда сначала выполняется действие ++/--, а потом возвращается результат, а когда наоборот - возвращается результат, предшествующий этим операндам. Оно конечно там условно логично, но читаемость кода сильно лагает. Экономия строки тут на пользу не идёт.
Тут настройка прерываний выполняется после передачи крайнего байта. И типа есть вероятность ну успеть отключить прерывание до его следующего срабатывания. Но полагаю, что это возможно только на очень низких частотах проца и на высоких частотах UART, что кажется редкодостижимо. Но в таком виде имхо несколько привычнее читается, чем конструкции с проверкой предпоследнего байта.
Добавлено after 1 minute 10 seconds:Не крайнего, а последнего! Не нужно людей в заблуждение вводить!
я авиатор, я так вижу