Как стать автором
Обновить
16
0
Вячеслав Мезенцев @ViacheslavMezentsev

Инженер-программист

Отправить сообщение

Там долго, около 3 ч. Хоть и 1 тыс "просмотров" за 2 недели, но на самом деле очень сильно сомневаюсь, что хоть кто-то досмотрел до конца.

Три метода тестирования приведены:

- классический - при помощи c-кода;
- на основе командных скриптов gdb;
- на основе python-скриптов gdb-py;

Лампочек и hello world'а нет. Хардкор для любознательных: vs code, cmake/ctest, gdb+py, cmd. Репозиторий с примерами под видео.

Само тестирование при помощи gdb не ново, просто я собрал кое-что в кучу и выложил описание на конкретном тестовом окружении. Так долго, потому что никто обычно в сети про это не пишет ничего кроме примитива.

В моих примерах я показываю методику, когда вообще не нужны никакие телодвижения в коде MCU. Вы тестируете то, что конкретно будет в работе.
Есть свои плюсы и минусы, но это ещё один вариант для тестировщиков, который пока нигде не описан, кроме моего видео.
Как делать отладку python тестов я пока не выложил. Тут только не нужно путать - это скрипты для GDB, а не обычные python-скрипты. Есть особенности.

Это смотря чем на нём заниматься:
Модульное тестирование для малых встраиваемых систем
https://www.youtube.com/watch?v=idlKlSHc0wU

Использование python'а, встроенного в GDB, для тестирования MCU
Использование python'а, встроенного в GDB, для тестирования MCU

Следующим этапом будет разработка собственного сборщика на python (см процесс конфигурации и сборки Ardupilot).

Периодически веду плейлист STM32 + CMake:
https://www.youtube.com/playlist?list=PL3hso3baaaPz4NgZW7kzAn0LzHdhCoQry

Можно что-то подсмотреть из тамошнего репозитория.

Да, действительно. Почему-то использовал с Shift'ом.

Полноэкранный режим: Левые Alt+Shift и Enter (Win10)
Полноэкранный режим: Левые Alt+Shift и Enter (Win10)

Пользуюсь до сих пор.

В своё время тоже искал информацию по теме.

Положу это тут: 407 vs 427 DFU, auto detect HSE clock speed

Я всё ищу такую, которая умеет нормально отображать дискретные каналы, как ibaPDA или PLC Analyzer.

Примера с LibP7 не хватает для полного комплекта.

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

Не получается с NXP подружиться (подтвердить e-mail) даже через свой VPN. Не могли бы вы приложить этот FreeMaster (дистриб и SDK), хотелось бы на него глянуть.

Поэтому к такой модификации следует прибегать когда действительно необходимо, например когда микроконтроллер не содержит сопроцессор операций с плавающей точкой, как ARM Cortex-M0 или ARM Cortex-M33 или когда подобных фильтров в модели очень много.

К примеру, если я хочу использовать в Simulink для CM0 библиотеку Qfplib (для CM0), чтобы работать с float'ами. Для обычной IDE я знаю как это делать:

float temp30_cal = qfp_uint2float( * ( uint16_t * ) TEMP30_CAL_ADDRESS );
float temp110_cal = qfp_uint2float( * ( uint16_t * ) TEMP110_CAL_ADDRESS );

float temperature = data;

temperature = qfp_fsub( qfp_fdiv( qfp_fmul( temperature, vdd ), 3.3f ), temp30_cal );
temperature = qfp_fmul( temperature, qfp_fsub( 110.0f, 30.0f ) );
temperature = qfp_fdiv( temperature, qfp_fsub( temp110_cal, temp30_cal ) );
value = qfp_fadd( temperature, 30.0f );

Как подключение и использование такой библиотеки будет выглядеть в Simulink? У меня фильтрация как раз сделана на основе этой библиотеки. Или вопросы компактности кода для бедных?

Один из каналов обслуживает протокол FreeMaster по TCP поверх USB.

RNDIS? Или какой-то проброс потока UART'а?

Между прочим, существуют подобные "тесты" для математиков, т.е. минимум, который народ должен понимать, если причисляет себя к математикам.

Математический тривиум (В. И. Арнольд)

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

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

По поводу секций и компоновки я мог бы интересную задачку задать, но, к сожалению, она частная. Вот попался мне 2-х ядерный ассиметричный отечественный 1901ВЦ1Т. Ведущее там Cortex-M3 ядро, ведомое - TMS320C546 (выше упоминался 16-битный char, он там такой). Так вот мой вопрос бы был в плане практики: как настроить скрипты компоновщиков обоих компиляторов, чтобы удобнее было бы загрузить и запустить на исполнение код DSP-ядра.
Если с Cortex'ом ещё более менее понятно, то в старом техасском компиляторе придётся существенно помучится, чтобы получить прошивку, которая сама себя правильно восстановит, будучи запущенной. В DSP программа на C++.

Если вы знаете адекватные, сложные и интересные вопросы по теме разработки на MCU, то пишите их в комментариях.

По последовательной линии приходит знаковое целое значение с количеством битов не кратным 8, т.е. не укладывающееся в стандартные типы intN_t. Каким способом можно привести такие сырые данные к стандартному знаковому целому типу?
К примеру, int12 сохранён как есть в uint16 с 12-м знаковым битом и нужно получить число в виде int16.
Варианты ответов (8 в 16 для удобства визуализации): https://godbolt.org/z/5Y57d61ET

