СПОСОБ ПЕРЕДАЧИ ПРОГРАММНЫХ КОДОВ В ПАМЯТЬ ПРИБОРА УПРАВЛЕНИЯ, В ЧАСТНОСТИ, АВТОМОБИЛЕЙ
METHOD OF TRANSMITTING PROGRAMME CODES TO MEMORY OF CONTROL DEVICE, PARTICULARLY FOR MOTOR VEHICLES

Изобретение относится к способу передачи программных кодов в память прибора управления согласно ограничительной части пункта 1 формулы изобретения. Такой способ известен из DE 10 2006 016 891 А1.
В современных автомобилях используется один или несколько электронных приборов управления с программной памятью, которая в смонтированном состоянии прибора управления может программироваться, т. е.  может быть описана  с помощью программных кодов. Программная память представляет собой обычно так называемое ЭСППЗУ с быстрым стиранием, которое часто встраивается также в  микроконтроллер.
Традиционные приборы управления  содержат интерфейс, называемый также диагностическим интерфейсом, используемый для передачи команд и данных. В качестве интерфейса  часто применяется  шина CAN. Обычным диагностическим протоколом служит UDS согласно стандарту ИСО 14229. Он упомянут здесь только в качестве примера, так как существует  множество других интерфейсов и протоколов.
В большинстве случаев в приборе управления  содержится также  диагностическое программное обеспечение, которое через диагностический интерфейс вырабатывает команды на стирание  и программирование программной памяти.  Такое программное обеспечение часто именуется «загрузчиком операционной системы».
Для связи с прибором управления  используется программирующее устройство, содержащее необходимую ответную часть для диагностического интерфейса  прибора управления. Такое программирующее устройство часто называется также диагностическим прибором или диагностическим тестером. На практике  такое программирующее устройство представляет собой  часто персональный компьютер, например  портативную ПЭВМ.
В процессе программирования приборов управления передаются очень большие объёмы данных, касающихся программных кодов, для чего требуются очень большие затраты времени при использовании современных способов. Применяемые в автомобилях приборы управления  часто являются универсальными, которые при изготовлении автомобиля индивидуально программируются под соответствующий автомобиль. Поэтому требуемое время для программирования прибора управления при изготовлении автомобиля представляет собой критический фактор и должно быть по возможности коротким.
Также и при эксплуатации автомобиля приходится  на практике вносить изменения (так называемый “Upgrades” - наращивание вычислительных возможностей) в программное обеспечение, что обычно осуществляется в мастерской. В этом случае продолжительность времени перепрограммирования прибора управления должно быть по возможности коротким.
В указанном выше DE 10 2006 016 891 А1 описано последующее изменение  программного обеспечения для прибора управления, при этом различают между серийным программным обеспечением и «загрузочным» программным обеспечением (Upload-Software). В целях снижения затрат при дополнительной загрузке загрузочного программного обеспечения здесь предложено предусмотреть наличие двух раздельных областей памяти, а именно одну для серийного программного обеспечения и вторую для загрузочного программного обеспечения. В таком случае для расширения функциональности  прибора управления необходимо передать в раздельную область памяти лишь загрузочное программное обеспечение, а не целиком всё программное обеспечение.
Однако в результате этого при первичном программировании  прибора преимущества не достигаются.
Задачей настоящего изобретения является усовершенствование способа названного выше типа настолько, чтобы обеспечивалось существенное сокращение продолжительности времени, необходимого для передачи программных кодов в память прибора управления.
Указанная задача решается посредством признаков, приведённых в пункте 1 формулы изобретения. Оптимальные варианты выполнения, а также варианты развития изобретения указаны в зависимых пунктах формулы изобретения.
Основной замысел настоящего изобретения заключается в том, чтобы перед записью программных кодов в память прибора управления все ячейки памяти были приведены к стандартному значению (default - значению по умолчанию), затем для программных кодов, передаваемых программирующим устройством, применили в этом устройстве  способ упаковки данных без потерь, предпочтительно в соответствии с кодом Хаффмана,
после этого упакованные программные коды  были переданы в прибор управления,
затем программные коды были распакованы в  приборе управления и
наконец  упакованные программные коды были переведены в память прибора управления.
В результате приведения всех ячеек памяти к стандартному значению гарантируется отсутствие в памяти ошибочного программного кода. Вследствие передачи упакованных программных кодов существенно снижается объём передаваемых данных и, следовательно,  значительно сокращается продолжительность передачи. Благодаря применению  способа упаковки данных без потерь обеспечивается сохранность данных. Для упаковки и распаковки предпочтительно применять  кодирование Хаффмана, при котором достигается высокий коэффициент упаковки.
Согласно оптимальному варианту развития изобретения во время приведения всех ячеек памяти к стандартному значению последнее выбирается с таким расчётом, чтобы в нём содержался недействительный программный код (так называемый некорректный код операции - illegal Opcode). Во многих микропроцессорах это значение заложено в память микропроцессора. Однако в зависимости от применяемого микропроцессора или применяемого языка программирования им может быть и другое значение, которое в этом случае на фазе инициализации перед передачей программных кодов передаётся программирующим устройством в прибор управления.
Согласно одному из вариантов выполнения изобретения возможно передавать всё содержание  памяти прибора управления с программирующего устройства на прибор управления, т. е. также и содержание неиспользованных ячеек памяти. Правда предпочтительно, чтобы передавались только  необходимые программные коды, так как неиспользованные ячейки памяти или неиспользованные адресные области предварительно занимаются стандартным значением.  В результате  передаваемый объём данных дополнительно сокращается.
Ниже изобретение подробнее поясняется с помощью примера выполнения. При этом изображено:
фиг. 1 - принципиальная блок-схема прибора управления и программирующего устройства;
фиг. 2 - структурная схема технологических операций, осуществляемых согласно изобретению;
фиг. 3а - изображение отдельных операций, необходимых для
фиг. 3b - упаковки данных;
фиг. 4 - изображение технологических операций упаковки данных посредством вспомогательного вектора;
фиг. 5 - изображение декодирующего дерева.
Электронный прибор 1 управления на фиг. 1, обозначенный как ECU (Electronic control unit), содержит программную память 2,  выполненную в виде стираемой и записываемой памяти.  Прибор 1 управления может быть подсоединён через интерфейс 3 к программирующему устройству 4, которым может служить, например, персональный компьютер, такой как  портативный компьютер. В памяти программирующего устройства 4 хранятся  программные коды, подлежащие передаче через интерфейс 3 в прибор 1 управления. Программные коды содержатся, как правило,  в виде двоичных или шестнадцатиричных файлов.
«Программирование» прибора 1 управления производится в результате того,  что программные коды передаются из программирующего устройства 4 на блок 1 управления и хранятся здесь в программной памяти 2.
До настоящего времени программирование или перепрограммирование прибора управления производилось таким образом, что  вся программа  записывалась вместе с отдельными  программными кодами в программную память 2. При этом возможно занятые ранее  ячейки программной памяти 2 перезаписывались.
Представленный на фиг. 2 способ согласно изобретению работает следующим образом. На первой операции S1 программирующим устройством 4 передаётся через интерфейс 3 на  блок 1 управления, прежде всего на загрузчик операционной системы  прибора 1 управления,  команда, с помощью которой стирается программная память 2. Предпочтительно этим стиранием предусматривается  запись недействительного программного кода (некорректного кода операции - illegal Opcode)  во все ячейки программной памяти 2. Этот код может быть введён в блок 1 управления в виде стандартного значения (значения по умолчанию - default).  Однако в зависимости от микропроцессора, используемого в блоке 1 управления, возможно также  передать такой соответствующий код с программирующего устройства 4 на  прибор 1 управления.
Во время второй операции S2 программные коды, хранящиеся в памяти программирующего устройства 4,  обрабатываются способом упаковки без потерь, т. е. кодируются или упаковываются.
Требованиями, предъявляемыми к способу упаковки, являются минимальный расход ресурсов, в частности продолжительность вычислений, программная память и оперативная память.
Некоторые из существующих модулей памяти могут программироваться только без пропусков. При использовании же других модулей памяти необходимо описывать без пропусков, по меньшей мере, заданные области. Отсюда вытекает требование, согласно которому  распакованные данные, по меньшей мере, в виде отдельных областей должны  появляться без пропусков. Наиболее просто обращаться с распакованными данными в том случае, когда они появляются без пропусков во всей программируемой области памяти.  Поскольку имеющаяся оперативная память прибора 1 управления является, как правило,  намного меньше программной памяти 2, то не удаётся распаковать все данные до программирования, поэтому необходимо, чтобы передаваемые данные появлялись без пропусков.
Для упаковки передаваемых программных кодов без потерь особенно пригодно известное само по себе кодирование  Хаффмана, при котором  в противоположность многим другим  способам кодирования передаваемые данные появляются без пропусков. При таком кодировании или упаковке обеспечиваются упаковка и распаковка передаваемых данных без потерь. В принципе при этом часто появляющиеся данные кодируются в  короткие кодовые слова, а менее часто появляющиеся  данные - в более длинные кодовые слова.
Эффективность способа зависит от распределения передаваемых данных. Чем чаще появляются определённые данные, тем чаще применяются  короткие кодовые слова и, следовательно, достигается более высокий коэффициент упаковки.
Через процессы сортировки создаётся «дерево», с помощью которого  может быть образован «словарь» для кодирования. На основе этого дерева может быть создано соответствующее дерево распаковки. Такое дерево должно быть либо одновременно передано на блок 1 управления или оно может надёжно депонироваться в нем. В этом случае при кодировании должен применяться, само собой разумеется, тот же словарь.
Адаптивный вариант, при котором  кодирующее дерево заново создаётся и передаётся, приносит  лучшие результаты при упаковке и требует   большей оперативной памяти в блоке 1 управления, но меньшей программной памяти, в которой хранится словарь. В зависимости от назначения более оптимальным может оказаться адаптивный или неадаптивный вариант.
Структура  декодирующего дерева передаётся  при адаптивном варианте в неупакованную область в начале  потока данных. Затем следует декодирующее дерево и после него следуют упакованные данные.
Целесообразно проводить кодирование данных, размер которых во много раз превышает 1 байт (8 битов). Размер декодирующего дерева резко возрастает с длиной L кодируемых слов. Длина  закодированных по Хаффману знаков может быть для редких знаков больше длины некодированного знака. Поскольку, в частности  при 16-битовом кодировании на практике присутствуют не все знаки, то декодирующее дерево может быть соответственно меньшего размера.  Тем не менее очевидно, что меньшие области данных лучше кодируются  при восьми битах.
16-битовое кодирование показало во время опытов более высокий коэффициент упаковки. Однако это эффективно только, начиная с минимального объёма передаваемых данных, так как необходимо также передавать и декодирующее дерево.
При неадаптивном варианте необходимо соответственно обеспечить поле памяти для декодирующего дерева в энергонезависимой программной памяти.
Ниже кодирование  поясняется с помощью примера выполнения со ссылкой на фигуры 3 - 5.
Сначала для всех присутствующих знаков определили  их частотность, как это поясняется на следующем примере.
Частотность
0
0
0
5
8
0
9
22
Знаки
0
1
2
3
4
5
6
7
На следующей операции  знаки сортировали по частотности (фиг. 3а), что может проводиться в нисходящей или восходящей последовательности. При нисходящей последовательности из приведённого выше примера следует:
Частотность
22
9
8
5
0
0
0
0
Знаки
7
6
4
3
0
1
2
5
Знаки, а также знаки соответственно 0, 1, 2 и 5 при частотности 0 могут быть исключены.
Частотности обоих знаков при наиболее низкой частотности могут быть суммированы и дадут новый «лист» на дереве (см. фиг. 3b, 3с). Он явится дополнительным элементом в «массиве» соответствующих структур, и будут внесены признаки или индексы в зависимости от реализации. При этом в приводимой в качестве примера реализации «листья» в действительности не сортируются, а откладываются на вспомогательном векторе «индексы» или «признаки» листьев (фиг. 4). Сортируются только те «листья», которые  минимизируют расходы при сортировке.
После создании нового листа его добавляют, а оба последних признака удаляют и вместо них вводят индекс нового листа (фиг. 3d, 3е).
Это повторяют до тех пор, пока не останется единственная последняя запись, указывающая на вершину дерева (фиг. 3f, 3g).
На фигурах 3а, 3d, 3f линейно изображено соответствующее дерево, так как оно в этой форме может быть легко реализовано. С помощью этого дерева могут быть построены таблицы кодирования и декодирования.
На основании приведённого выше примера и пояснительной фигуры 3 может быть получена следующая  таблица кодирования:
Знак
Код
Длина
0
-
1
-
2
-
3
0-1-0
3
4
1-1-0
3
5
-
6
0-0
2
7
1
1
Для того чтобы определить, например,  код для «3»,  проходят через 0-1-0, т. е. длина составляет 3. Отсюда выводят для отдельных знаков следующий коэффициент упаковки:
Знак
Длина
Кол-во
Биты
3
3
5
15
4
3
8
24
6
2
9
18
7
1
22
22
Всего: 79
В данном случае требуются 79 битов для кодирования знаков. При 8-битовом же кодировании требуются 352 знака. Таким образом коэффициент упаковки достигает ок. 0,22.
Необходимое для кодирования декодирующее дерево строится с его вершины (фиг. 5).  Для отсутствующих знаков записи не создают. Это дерево представляет собой в свою очередь связанный список. Подлежащие декодированию коды анализируются  справа налево в соответствии с таблицей кодирования.  В таком же направлении коды и передаются.  Следовательно, 4 в приведённом выше примере  передаётся как 0-1-1.
Для определения того, требуется ли декодировать и дальше или же действующий знак уже найден,  соответственно обозначают корни дерева. Для этого достаточен дополнительный бит на одну запись для того, чтобы отличить действующий знак от индекса. В соответствии с этим  записи N1 и N2 содержат  индексы или декодированный знак, как это показано на фиг. 3. Здесь  левая дорожка означает соответственно «0», правая дорожка - «1». Такое присвоение должно производиться идентично кодированию. Если в примере на фиг. 3 принимается последовательность 0-1-1,  то при декодировании (фиг. 5)  следуют записям N1 и N2, исходя  от вершины дерева (левый лист) и получают результат «4».
Количество листов на декодирующем дереве меньше или равно количеству декодируемых знаков. В изображённом примере достаточными являются три листа для декодирующего дерева четырёх кодов. При выбранной реализации записи N1 и N2 содержат либо  один указатель или индекс, либо кодированный знак. Тогда количество битов для признаков определяется следующим образом:
B = Log (L) / Log (2) + 1 = 9 (при 8-битовом кодировании).
Проводится округление в большую сторону до следующего целого числа. При  этом L -  длина  кодируемых слов (например, 8 или 16).
Дополнительный бит необходим для различения признаков действительных знаков.  Для каждого листа требуются записи N1 и N2. Таким образом образуется минимальная длина  декодирующей таблицы: 3*2*9=54 бита.
Дополнительно необходимо передать также информацию о размере декодирующей таблицы и о количестве битов «В», приходящихся на запись в блок управления.
Если снова обратиться к фиг. 2, то упакованные по Хаффману программные коды при операции S3 передаются  с программирующего устройства 4 через интерфейс 3 на  блок 1 управления, затем  при операции S4 они соответственно  распаковываются и при операции S5 записываются  в программную память 2.  В заключение может проводиться  перепроверка переданных программных кодов, например проверкой контрольной суммы или циклической проверкой на избыточность (CRC; cyclic redundancy check) (см. операция S7).  При желании  результат такой перепроверки может быть передан обратно при операции S8 на программирующее устройство 4.
Описанный способ упаковки является технически простым, но очень эффективным. Для упаковки требуются по существу только  простые процессы сортировки. При распаковке требуется лишь простое следование записям в декодирующем дереве. Упаковка  тем лучше, чем неравномернее  появляются кодированные знаки. Для кодируемых программных кодов, предназначенных для приборов управления автомобилей, применяются коды для микропроцессоров,  в которых, судя по опыту, появляются  определённые коды (коды операции) заметно чаще, чем другие, в результате чего описанный способ упаковки может очень успешно применяться. В зависимости от заполнения программной памяти может дополнительно достигаться экономия за счёт отказа от передачи программных кодов для неиспользуемых областей. В результате применения недействительных программных кодов ( некорректных кодов операции) для данных областей  создаётся дополнительная эксплуатационная надёжность в случае сбоев или ошибок программного обеспечения, так как микропроцессоры при недействительных программных кодах инициируют прерывание, что может быть использовано для распознавания сбоя.
Поскольку на практике программная память прибора управления не заполнена полностью и содержит значительные пробелы в адресной области, то предпочтительно заполнить и эти пробелы значением для «некорректного кода операции».