LINUX.ORG.RU

Unit tests для микроконтролеров

 , ,


0

2

Имеем код для микроконтроллеров (stm32f4, tms570). Хочется выполнять юниттесты на самом микроконтроллере. Есть какие-нибудь инструменты? Что-нибудь, что может подергать с большого компа по serial тесты, сгенерировать отчет в стандартном формате итд? Что-то в стиле http://www.ldra.com/en/software-quality-test-tools/group/by-software-life-cyc...

★★★

Последнее исправление: vromanov (всего исправлений: 1)
Ответ на: комментарий от anonymous

И про это я тоже знаю. Как это связано с микроконтроллером?

vromanov ★★★
() автор топика

А зачем «подергать ... по serial». Если тестов меньше сотни и бюджет ограничен, вам поможет самописное тестовое ПО: jtag и консоль gdb - полная свобода творчества, 100% контроль, результат теста можно выдавать в UART «в стандартном формате» и дополнительно рулить по нему если нужно.

Sobaka
()
Ответ на: комментарий от Sobaka

Для того чтобы автоматизировать. Выкладывается новая прошивка (код). На билдсервере собирается, заливается на платку, прогоняются юниттесты, результат выкладывается. Рисуются графики, считается coverage, итд. Все этом можно сделать при помощи костылей. Но сильно усложняет работу, если тестов тысячи

vromanov ★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Степень ответственности БОЛЬШАЯ. Я, блин, сдохнуть могу если он плохо отработает. И не только я.

vromanov ★★★
() автор топика

Правильно пишут тут инструменты Cpputest и Unity, это для Unit тестов.

Если вам нужно реальное железо, то у вас не Unit тесты.

Возможно вам нужны:

-Интеграционные тесты

-Приёмочные тесты

Но точно не unit тесты. Разберитесь в терминологии, тогда вам проще будет найти нужный инструмент.

fsb4000 ★★★★★
()
Ответ на: комментарий от vromanov

Вы про стандарты разработки подобных приборов слышали? Просто интересно.

Я тестированием FPGA-проектов занимаюсь, и про софт имею представление. И мне кажется что подход должен быть иным. Во-первых код сам по себе должен быть отдельно протестирован по самые помидоры. А работа контроллеров логироваться не на предмет прохождения юнит тестов, а на предмет малейшего отклонения от нормы... Как-то так.

Предлагаю поинтересоваться как разрабатывают авиационное бортовое оборудование, вот ни разу не слышал попыток так тестировать контроллеры, а требования налагаются на сам стиль написания ПО контроллеров.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от fsb4000

Еще раз. Мне нужно запускать юниттесты на контролере. У меня уже есть юнитетсы на gtest. Но они запускаются на большом компе. А на контролере другой компилятор, другое выравнивание, другой размер структур, другой порядок байтов. Иногда другой размер int. Я не могу запустить gtest с выдачет отчета на микроконтроллере, т.к. там просто нет памяти для такого отчета. т.е. мне нужно два компонента. 1) Для микроконтролера - что что типа gtest.h 2) для большого компа програмка, которая общается с микроконтроллером и запускает тесты на нем, но со стороны выглядит как будто, тесты запускаются на большом компе.

Интеграционные тесты, и приемочные тесты тоже есть. Но я хочу именно уюниттесты на целевом устройстве

vromanov ★★★
() автор топика
Ответ на: комментарий от vromanov

А на контролере другой компилятор, другое выравнивание, другой размер структур, другой порядок байтов

Ясно. Кстати, QEMU кажется поддерживает Cortex-M4, можно еще и это добавить к своим тестам...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Это тоже есть. и стандарты, и куча всего. Но кроме стиля, есть и просто ошибки. Можно написать формально верный код, но он не будет работать, потому что, например ошибка в компиляторе. И прогоняя тесты на PC эту ошибку не выявить. Вот пример ошибки на которую я натолкнулся.

int64_t v1, v2, v3;
v1 = 0x7FFFFFFFUL;
v2 = v1 + 1;
v3 = abs (v2 - v1);

Как ты думаешь, чему должно быть равно v3?