Картинки можно взять отсюда (стр. 104 и далее).
Я последний раз играл в Tomb Raider 1 ещё. Для меня прогресс налицо :)
Да, на косу я тоже обратил внимание, особенно в конце бросается в глаза. Сам лажу по скалам, было смешно посмотреть, но это же не симулятор скалолазания.
Я б в такую игрушку поиграл, которая так горный поход симулировала бы где-нибудь в Ергаках, к примеру.
Вариант для CRC-16-CCITT (0x1021, c#):

/*
@echo off && cls
set dotnet=%windir%\Microsoft.NET\Framework
for %%n in (2.0.50727,3.5,4.0.30319) do if exist "%dotnet%\v%%n\csc.exe" set csc="%dotnet%\v%%n\csc.exe"
( %csc% /nologo /out:"%~0.exe" %0 && "%~0.exe" ) && del "%~0.exe"
exit
*/
using System;
using System.Collections.Generic;

class Program
{
    public static byte[] Crc16( byte[] bytes )
    {
        int hi = 0xFF, lo = 0xFF;

        foreach ( var b in bytes )
        {
                var t = ( byte ) ( lo ^ b );

                lo = hi; hi = t;

                // Место флага (старшего разряда) занимает появляющийся при сдвиге влево нулевой разряд.
                // Его комбинация (XOR) с младшим разрядом полинома 0x1021 должна всегда давать единицу.
                // Поскольку флаг всегда равен единице, то мы должны обнулить младший разряд полинома,
                // чтобы получить результат итерации аналогичный другим методам.

                // По-простому: мы двигаем на каждой из 8 итераций не текущее значение crc, а полином, но
                // в обратную сторону. Причём сдвиг циклический, т.к. в оригинале при сдвиге влево каждый
                // раз получается один нулевой битик. Мы суём его на место старшего разряда, который нас
                // безвременно покидает.

                // 0001000000100001 1021 - полином

                // Расчёт констант:
                // 0000 1000 0001 0000 (0x1021 >> 1) & 0x7FFF = 0x0810
                // 0000 0100 0000 1000 (0x1021 >> 2) & 0xBFFF = 0x0408
                // 0000 0010 0000 0100 (0x1021 >> 3) & 0xDFFF = 0x0204
                // 0000 0001 0000 0010 (0x1021 >> 4) & 0xEFFF = 0x0102
                // 0000 0000 1000 0001 (0x1021 >> 5) & 0xF7FF = 0x0081
                // 1000 0000 0100 0000 (0x1021 >> 6) & 0xFBFF = 0x8040
                // 0100 0000 0010 0000 (0x1021 >> 7) & 0xFDFF = 0x4020
                // 0010 0000 0001 0000 (0x1021 >> 8) & 0xFEFF = 0x2010
                if ( ( hi & 0x80 ) != 0 ) { hi ^= 0x08; lo ^= 0x10; }
                if ( ( hi & 0x40 ) != 0 ) { hi ^= 0x04; lo ^= 0x08; }
                if ( ( hi & 0x20 ) != 0 ) { hi ^= 0x02; lo ^= 0x04; }
                if ( ( hi & 0x10 ) != 0 ) { hi ^= 0x01; lo ^= 0x02; }
                if ( ( hi & 0x08 ) != 0 ) { hi ^= 0x00; lo ^= 0x81; }
                if ( ( hi & 0x04 ) != 0 ) { hi ^= 0x80; lo ^= 0x40; }
                if ( ( hi & 0x02 ) != 0 ) { hi ^= 0x40; lo ^= 0x20; }
                if ( ( hi & 0x01 ) != 0 ) { hi ^= 0x20; lo ^= 0x10; }
        }

        return new [] { ( byte ) lo, ( byte ) hi };
    }

    static void Main( string[] args )
    {
        var query = new List<byte> { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 };

        query.AddRange( Crc16( query.ToArray() ) );

	// Вывод: 31-32-33-34-35-36-37-38-39-29-B1
        Console.WriteLine( BitConverter.ToString( query.ToArray() ) );

        Console.ReadKey();
    }
}
Я в студенческие годы использовал Mathcad для расчётов. Всё-таки лучше иметь документ, который ты можешь «подогнать» под себя (если ты действительно инженер), чем сотни программ, исходники которых неизвестно где и непонятно по каким формулам там в реальности всё посчитано. Исключением могут быть профессиональные расчётные программы типа MicroCap, PSpice, Proteus, Multisim и пр.

Могу предложить ещё один вариант для мелких расчётов. Это отечественная программа SMath Studio, которая является бесплатным упрощенным аналогом Mathcad'а. Программе уже около 14 лет, начиналась с КПК версии в 2005 г.

Я сделал небольшой пример как можно использовать программу для расчёта формы выходного напряжения для детектора АМ-колебания, чтобы примерно были понятны её возможности на текущий момент:



В описании к видео есть ссылка на первую часть, где сделан небольшой обзор программы. Существуют версии и для планшетников, но они появились недавно и пока ещё малофункциональны.
Тоже Адамова читал. Хорошо зашёл после 20 тыс лье под водой. У него вроде три романа было:
— про советскую подводную лодку, плывущую в паровом пузыре, как Шквал;
— про подземную «лодку»;
— а третий я не помню, так и не прочитал.

«Тайну двух океанов» вроде за пару дней осилил непрерывного чтения :) не мог оторваться, очень переживал за предательство.
1
23 ...

Информация

В рейтинге
3 596-й
Откуда
Екатеринбург, Свердловская обл., Россия
Дата рождения
Зарегистрирован
Активность