-
alman
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 263
-
Спасибо получено: 41
-
-
-
-
-
|
Leka пишет: В софт-процессоре ошибка оказалась - байтовые команды неправильно отрабатывались, поправил.
Сжатие "на лету" нулевых последовательностей заметно повышает скорость передачи битстрима, для почти пустого проекта - на порядок. Кодирование - при помощи esc-последовательностей, только в качестве префикса взял не <27>, а <121>.
<121><0...2> - аппаратное управление софт-процессором (загрузка программы, пуск-останов),
<121><3...251> - программное сжатие нулевых строк (>2 нулей подряд),
<121><252...254> - программное управление потоком (ПК <--> софт-процессор),
<121><255> - сам префикс <121>.
Конечно 121 лучше 27 - не конфликтует с уже существующими Esc-последовательностями.
Основная сложность - со стороны ПК(спасибо Wintel), не знаю, как проверять - поступили ли новые данные через виртуальный СОМ-порт, или нет. Это усложняет протокол взаймодействия с устройством.
А вот тут великолепная статья по работе с COM портом -
ru.wikibooks.org/wiki/COM-порт_в_Windows_(программирование)
Порт надо открывать вот так
CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
а проверять готовность данных с помощью WaitCommEvent и WaitForSingleObject
const int READ_TIME = 100;
OVERLAPPED sync = {0};
int reuslt = 0;
unsigned long wait = 0, read = 0, state = 0;
/* Создаем объект синхронизации */
sync.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
/* Устанавливаем маску на события порта */
if(SetCommMask(port->handle,EV_RXCHAR)) {
/* Связываем порт и объект синхронизации*/
WaitCommEvent(port, &state, &sync);
/* Начинаем ожидание данных*/
wait = WaitForSingleObject(sync.hEvent, READ_TIME);
/* Данные получены */
if(wait == WAIT_OBJECT_0) {
/* Начинаем чтение данных */
ReadFile(port, dst, size, &read, &sync);
/* Ждем завершения операции чтения */
wait = WaitForSingleObject(sync.hEvent, READ_TIME);
/* Если все успешно завершено, узнаем какой объем данных прочитан */
if(wait == WAIT_OBJECT_0)
if(GetOverlappedResult(port, &sync, &read, FALSE))
reuslt = read;
}
}
CloseHandle(sync.hEvent);
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
У меня проблемы возникли только с виртуальным COM-портом Bluetooth. С другими (GSM-модем/FTDI/...) проблем не было. Мне достаточно, чтобы ReadFile() немедленно возвращала управление с нулевым счетчиком, если нет новых данных. Для этого запускал один раз(после загрузки ОС) отдельную прогу на Си с SetCommTimeouts(), которая устанавливала нужный режим. Дальше можно было другие проги хоть на Паскале писать/запускать. С Bluetooth так не получилось...
Сейчас попробовал заново, и увидел, что перед CloseHandle() нужно делать большую задержку (~1сек, или ждать нажатия клавиши). Тогда все работает. Выход без задержки приводит к тому, что все последующие вызовы CreateFile() дают ошибку - пока не будет перезагружено slave-bluetooth устройство выключением-включением питания. Почему так, и как сбросить ошибку без сброса питания slave-устройства, не знаю.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Хотел сделать рефакторинг, а в результате полностью все переделал.
Раньше был упор на "Си как HDL", сейчас - на "Verilog без always".
Синтаксис совпадает с Верилогом, но отсутствует деление кода на блоки always@(*) и always@(posedge clk) - "провода" и "триггеры" различаются по объявлениям переменных.
Попробовал перевести в свой HDL свою самую простую программу рисования, написанную на Си с использованием библиотеки glut: на экране прямоугольник, мышкой можно перетаскивать по экрану и менять размеры.
Исходная программа на Си: исходник ~100 строк, exe ~60КБ (про Windows и тп не забываем).
Код на HDL: исходник ~100 строк топ-модуль (код аналогичен коду на Си), в отдельных модулях: ~30 строк VGA и ~120 строк USB-мышка. Все синтезируется в ~1100 ЛЕ.
Потренируюсь на простых примерах, потом буду переводить в HDL "2D физику".
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
Время создания страницы: 0.121 секунд