vromanov ★★★
() автор топика
Ответ на: комментарий от vromanov

Как ты думаешь, чему должно быть равно v3?

Не знаю, я бы побоялся эксплуатировать вычисления на границах диапазонов. Но мне кажется нам всем повезло что ты такой ответственный и волнуешься за корректность прошивок :)

Тебя надо в роскосмос - всё перестанет падать :)

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от vromanov

Да, не увидел - там 64. Действительно, может быть баг компилятора если результат странный. Кажется я понимаю тебя теперь. Хотя задавая UL константу знаковой переменной - так делать не надо.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

UL это требование MISRA, а компилятор выдает -1.

vromanov ★★★
() автор топика

Блин, что там тестировать?

Если работает — релизь. Не работает — допиливай код!

Или ты про всякие возможные проблемы с переполнением буфера и т.п. тесты "на дурака"?

anonymous
()
Ответ на: комментарий от anonymous

Ну, например, потому что у меня нет динамической памяти. А gtest повязан на C++, STL и прочие архитектурные излишества Да и памяти часто 20-128 кб

vromanov ★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Чо ржать-то? МК просты, как 5 копеек! Если все подключенное железо работает, и ты проверил обработчики всех нештатных ситуаций, то что там может с ним случиться? Ржун, блин. С твоим ником вообще только в говне сидеть и не вылезать!

anonymous
()
Ответ на: комментарий от vromanov

Ну, например, потому что у меня нет динамической памяти. А gtest повязан на C++, STL и прочие архитектурные излишества Да и памяти часто 20-128 кб

в таких спартанских условиях все-таки самое то - это что-то типа unity

anonymous
()
Ответ на: комментарий от vromanov

Все равно нужна запускалка

это же простой скрипт на любом CI

anonymous
()
Ответ на: комментарий от vromanov

Подскажите пожалуйста,

Как и в чем вы рисуете графики, считаете coverage?

У меня возникло предположение (возможно ошибочное), что у вас сейчас одна прошивка в плате, в которую вы хотите «засадить» юниттесты. Чтобы запрогромировав флешку платы, перезагрузив по последовательному порту выдавать ей команды: 1, а она вам в ответ: OK Потом вы ей в порт: 2, а она вам опять OK Потом вы запускаете первый тест повторно, а она вам KO KO KO в вечном цикле ?

И теперь вам нужно все как-то автоматизировать (например, через процесс общения по UART-у), т.к. ранее юниттесты использовали "... прогоняя ... на PC ..." ? Начальник требует? Плюс к этому, как я понял, не для всех ваших устройств c памятью в 20-128 кб есть gdb, и приходится вам их тестировать в ручном режиме: отключить питание, ..., прошить «флешку», ..., подготовить внешнее оборудование, ..., запустить тест, ..., получить лог. И т.д. для каждого теста.

Sobaka
()
Ответ на: комментарий от anonymous

Нульчую этого жевтоблакитного! *школьник-кун*

anonymous
()
Ответ на: комментарий от vromanov

взять малину или что-то подобное, раз там арм (да, кортекс-М/R это конечно не кортекс-А, но близко), скомпилить код юниттестов под нее, и прогнать тесты...

иначе - начинается онанизм в стиле «скомпилил тест на определенный случай - прошил - посмотрел результат». и да, пилить этот онанизм придется самому на коленке.

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

Cortx-R именно что ближе к А профайлу, в отличие от M, у оторого например, модель исключний ну совсем другая не говоря уж о разнице baseline и mainline

anonymous
()

непонятно, а почему unity не подходит? ну и куча производных от него которая нагугливается за 5 минут

http://www.ucunit.org/_related__sites.html

https://libcheck.github.io/check/

Нужно только написать скрипт для batch загрузки тестов через jtag или какой вы там используете загрузчик. Тест выполняется - данные выводятся на консоль, с консоли же разбираются в отчет.

Никто не знает, какое у вас оборудование в плане загрузки кода и какие отчеты вы собираетесь формировать, поэтому как-то странно ожидать наличия открытых решений а-ля энтерпрайз.

