Задать вопрос
  • Каким образом микроконтроллеры с поддержкой Wi-Fi обрабатывают сигналы?

    NeiroNx
    @NeiroNx
    Программист
    там закрытое специализированное wi-fi ядро, у вас нет прямого доступа к RF. В регистрах у вас уже принятые данные TCP/IP уровня(сокеты), насколько я знаю даже пинг не отключить.
    Ответ написан
    Комментировать
  • Как аналоговый сигнал принимается и преобразуется в цифровой?

    Используется Алгоритм/фильтр Гёрцеля:
    https://ru.m.wikipedia.org/wiki/Алгоритм_Гёрцеля

    То есть по сути да - это дискретное преобразование Фурье.
    Отличие в том, что нам не нужно полную характеристику сигнала узнать, а только лишь два компонента из него (в примере: 5гц и 2гц), по тому алгоритм Гёрцеля сильно проще, чем преобразование Фурье.


    Использует АЦП, который разбивает входящий сигнал на фрагменты, называемые сэмплами (или фреймами, не уверен)

    Сэмпл - это не фрагмент, а точка. В данном случае нам 10+гц частоты дискретизации будет достаточно.
    Ответ написан
    Комментировать
  • Что отвечает за предотвращение нежелательной записи в text секцию?

    15432
    @15432
    Системный программист ^_^
    Если это микроконтроллер, то код вполне может находиться в read-only памяти - на флешке ПЗУ, запись в которую нельзя выполнить просто по указателю.
    В иных случаях за это отвечает модуль MPU (memory protection unit), который кто-то в системе настраивает.
    Ответ написан
    Комментировать
  • Что отвечает за предотвращение нежелательной записи в text секцию?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Я вижу тут 2 варианта:

    1. Адрес функции не выровнен, это и вызывает SIGBUS
    2. Тут баг с назначением номеров сигналов и на самом деле тебе поступает SIGSEGV, т.к. адрес неверный

    Второе прямо описывается в man'е man 7 signals


    BUGS
    For example, an invalid memory access that causes delivery of SIGSEGV
    on one CPU architecture may cause delivery of SIGBUS on another archi‐
    tecture, or vice versa.


    Отвечая на твой вопрос, что предотвращает запись в секцию .text - флаги секций. У каждой секции есть свои флаги, которые отвечают за возможности работы с этими секциями.
    Для этого можно использовать objdump -h <executable>. В частности, я запустил и вот такой вывод появился для бинарника

    14 .plt.sec      00000020  0000000000001060  0000000000001060  00001060  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
     15 .text         00000118  0000000000001080  0000000000001080  00001080  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
     16 .fini         0000000d  0000000000001198  0000000000001198  00001198  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, CODE


    Можешь заметить, что .text помечен как READONLY

    Все-таки можно изменить

    Есть системный вызов ptrace, который вообще-то может изменить секцию кода, но проблема в том, что он работает с инструкциями и работать можно только с дочерним процессом. Грубо говоря, выступешь в роли отладчика.
    Поэтому можешь считать, что .text не изменить
    Ответ написан
  • С чего начать, чтобы написать свою библиотеку по загрузке бинарника в микроконтроллер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У твоей задачи есть как минимум два решения. Одно, попроще: взять готовую программу прошивки, посмотреть, как она работает, написать библиотеку реализующую то же самое. Другое, посложнее: начать со спецификации контроллера который ты собираешься прошивать и раскручивать зависимости с той стороны. Поскольку ни то, ни другое решение сами по себе большого смысла не имеют (потому что есть уже программы для прошивки), тебе надо решить, чего ты сам хочешь получить от этого упражнения.

    Есть, может, какие-то специальные книги по этой теме?

    Спецификации на контроллер, а недостаток большой картины можно покрыть википедией и всяким osdev.org
    Ответ написан
    Комментировать
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #define BIT_SET(port, bit) (port |= (1 << bit))
    
    int main(void)
    {
        BIT_SET(PORTB, PORTB0);
    }


    вот такой вариант, с макро-функцией, работает, так как это просто текстовая замена

    Он работает, потому что с таким определением BIT_SET PORTB не может быть определён просто как 0x04. Потому что просто текстовая замена 0x04 |= 1 << 0 не имеет смысла. Он определён как volatile ссылка на память с адресом 0x04. Когда ты научишься передавать ссылку на такую память в функцию, функция тоже начнёт работать.
    Ответ написан
    3 комментария
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    Vindicar
    @Vindicar
    RTFM!
    bit_set() принимает аргумент по значению, т.е. принимает его копию. От того, что эта копия изменена внутри функции, снаружи ничего не поменяется. А раз других побочных эффектов у функции нет, компилятор удаляет её вызов.
    Макрос же после всех подстановок сделает просто присваивание указанной переменной. Тут побочный эффект есть.
    Ответ написан
    4 комментария
  • Как ускорить чтение строк из файла?

    egor_nullptr
    @egor_nullptr Куратор тега C
    mmap + ручной разбор, получилось примерно в 10 раз быстрее, чем fgets + sscanf
    Код

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <sys/mman.h>
    #include <unistd.h>
    
    int main(int argc, char** argv)
    {
        int fin = open(argv[1], O_RDONLY);
        struct stat finfo = {0};
        fstat(fin, &finfo);
        char *map = mmap(0, finfo.st_size, PROT_READ, MAP_SHARED, fin, 0);
    
        char src[4] = {0};
        char dst[4] = {0};
        int cost;
        int i;
        int off = 0;
    
        while (off < finfo.st_size)
        {   
            memcpy(src, map + off, 3); 
            memcpy(dst, map + off + 4, 3);
            i = 0; 
            cost = 0;
            while (map[off + 8 + i] != 10) { 
                cost = cost * 10 + map[off + 8 + i] - 48;
                ++i;
            };
            off += 9 + i;
        };
    
        munmap(map, finfo.st_size);
        close(fin);
    
        return EXIT_SUCCESS;
    }

    Ответ написан
    2 комментария
  • Как вывести боди в зависимости от типа?

    WblCHA
    @WblCHA
    Можно, конечно, написать красивее, но там сам тип тогда править надо.

    function handler<T extends C["type"]>(type: T, body: Omit<C & { type: T }, 'type'>) {}
    Ответ написан
    Комментировать
  • Как браузер выполнить наложение эти стилей в данном случае?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Длинный ответ:
    https://developer.mozilla.org/ru/docs/Web/Performa...

    Короткий ответ:
    Для каждого узла найдёт соответствующие правила и применит наиболее приоритетное из них. В данном случае - из медиа. А вот эта формулировка "сначала одно потом другое" - лишена смысл. Файл само собой читается последовательно, а не все строки одновременно.

    Браузер сначала задаст высоту 30, а потом 60, тем самым вызвав два рефлоу?

    Рефлоу - это когда уже страница была отрисована. На первичной отрисовке это, по идее, произойдёт в первом случае при построении render tree(title в него не попадёт, так как display: none), во втором, при компоновке. Но в обоих случаях до первичной отрисовки.

    То есть куда улчше было бы использовать еще и media min-width?

    Зачем намеренно утяжелять дерево стилей?
    Ответ написан
    7 комментариев
  • Когда вы используете type, а когда - intefcace, в React?

    @uroot
    У нас на галере юзают interface когда нужно описать объект, например объект пропсов или стейта. Через interface это проще.

    А type юзают для какой-то отдельной переменной, допустим значение этой переменной может быть строго определённым, например "error" | "warning" | "good". Тогда как я и написал юзают type.
    Ответ написан
    Комментировать
  • Когда вы используете type, а когда - intefcace, в React?

    profesor08
    @profesor08
    Если надо описать некоторый перечень значений, то type:

    type ResponseStatus = "error" | "success";

    Если надо описать объект, то intefcace:

    interface ApiResponse {
        status: ResponseStatus;
    }


    И никто не запрещает написать через type:

    namespace Api {
        type Status = "error" | "success";
    
        type Response = {
            status: Status;
        };
    }
    Ответ написан
    1 комментарий
  • Есть ли разница в том, как проверить наличие window в js?

    @wonderingpeanut
    Это связано с тем, что html документ формируется на сервере. Как ты сам сказал, на сервере нет window объекта, поэтому он и ругается.

    Сделай
    const [isMobile, setIsMobile] = useState(undefined);

    и при загрузке страницы измени стейт в нужное тебе значение (юзефект)
    const [state,setState] = useState();
    useEffect(() => {
      if (typeof window !== 'undefined')
        setState(...)
    }
    Ответ написан
    3 комментария
  • Как можно использовать Proxy в react?

    Alexandroppolus
    @Alexandroppolus
    кодир
    MobX, 6 версия
    Ответ написан
    Комментировать
  • Как из строковых литералов сделать тип массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В TS есть 2 варианта итерироваться по частям юнион типа - это условные типы и итерация по ключам, притом итерация по ключам ограничена типом number | string | symbol

    Условные типы проверяют условие для каждого варианта юниона, а значит позволяют трансформировать каждый из вариантов по отдельности:
    type MyFunc = <N extends string>() => (N extends string ? Field<N> : never)[];
    но возвращаемый тип так же будет юнионом:({ name: "town" } | { name: "city" })[]

    Сделать кортежный тип из юниона не выйдет, так как в юнионе не определен порядок, тип "town" | "city" это тоже самое, что и тип "city" | "town".
    Но можно сделать кортеж из кортежа:
    type MyFunc = <N extends string[]>() => {
        [K in keyof N]: N[K] extends string ? Field<N[K]> : never;
    };
    
    myFunc<["town", "city"]>()


    Ну и в реальном коде гораздо удобнее, когда дженерик выводится из аргументов, а для того что бы TS сам вывел кортежный тип из абстрактного массива, данный массив нужно помечать as const, что так же делает его readonly массивом. Но принимать аргументы через readonly там где нам не нужно их мутирорвать - это вообще хорошая практика. Полный пример будет выглядеть так:
    https://www.typescriptlang.org/play?#code/C4TwDgpg...
    Ответ написан
    Комментировать
  • Unity. Взаимодействие с объектами?

    GavriKos
    @GavriKos Куратор тега Unity
    Нужно смотреть скрипты, которые на второй сцене. Какой то из них (возможно даже стандартный юнитевый) прячет курсор.
    Ну и убедитесь что у вас нигде нет чего то вроде Screen.showCursor или Cursor.visible
    Ответ написан
    2 комментария
  • C#. Что лучше: PictureBox или Paint?

    yudinikita
    @yudinikita
    Инженер-программист из России
    Я считаю, что нужно сначала пытаться отобразить шарики изображением, а если по какой-либо причине картинки не загрузились, то рисовать их.
    1. Создаем переменную с изображением
    Bitmap ImageBall;
    2. При инициализации формы с игрой пытаемся загрузить в эту переменную изображение
    try
    {
        ImageBall = new Bitmap("путь до изображения");
    }
    catch (Exception ex)
    {
        MessageBox.Show(@"Не удалось загрузить: " + ex.Message, @"Ошибка при загрузке изображений!");
    }

    3. Во время генерации шарика, мы проверяем, что изображение загрузилось, иначе рисуем сами
    Bitmap bmp = new Bitmap(50,50);
    Graphics gr = Graphics.FromImage(bmp);  // это пространство на котором рисуется игра
    Rectangle rect = new Rectangle(0,0,50,50); // размер шарика
    if(ImageBall == null) // если картинка не загрузилась
    {
        gr.DrawEllipse(new Pen(Color.Black), rect); // рисуем круг
    }
    else
    {
        gr.DrawImage(ImageBalls, rect); 
    }

    5. Помещаем в PictureBox наш шарик нарисованный или с картинкой
    pictureBox1.Image = bmp
    Ответ написан
    4 комментария
  • C#. Как сохранить информацию между формами Windows Form?

    petermzg
    @petermzg
    Самый лучший программист
    Вариантов полно:
    1. Передать ссылку на экзепляр класса основного окна формы, через конструктор при создании другого окна.
    2. Передать делегат на функцию, также через конструктор
    3. В классе зависимого окна создать event и подписаться на него после создания.
    и т.д.
    Ответ написан
    4 комментария
  • Как в c# сделать так, чтобы ввод с клавиатуры запоминался в одну строчку?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    нет прямых аналогов, строку придется парсить
    к примеру Split через пробел (ну или ожидаемый набор возможных разделителей), и парсинг ожидаемых типов значений, типа Int32.TryParse (метод реализован для всех основных числовых типов)
    Ответ написан
    Комментировать