Задать вопрос
  • Как заставить digispark вводить alt-коды?

    jcmvbkbc
    @jcmvbkbc
    Ridalit, если ты внимательно посмотришь в приведённый по твоей ссылке пример:
    DigiKeyboard.sendKeyStroke(KEY_N, MOD_CONTROL_LEFT|MOD_SHIFT_LEFT);

    то увидишь, что это клавиши-модификаторы могут быть объединены через побитовое или, а не клавиши основного набора. Это имеет смысл, потому что модификаторы определены как непересекающиеся биты, в отличие от основных.
  • Как заставить digispark вводить alt-коды?

    jcmvbkbc
    @jcmvbkbc
    функция digikeyboard.sendKeyStroke в которую я передаю (MOF_ALT_LEFT, 94 | 95) не выводит символ

    94 | 95 == 95, чего ты ожидал?
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    jcmvbkbc
    @jcmvbkbc
    Я смотрел дефайны этих портов, там просто хекс-значение, без какого либо каста к volatile ссылке, видимо это делается непосредственно компилятором

    djEban, Нет, не делается. Здесь нет никакой магии, всё должно быть написано явно. Ты не привёл полный компилируемый код и опции компилятора, поэтому я напишу его сам и возьму опции на своё усмотрение. Смотри, что получается после препроцессора и после компилятора если взять atmega88p в качестве таргета. А если в опции добавить -dM то можно увидеть как определен PORTB:
    #define PORTB _SFR_IO8(0x05)
    …
    #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
    …
    #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
  • В чем возникает проблема при работе с драйвером порта - UART4?

    jcmvbkbc
    @jcmvbkbc
    Вызов serial8250_em485_stop_tx из serial8250_console_write не проверял.

    Проверь пожалуйста? Моя теория: добавление dev_err приводит к вызову этой функции, которая должна и так вызываться из обработчика прерывания, но почему-то не вызывается, возможно из-за гонки между прерыванием и окончанием TX DMA.

    Отключили опцию CONFIG_SERIAL_8250_CONSOLE (я так понял она отключает DMA

    Rarebeast666, я не вижу прямой связи этой опции с DMA. Правда и прямого указания использовать/не использовать DMA я не вижу. Мне кажется, проще всего отключить DMA в коде, например здесь заменить up->dma = &data->data.dma; на up->dma = NULL;.
  • В чем возникает проблема при работе с драйвером порта - UART4?

    jcmvbkbc
    @jcmvbkbc
    не проще ли использовать отдельный пин, который включать перед передачей и выключать сразу после окончания передачи.

    Так именно это же и происходит в драйвере.
  • Как в С++ проверить double на целочисленность?

    jcmvbkbc
    @jcmvbkbc
    пожалуйста.


    3xa1t3d а, так ты думаешь, что (4 - 2.1) / 0.1 -- это целое число? Увы, нет. Давай я тебе немного помогу:

    #include <cmath>
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int isInteger(double value)
    {
    
      cout << value << "///" << round(value) << endl;
    
      return !(value == trunc(value));
    }
    
    int stepSize_check(double step, double startNum, double endNum) 
    {
      double mod;
    
      mod = (endNum - startNum) / step;
    
      cout << "mod: " << std::setprecision(20) << mod << endl;
    
      if (isInteger(mod))
        return (1);
      return (0);
    }
    
    int main()
    {
    
      double a = 2.1;
      double b = 4;
      double h = 0.1;
    
      cout << "result: " << endl << stepSize_check(h, a, b) << endl;
    
      return (0);
    }


    result: 
    mod: 18.999999999999996447
    18.999999999999996447///19
    1


    В этом конкретном случае проблема в том, что ни 2.1, ни 0.1 непредставимы конечными дробями в двоичной системе.
  • Как в С++ проверить double на целочисленность?

    jcmvbkbc
    @jcmvbkbc
    Этот шаг должен удовлетворять условию, что: ((startingPoint - endPoint) / step) = целочисленный. При startingPoint < endPoint.

    3xa1t3d, слушай, ты хотел функцию с единственным параметром, делающую конкретное действие. В моём ответе именно эта функция. Приведи конкретный пример, когда эта функция возвращает не то, что обещает. Очевидно, что такой пример у тебя есть, раз ты говоришь, что "не сработало".
  • Как в С++ проверить double на целочисленность?

    jcmvbkbc
    @jcmvbkbc
    сравнив trunc(2.4) и int num = 2 мы получим истину?

    3xa1t3d, да. Приведённый код, однако, сравнивает trunc(2.4) с double num.
  • Не работает код, что делать?

    jcmvbkbc
    @jcmvbkbc
    т.е. я bx умножаю на cols

    результат остался в ax.

    как в итоге перевести сумму в строку?

    делить на основание системы счисления, смотреть на остатки.
  • Не работает код, что делать?

    jcmvbkbc
    @jcmvbkbc
    mul имеет только один операнд, и как в данном случае умножить bx на cols я недопонимаю

    Может, например, посмотреть, что конкретно mul делает и воспользоваться этим знанием? Типа того:
    mov ax, si
    mul cols
    mov bx, ax
  • Не работает код, что делать?

    jcmvbkbc
    @jcmvbkbc
    а в принципе код верный?

    Krimer_infsec, здесь:
    ; Если элемент выше диагонали, сохраняем его индекс в регистре bx
      mov bx, si           ; Загружаем индекс строки в bx
      mov al, cols
      mul al               ; Умножаем индекс строки (bx) на количество столбцов (cols)

    какая-то фигня написана вместо умножения bx на cols.
  • Что делает компьютер, когда получает машинную инструкцию поделить на ноль?

    jcmvbkbc
    @jcmvbkbc
    Компилятор Си в программу, естественно, встраивает проверку этого флага и аварийно завершает.

    Неа. Целочисленное деление на 0 -- это UB, который в правильно написанной программе не происходит, зачем вставлять на него проверку? Аварийно завершает программу ОС если исключение не обработать. Деление на 0 с плавающей точкой вполне определено, но, опять же, проверок со стороны компилятора не требует.
  • Получить вывод команды командной оболочки в переменную makefile?

    jcmvbkbc
    @jcmvbkbc
    При обработке makefile в nmake

    nmake -- это не GNU make (который в тегах). В GNU make вывод команды помещается в переменную так:
    VAR = $(shell команда)
  • Не могу понять почему не работает USER тред?

    jcmvbkbc
    @jcmvbkbc
    MuffinLover, тогда логично было бы
    - не запускать юзер потоки из основного потока
    - помещать указатель на функцию schedule в uc_link перед вызовом makecontext
    - дописать schedule так, чтобы она не возвращалась, а либо переключала контекст на следующий поток, либо (когда нет активных потоков) ждала создания нового потока
    - выкинуть Thread::func
  • В чем преимущества использования С++ в embedded?

    jcmvbkbc
    @jcmvbkbc
    С++, благодаря уже стандартным архитектурным решениям ООП, позволяет сделать это погружение легким

    Мне кажется, что при наличии желания писать нормально, С ничуть не уступает С++ в возможностях выражения абстракции.

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

    Она должна быть отделена в голове проектировщика. Если это есть, то писать на С в таком стиле можно со сравнимыми усилиями. Если этого нет, на С++ можно наворотить такого, что мало не покажется.

    Мне кажется, что основное преимущество С++ -- в наличии STL. Сравнимых по удобству и эффективности библиотек для С решающих базовые организационные вопросы я, к сожалению, назвать не могу.
  • Как удалить коммит из ветки?

    jcmvbkbc
    @jcmvbkbc
    ещё бы указать, что [commit] это идентификатор коммита идущего перед тем, который нужно удалить. Для случая "удалить коммит который идёт перед головным" это можно записать проще как git rebase -i HEAD~2
  • Не могу понять почему не работает USER тред?

    jcmvbkbc
    @jcmvbkbc
    Но он же явно хотел в monitor_thread переключать контексты.

    Об этом можно только догадываться. Может только завершённые контексты? Моя теория: сначала хотел swapcontext, потом придумал Thread::active, потом решил скедулировать когда !Thread::active, а потом понял, что всё равно функция потока должна для этого отработать до конца, а тогда можно и без swapcontext обойтись, короче, в виду отсутствия чёткой идеи реализация поплыла в процессе изготовления.
  • Не могу понять почему не работает USER тред?

    jcmvbkbc
    @jcmvbkbc
    Где вызов swapcontext?

    вон, setcontext есть в основном потоке.
  • Как в Assambler использовать два вывода?

    jcmvbkbc
    @jcmvbkbc
    ItsDelevoper, если ошибка вызвана тем, что слово message написано прямо в функции печати, то очевидный ответ на это: "не надо так делать". Хочешь напечатать сообщение -- передавай адрес строки с сообщением как параметр функции.
  • Как в Assambler использовать два вывода?

    jcmvbkbc
    @jcmvbkbc
    ошибка появится если скопируешь и вставишь message db 'Flex OS' после первого message

    ItsDelevoper, это действие не имеет смысла, потому что две строки с одинаковым именем невозможно будет отличить. Программируя на других языках ты же не пишешь
    string message = "hello";
    string message = "world";
    
    cout << message << ' ' << message;

    а если пишешь, то потом, наверно, не удивляешься ошибкам компиляции?

    Так же и здесь, в чём сложность назвать эту строку не message, а как-то более осмысленно, например banner_message, а другую строку -- по-другому, в соответствии тому, какую функцию она несёт?