Кстати, все эти фреймворки это же только assertion. Т.е. видимо для микроконтроллеров подмножество анализируемых типов данных д.б. сильно уже. Так, что можно вообще обойтись без сторонних библиотек:

#include "myput.h"
#include "my_testing_unit.c"

void main(){
  if(!my_testing_unit_func1(...))
    myput("OK");
  else
    myput("Error");
  
  while(1);
}
zudwa
()
Ответ на: комментарий от anonymous

компилятор/размер переменных/прочее будет такое же как и у кортекс А. т.е. 99.9% ошибок таки успешно отловится. 0.1% на оставшиеся М-специфичные фичи, а точнее баги их реализации в компиляторе - это куда меньша вероятность чем встретить баг в библиотеках от вендора (там к слову ад и погибель зачастую, ни разу не покрытая никакими тестами)

NiTr0 ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Ты, случайно, не тот анонимный друг тейлганнера, который не знает, что такое софт, и назвал наши ГОСТы в честь своего президента?

shkolnick-kun ★★★★★
()
Ответ на: комментарий от NiTr0

Это точно ST-шные и тексасовские библиотеки пишут индусы, там треш и угар полный внутри!

shkolnick-kun ★★★★★
()
Ответ на: комментарий от vromanov

У меня уже есть юнитетсы на gtest. Но они запускаются на большом компе. А на контролере другой компилятор, другое выравнивание, другой размер структур, другой порядок байтов.

Писал как-то отказоустойчивый архив для stm8, у которого мало того, что 8 бит, так еще и BE, тестировал на компе, при переносе на целевое устройств поведение не измнилось от слова СОВСЕМ!

Просто не надо использовать всякое UB и недокументированный функционал.

И да, анонимус дело говорит, в автопроме надобно Ada + SPARK использовать ибо кошерно!

1) Для микроконтролера - что что типа gtest.h

Зачем, чтобы делать ASSERT?

2) для большого компа програмка, которая общается с микроконтроллером и запускает тесты на нем, но со стороны выглядит как будто, тесты запускаются на большом компе.

В первом приближении - тупая прокладка между ком-портом (или чем-то ещё) и stdin/stdout, можно генерировать код на основе шаблона при сборке прошивки.

А в качесвте запускалки - любая ситема CI.

shkolnick-kun ★★★★★
()
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Ответ на: комментарий от shkolnick-kun

Ты, случайно, не тот анонимный друг тейлганнера, который не знает, что такое софт, и назвал наши ГОСТы в честь своего президента?

Ты точно мне?

Писал как-то отказоустойчивый архив для stm8, у которого мало того, что 8 бит, так еще и BE, тестировал на компе, при переносе на целевое устройств поведение не измнилось от слова СОВСЕМ!

Потому что ты сам лишь подтверждаешь мои (возможно ошибочные) представления.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от shkolnick-kun

вот пример кода (структуры)

/************************************************************************************
 * AC ID:0x18EEFEFEx (418316030) DLC:8
 * Address Claimed
Message used to claim an address for a Controller Application.
 * Priority: 6
 * Data page: 0
 * Extended Data page: 0
 * PGN: 60928 (0xEE00)
 * From file: ..\..\dbc_tools\dbc/j1939.dbc
 * Send Type: noMsgSendType
 * VFrameFormat: J1939PG
 ************************************************************************************/

