Jump to content
    

Избыточное кодирование

Есть возможность передавать данные в одну сторону по цифровому каналу связи, есть возможность увеличить объем данных для восстановления возможных ошибок передачи. Какие алгоритмы можно применить?

 

Передаётся прошивка объёмом ~100Кб. Нужна устойчивость к потере до ~50% передаваемых данных. Объем передаваемых данных можно увеличить в 2-3 раза. Передача байтовый поток, либо блоками по ~64-бит с контрольной суммой каждый. У меня хватает фантазии только на передачу блоков в псевдослучайном порядке каждый по три раза.

 

Канал связи например USART или CAN.

Edited by amaora

Share this post


Link to post
Share on other sites

А я бы смотрел на задачу чуть иначе: сколько у вас памяти свободной для приёма прошивки И какой интервал времени вы готовы на это отвести?

Если обновляете "на лету", поблочно - это одно, если сперва скачиваете в память и проверяете всю прошивку на достоверность/целостность по неким критериям - это другое.
В первом случае надёжнее принять три раза некий объём информации и только потом обновлять этот блок в flash.
А второй случай как бы и не требует увеличения передаваемых данных в несколько раз.
 

Share this post


Link to post
Share on other sites

2 часа назад, amaora сказал:

Есть возможность передавать данные в одну сторону по цифровому каналу связи, есть возможность увеличить объем данных для восстановления возможных ошибок передачи. Какие алгоритмы можно применить?

CAN - это разве "в одну сторону"? Или что вы под этим имеете в виду?

2 часа назад, amaora сказал:

Канал связи например USART или CAN.

Не очень понятно зачем какой-то "псевдослучайный порядок"?.. :wacko2:  Порядок чего? И зачем?

И зачем вообще для USART такая избыточность? Почему у вас в нём происходят такие страшные потери (50%!) ??

Да и для CAN - тем более.

PS: имхо - обычной CRC32 на всю прошивку вполне достаточно. Ну или хеш какой-нить.

Share this post


Link to post
Share on other sites

2 часа назад, amaora сказал:

Нужна устойчивость к потере до ~50% передаваемых данных.

Вместо примитивных контрольных сумм передавать коды, восстанавливающие ошибки. Гуглите, изучайте.

Потеря 50% данных - откуда такой критерий: канал связи просчитывался?

Share this post


Link to post
Share on other sites

Протокол с подтверждения хочется избежать, может быть много приёмников одновременно, массовая рассылка. Памяти RAM под всю прошивку нет.

 

1 minute ago, jcxz said:

PS: имхо - обычной CRC32 на всю прошивку вполне достаточно. Ну или хеш какой-нить.

 Это есть, надо немного надёжнее, особенно при передаче по UART, избежать окирпичивания из-за битых блоков/байтов.

Share this post


Link to post
Share on other sites

пользуйте код Хемминга. Если памяти достаточно - восстановление через таблицу.

Share this post


Link to post
Share on other sites

Just now, V_G said:

Потеря 50% данных - откуда такой критерий: канал связи просчитывался?

По времени передачи, могу позволить длиться этому процессу в 2-3 раза дольше.

Share this post


Link to post
Share on other sites

Что за USART такой с 50% потерями??? Если такое происходит, надо разбираться со схемотехникой и исправлять. А не костыли ваять.

Share this post


Link to post
Share on other sites

а классику нельзя реализовать?
Сперва грузить новую прошивку в flash, перезапуск, загрузчик проверяет: если данные в этой области достоверны, то грузит с неё, иначе - идёт на прошлую прошивку и в ней работает.

Share this post


Link to post
Share on other sites

Just now, jcxz said:

Что за USART такой с 50% потерями??? Если такое происходит, надо разбираться со схемотехникой и исправлять. А не костыли ваять.

ТАКОЕ может случиться разве что в радиоканале. Ну, еще на CD :)

 

Share this post


Link to post
Share on other sites

Только что, k155la3 сказал:

разве что в радиоканале

и то, не всегда. У меня и не такое жило в радиоканале))

Share this post


Link to post
Share on other sites

2 минуты назад, amaora сказал:

Это есть, надо немного надёжнее, особенно при передаче по UART, избежать окирпичивания из-за битых блоков/байтов.

А как это "окирпичивание' может произойти? Боитесь что CRC32 случайно сойдётся?  :biggrin:

Ну тогда используйте Hash256, он точно никогда не совпадёт на мусоре.

2 минуты назад, k155la3 сказал:

ТАКОЕ может случиться разве что в радиоканале. Ну, еще на CD :)

Причём тут радиоканал, если ТС пишет про UART и CAN?  Перечитайте исходный пост.

Share this post


Link to post
Share on other sites

2 minutes ago, aleksandr-zh said:

Сперва грузить новую прошивку в flash, перезапуск, загрузчик проверяет: если данные в этой области достоверны, то грузит с неё, иначе - идёт на прошлую прошивку и в ней работает.

Можно, было подобное, теперь нет достаточно flash памяти на две копии.

 

1 minute ago, jcxz said:

А как это "окирпичивание' может произойти? Боитесь что CRC32 случайно сойдётся?

Протокол без обратной связи, без запроса повторной пересылки, один байт потеряется/побъется и да, CRC32 не сойдется.

Share this post


Link to post
Share on other sites

3 minutes ago, jcxz said:

. . . Причём тут радиоканал, если ТС пишет про UART и CAN?  Перечитайте исходный пост.

>>  Передача байтовый поток, либо блоками по ~64-бит с контрольной суммой каждый.

ну, вот этот тезис наводит на мысли. 64 байта как буфер RF-трансивера.  ТС же кодируется что у него в качестве среды передачи. То-ли физпара с помехами то-ли еще что.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...