UART. Вопросы и ответы 01. #9

Open
opened 2023-11-08 08:14:17 +00:00 by stud126186 · 9 comments
Owner

#include <stdio.h>

Что значат эти includes, зачем каждая нужна?

#define BUFFER_SIZE 32

на сколько можно увеличить и уменьшить размер буфера? Могу ли увеличить размер на 1, на 2, уменьшить на 1, 2, 10? Почему?

UART/main.c Line 43 in e6a1ad36c2
int get_char(unsigned char* sym) {

Warning

UART/main.c Line 60 in e6a1ad36c2
int UART_receive(uint8_t* data, size_t length) {

Какие параметры функции? Что вообще ждать от функции? Нужна ли она вообще?

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/e6a1ad36c216a074f5b5ca87c20692255a0ef8f8/UART/circular_buf.c#L1 Что значат эти includes, зачем каждая нужна? https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/e6a1ad36c216a074f5b5ca87c20692255a0ef8f8/UART/circular_buf.h#L4 на сколько можно увеличить и уменьшить размер буфера? Могу ли увеличить размер на 1, на 2, уменьшить на 1, 2, 10? Почему? https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/e6a1ad36c216a074f5b5ca87c20692255a0ef8f8/UART/main.c#L43 Warning https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/e6a1ad36c216a074f5b5ca87c20692255a0ef8f8/UART/main.c#L60 Какие параметры функции? Что вообще ждать от функции? Нужна ли она вообще?
stud126165 was assigned by stud126186 2023-11-08 08:14:17 +00:00
Owner

Что значат эти includes, зачем каждая нужна?
#include <stdio.h> подключаем заголовочный файл, который содержит функции ввода-вывода.
#include <stdlib.h> заголовок (заголовочный файл) стандартной библиотеки общего назначения языка Си,
который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие.
#include "circular_buf.h" подключаем заголовочный файл кольцевого буфера.
На сколько можно увеличить и уменьшить размер буфера? Могу ли увеличить размер на 1, на 2, уменьшить на 1, 2, 10? Почему?
В зависимости от передаваемого пакета чуть больше
максимума приема, размер должен быть степенью двойки.
2, 4, 8, 16, 32, 64, 128, 256.
По функции UART_receive, я добавил более подробные комментарии к коду. Она будет использоваться в главной программе для получения данных из буфера приема. Пока мы еще решаем вопрос с объединением вместе всех модулей.

Что значат эти includes, зачем каждая нужна? #include <stdio.h> подключаем заголовочный файл, который содержит функции ввода-вывода. #include <stdlib.h> заголовок (заголовочный файл) стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие. #include "circular_buf.h" подключаем заголовочный файл кольцевого буфера. На сколько можно увеличить и уменьшить размер буфера? Могу ли увеличить размер на 1, на 2, уменьшить на 1, 2, 10? Почему? В зависимости от передаваемого пакета чуть больше максимума приема, размер должен быть степенью двойки. 2, 4, 8, 16, 32, 64, 128, 256. По функции UART_receive, я добавил более подробные комментарии к коду. Она будет использоваться в главной программе для получения данных из буфера приема. Пока мы еще решаем вопрос с объединением вместе всех модулей.
Owner

UART/uart.h Line 10 in 80cd73c3d6
struct circular_buffer usartRxBuffer;

Зачем в заголовочнике объявлять экземпляры структуры? Каждый раз, когда вы напишите #include "uart.h" у вас будет объявлены переменные (экземпляры).

Вижу usartTxBuffer встречается по коду только 3 раза. Оно вообще зачем?

Вы вообще собрали проект? Для проверки достаточно собрать и запустить проект только со своим модулем UART. Например сделать main, который будет отправлять все полученные байты обратно. Это очень простая и эффективная проверка работы любого интерфейса.

UART/uart.c Line 34 in 80cd73c3d6
while(1)

Вам тут таймаут на приём вообще зачем? Чего вы ждёте? Вам нужно получить все байты из UART и отдать их по первому требованию быстро без тормозов.

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/80cd73c3d606748e33223f0ac6a83ff285cbcbe5/UART/uart.h#L10 Зачем в заголовочнике объявлять экземпляры структуры? Каждый раз, когда вы напишите #include "uart.h" у вас будет объявлены переменные (экземпляры). Вижу `usartTxBuffer` встречается по коду только 3 раза. Оно вообще зачем? Вы вообще собрали проект? Для проверки достаточно собрать и запустить проект только со своим модулем UART. Например сделать main, который будет отправлять все полученные байты обратно. Это очень простая и эффективная проверка работы любого интерфейса. https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/80cd73c3d606748e33223f0ac6a83ff285cbcbe5/UART/uart.c#L34 Вам тут таймаут на приём вообще зачем? Чего вы ждёте? Вам нужно получить все байты из UART и отдать их по первому требованию быстро без тормозов.
Owner

Учел ваши замечания, убрал таймаут и поправил метод приема. Собрал проект с тестированием методов приема и отправки в Atmel с debug, ошибок не увидел.

Учел ваши замечания, убрал таймаут и поправил метод приема. Собрал проект с тестированием методов приема и отправки в Atmel с debug, ошибок не увидел.
Owner

Прошу указывать коммит, где вы учли замечания. Так понимаю это 5c4e2be040

В итоге теперь отправка стала синхронная: пока отправляются байты мы ничем другим заниматься не можем. У нас только входящие байты в UART поступают во входящий кольцевой буфер.

Нужно было доделать отправку данных из исходящего кольцевого буфера. То есть укладываем данные в кольцевой буфер на отправку, включаем прерывание блока UART на прерывание и уже в прерывании достаём следующий байт из кольцевого буфера. Так реализован Serial в Arduino. Вам осталось написать обработчик прерывания и немного UART_send.

Прошу указывать коммит, где вы учли замечания. Так понимаю это 5c4e2be040adc2b1ab081be1011043e9fa4b1537 В итоге теперь отправка стала синхронная: пока отправляются байты мы ничем другим заниматься не можем. У нас только входящие байты в UART поступают во входящий кольцевой буфер. Нужно было доделать отправку данных из исходящего кольцевого буфера. То есть укладываем данные в кольцевой буфер на отправку, включаем прерывание блока UART на прерывание и уже в прерывании достаём следующий байт из кольцевого буфера. Так реализован Serial в Arduino. Вам осталось написать обработчик прерывания и немного `UART_send`.
Owner

Хорошо, сейчас займусь этим

Хорошо, сейчас займусь этим
Owner

458b145297 поправил UART_send и настроил обработчик

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/458b145297e5cec1e133969a6995d4aca7fab6e8 поправил UART_send и настроил обработчик
Owner

69e8412315 Забыл вчера бит TXCIE0 разрешения прерывания при передаче установить в 1, поправил

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/69e84123150eec148d9d9a81bb49ab71c761efe0 Забыл вчера бит TXCIE0 разрешения прерывания при передаче установить в 1, поправил
Owner

Верное направление. Одно но. При таком подходе вы как только выйдите из USART_TX_vect при пустом буфере тут же попадёте в USART_TX_vect. TXCIE0 именно разрешает прерывание по завершению передачи. При пустом буфере надо запретить. А разрешить когда - вам на подумать.

https://onlinedocs.microchip.com/pr/GUID-85E9B23E-BE9C-47EA-AED9-E8719EA2F7AF-en-US-2/GUID-73CB1E14-0C43-4A15-AA94-3D8AF6E17C6A.html

Верное направление. Одно но. При таком подходе вы как только выйдите из `USART_TX_vect` при пустом буфере тут же попадёте в `USART_TX_vect`. `TXCIE0` именно разрешает прерывание по завершению передачи. При пустом буфере надо запретить. А разрешить когда - вам на подумать. https://onlinedocs.microchip.com/pr/GUID-85E9B23E-BE9C-47EA-AED9-E8719EA2F7AF-en-US-2/GUID-73CB1E14-0C43-4A15-AA94-3D8AF6E17C6A.html
Owner

e999651e09 исправил этот момент

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/e999651e09a9e9f9eb71c56ddd7326b00db76d2b исправил этот момент
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: ICS-Microprocessor-2020/Display_Avr_3#9
No description provided.