typedef struct {
#ifdef SIMULINK
  bool valid;
#endif /* SIMULINK */
  bool ReservedBit; /* start:48 Reserved for future definition by SAE. The reserved bit shall be set to zero.*/
  bool ArbitraryAddressCapable; /* start:63 */
  /* Multiplexer switch */
  VtSig_IndustryGroup_t IndustryGroup; /* start:60 0 = Global
1  = On-Highway;
2  = Agricultural and Forestry;
3  = Construction;
4  = Marine;
5  = Industrial - Process
Control - Stationary (Gen-Sets)
6  = Reserve for SAE
7  = Reserve for SAE*/
  uint8_t VehicleSystemInstance; /* start:56 */
  vtFunction_t Function; /* start:40 */
  uint8_t FunctionInstance; /* start:35 */
  uint8_t ECUInstance; /* start:32 */
  vtManufacturerCode_t ManufacturerCode; /* start:21 Assigned by NMEA 2000 Committee*/
  uint32_t IdentityNumber; /* start:0 */
  union {
    /* Multiplexer 0 0x00 */
    struct {
      vtVehicleSystem_t VehicleSystem; /* start:49 */
    } m0;
    /* Multiplexer 1 0x01 */
    struct {
      vtVehicleSystem1_t VehicleSystem1; /* start:49 */
    } m1;
    /* Multiplexer 2 0x02 */
    struct {
      vtVehicleSystem2_t VehicleSystem2; /* start:49 */
    } m2;
    /* Multiplexer 3 0x03 */
    struct {
      vtVehicleSystem3_t VehicleSystem3; /* start:49 */
    } m3;
    /* Multiplexer 4 0x04 */
    struct {
      vtVehicleSystem4_t VehicleSystem4; /* start:49 */
    } m4;
    /* Multiplexer 5 0x05 */
    struct {
      vtVehicleSystem5_t VehicleSystem5; /* start:49 */
    } m5;
  } multiplexed;
} CAN_AC_t;

#pragma pack(push,1)
typedef union {
#ifdef INTEL_ORDER
    struct {
        uint32_t IdentityNumber:21;
        uint16_t ManufacturerCode:11;
        uint16_t ECUInstance:3;
        uint16_t FunctionInstance:5;
        uint8_t Function;
        uint16_t ReservedBit:1;
        uint64_t _reserved_49:7;
        uint16_t VehicleSystemInstance:4;
        uint16_t IndustryGroup:3;
        uint16_t ArbitraryAddressCapable:1;
    } m_none;
    /* Multiplexer 0 0x00 */
    struct {
        uint64_t _reserved_0:49;
        uint16_t VehicleSystem:7;
        uint64_t _reserved_56:8;
    } m0;
    /* Multiplexer 1 0x01 */
    struct {
        uint64_t _reserved_0:49;
        uint16_t VehicleSystem1:7;
        uint64_t _reserved_56:8;
    } m1;
    /* Multiplexer 2 0x02 */
    struct {
        uint64_t _reserved_0:49;
        uint16_t VehicleSystem2:7;
        uint64_t _reserved_56:8;
    } m2;
    /* Multiplexer 3 0x03 */
    struct {
        uint64_t _reserved_0:49;
        uint16_t VehicleSystem3:7;
        uint64_t _reserved_56:8;
    } m3;
    /* Multiplexer 4 0x04 */
    struct {
        uint64_t _reserved_0:49;
        uint16_t VehicleSystem4:7;
        uint64_t _reserved_56:8;
    } m4;
    /* Multiplexer 5 0x05 */
    struct {
        uint64_t _reserved_0:49;
        uint16_t VehicleSystem5:7;
        uint64_t _reserved_56:8;
    } m5;
#else
    struct {
        uint8_t IdentityNumber_0;
        uint8_t IdentityNumber_1;
        uint16_t ManufacturerCode_0:3;
        uint16_t IdentityNumber_2:5;
        uint8_t ManufacturerCode_1;
        uint16_t FunctionInstance:5;
        uint16_t ECUInstance:3;
        uint8_t Function;
        uint64_t _reserved_48:7;
        uint16_t ReservedBit:1;
        uint16_t ArbitraryAddressCapable:1;
        uint16_t IndustryGroup:3;
        uint16_t VehicleSystemInstance:4;
    } m_none;
    /* Multiplexer 0 0x00 */
    struct {
        uint64_t _reserved_0:48;
        uint16_t VehicleSystem:7;
        uint64_t _reserved_55:9;
    } m0;
    /* Multiplexer 1 0x01 */
    struct {
        uint64_t _reserved_0:48;
        uint16_t VehicleSystem1:7;
        uint64_t _reserved_55:9;
    } m1;
    /* Multiplexer 2 0x02 */
    struct {
        uint64_t _reserved_0:48;
        uint16_t VehicleSystem2:7;
        uint64_t _reserved_55:9;
    } m2;
    /* Multiplexer 3 0x03 */
    struct {
        uint64_t _reserved_0:48;
        uint16_t VehicleSystem3:7;
        uint64_t _reserved_55:9;
    } m3;
    /* Multiplexer 4 0x04 */
    struct {
        uint64_t _reserved_0:48;
        uint16_t VehicleSystem4:7;
        uint64_t _reserved_55:9;
    } m4;
    /* Multiplexer 5 0x05 */
    struct {
        uint64_t _reserved_0:48;
        uint16_t VehicleSystem5:7;
        uint64_t _reserved_55:9;
    } m5;
#endif
} wire_AC_t;
#pragma pack(pop)

vromanov ★★★
() автор топика
Ответ на: комментарий от shkolnick-kun

вот пример кода (разбор)

bool CAN_AC_parse(uint16_t dlc, const uint8_t* data, CAN_AC_t* msg) {
    const wire_AC_t* wire_data = (const wire_AC_t*)data;
    CAN_AC_init(msg);
#ifdef INTEL_ORDER
    /* startbit:48 length:1 factor:1 offset:0 min:0 max:1  */
    msg->ReservedBit = TO_BOOL(wire_data->m_none.ReservedBit == 1);
    /* startbit:63 length:1 factor:1 offset:0 min:0 max:1  */
    msg->ArbitraryAddressCapable = TO_BOOL(wire_data->m_none.ArbitraryAddressCapable == 1);
    /* startbit:60 length:3 factor:1 offset:0 min:0 max:7 VtSig_IndustryGroup */
    msg->IndustryGroup = (VtSig_IndustryGroup_t)wire_data->m_none.IndustryGroup;
    /* startbit:56 length:4 factor:1 offset:0 min:0 max:15  */
    msg->VehicleSystemInstance = (uint8_t)wire_data->m_none.VehicleSystemInstance;
    /* startbit:40 length:8 factor:1 offset:0 min:0 max:255 vtFunction */
    msg->Function = (vtFunction_t)wire_data->m_none.Function;
    /* startbit:35 length:5 factor:1 offset:0 min:0 max:31  */
    msg->FunctionInstance = (uint8_t)wire_data->m_none.FunctionInstance;
    /* startbit:32 length:3 factor:1 offset:0 min:0 max:7  */
    msg->ECUInstance = (uint8_t)wire_data->m_none.ECUInstance;
    /* startbit:21 length:11 factor:1 offset:0 min:0 max:2047 vtManufacturerCode */
    msg->ManufacturerCode = (vtManufacturerCode_t)wire_data->m_none.ManufacturerCode;
    /* startbit:0 length:21 factor:1 offset:0 min:0 max:2.09715e+06  */
    msg->IdentityNumber = (uint32_t)wire_data->m_none.IdentityNumber;
#if defined(__TI_COMPILER_VERSION__)
/* (MISRA-C:2004 15.2/R) An unconditional break statement shall terminate every non-empty switch clause*/
/* Disable misreporting. This is bug in TI compiler! */
/* TODO: Delete when compiler fixed */
#pragma diag_push
#pragma CHECK_MISRA ("-15.2")
#endif
    switch (msg->IndustryGroup) {
        case IndustryGroup_Global:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem */
            msg->multiplexed.m0.VehicleSystem = (vtVehicleSystem_t)wire_data->m0.VehicleSystem;
            break;
        case IndustryGroup_On_Highway:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem1 */
            msg->multiplexed.m1.VehicleSystem1 = (vtVehicleSystem1_t)wire_data->m1.VehicleSystem1;
            break;
        case IndustryGroup_Agricultural_and_Forestry:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem2 */
            msg->multiplexed.m2.VehicleSystem2 = (vtVehicleSystem2_t)wire_data->m2.VehicleSystem2;
            break;
        case IndustryGroup_Construction:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem3 */
            msg->multiplexed.m3.VehicleSystem3 = (vtVehicleSystem3_t)wire_data->m3.VehicleSystem3;
            break;
        case IndustryGroup_Marine:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem4 */
            msg->multiplexed.m4.VehicleSystem4 = (vtVehicleSystem4_t)wire_data->m4.VehicleSystem4;
            break;
        case IndustryGroup_IndustrialProcessCtrlStationary:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem5 */
            msg->multiplexed.m5.VehicleSystem5 = (vtVehicleSystem5_t)wire_data->m5.VehicleSystem5;
            break;
        default:
            break;
    }
#if defined(__TI_COMPILER_VERSION__)
#pragma diag_pop
#endif
#else
    /* startbit:48 length:1 factor:1 offset:0 min:0 max:1  */
    msg->ReservedBit = TO_BOOL(wire_data->m_none.ReservedBit == 1);
    /* startbit:63 length:1 factor:1 offset:0 min:0 max:1  */
    msg->ArbitraryAddressCapable = TO_BOOL(wire_data->m_none.ArbitraryAddressCapable == 1);
    /* startbit:60 length:3 factor:1 offset:0 min:0 max:7 VtSig_IndustryGroup */
    msg->IndustryGroup = (VtSig_IndustryGroup_t)wire_data->m_none.IndustryGroup;
    /* startbit:56 length:4 factor:1 offset:0 min:0 max:15  */
    msg->VehicleSystemInstance = (uint8_t)wire_data->m_none.VehicleSystemInstance;
    /* startbit:40 length:8 factor:1 offset:0 min:0 max:255 vtFunction */
    msg->Function = (vtFunction_t)wire_data->m_none.Function;
    /* startbit:35 length:5 factor:1 offset:0 min:0 max:31  */
    msg->FunctionInstance = (uint8_t)wire_data->m_none.FunctionInstance;
    /* startbit:32 length:3 factor:1 offset:0 min:0 max:7  */
    msg->ECUInstance = (uint8_t)wire_data->m_none.ECUInstance;
    /* startbit:21 length:11 factor:1 offset:0 min:0 max:2047 vtManufacturerCode */
    msg->ManufacturerCode = (vtManufacturerCode_t)_CAN_GET_3_u11(wire_data->m_none.ManufacturerCode);
    /* startbit:0 length:21 factor:1 offset:0 min:0 max:2.09715e+06  */
    msg->IdentityNumber = (uint32_t)_CAN_GET_8_u21(wire_data->m_none.IdentityNumber);
#if defined(__TI_COMPILER_VERSION__)
/* (MISRA-C:2004 15.2/R) An unconditional break statement shall terminate every non-empty switch clause*/
/* Disable misreporting. This is bug in TI compiler! */
/* TODO: Delete when compiler fixed */
#pragma diag_push
#pragma CHECK_MISRA ("-15.2")
#endif
    switch (msg->IndustryGroup) {
        case IndustryGroup_Global:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem */
            msg->multiplexed.m0.VehicleSystem = (vtVehicleSystem_t)wire_data->m0.VehicleSystem;
            break;
        case IndustryGroup_On_Highway:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem1 */
            msg->multiplexed.m1.VehicleSystem1 = (vtVehicleSystem1_t)wire_data->m1.VehicleSystem1;
            break;
        case IndustryGroup_Agricultural_and_Forestry:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem2 */
            msg->multiplexed.m2.VehicleSystem2 = (vtVehicleSystem2_t)wire_data->m2.VehicleSystem2;
            break;
        case IndustryGroup_Construction:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem3 */
            msg->multiplexed.m3.VehicleSystem3 = (vtVehicleSystem3_t)wire_data->m3.VehicleSystem3;
            break;
        case IndustryGroup_Marine:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem4 */
            msg->multiplexed.m4.VehicleSystem4 = (vtVehicleSystem4_t)wire_data->m4.VehicleSystem4;
            break;
        case IndustryGroup_IndustrialProcessCtrlStationary:
            /* startbit:49 length:7 factor:1 offset:0 min:0 max:127 vtVehicleSystem5 */
            msg->multiplexed.m5.VehicleSystem5 = (vtVehicleSystem5_t)wire_data->m5.VehicleSystem5;
            break;
        default:
            break;
    }
#if defined(__TI_COMPILER_VERSION__)
#pragma diag_pop
#endif
#endif
    return true;
}

vromanov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.