Ответы пользователя по тегу C
  • Почему невозможно получить доступ к каталогу?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему ls не работает

    потому что main в процессе демонизации меняет текущий каталог на /. Если запускать его с полным путём (например ./main `pwd`/mntpoint) -- то становится лучше. Но всё ещё не работает, потому что при использовании обработчиком запроса на доступ к каталогу этого же самого каталога происходит бесконечная рекурсия и исходный запрос не завершается.
    Лучше спроси, как я это понял.
    Ответ написан
  • С чего начать, чтобы написать свою библиотеку по загрузке бинарника в микроконтроллер?

    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 комментария
  • Почему библиотека не ставится?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пытаюсь поставить библиотеку, не получается
    почему?
    file INSTALL cannot find
    "/home/durachok/HTTPParser/build/_deps/ethernet-src/include/Ethernet.h": No
    such file or directory.


    Потому что здесь написана какая-то фигня, ссылающаяся на несуществующий файл.
    Ответ написан
    Комментировать
  • Не могу понять почему не работает USER тред?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему не работает USER тред?

    Потому что, опять, ты вызываешь makecontext не задав uc_link. thread_func1 отрабатывает, а дальше гонка между вызовом thread_func2 из monitor_thread и завершением программы из-за возврата из функции контекста в контексте созданном с uc_link == NULL.

    Но и без этого код выглядит загадочно. Непонятно зачем мешать в одну кучу контексты и clone. Непонятно зачем дублировать указатель на функцию в Thread::func и в Thread::context. Непонятно зачем контексты, если schedule их не использует. Непонятно, зачем monitor_thread занимается активным ожиданием Thread::active. Непонятно, зачем функции потоков лезут в потроха Thread. Короче, этому коду не хватает идеи.
    Ответ написан
  • Почему не печатается?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не печатается "custom thread completed"

    Потому что thread->context.uc_link = NULL; в строке 27, а, согласно man swapcontext:
    If the successor context pointer is NULL, the thread exits.


    Исправить можно, например, так:
    int custom_thread_create(custom_thread *thread, ucontext_t *link, void (*start_routine)(void*), void *arg) {
        …
        thread->context.uc_link = link;
        …
    }
    …
        ucontext_t main_context;
        getcontext(&main_context);
    
        if (custom_thread_create(&thread, &main_context, print_message, (void*)message) == 0) {
    …
    Ответ написан
  • Где найти такую CLI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хочется как-то отойти от указания всех параметров а считать что есть некий контекст.

    Я вот так делаю в подобных случаях. Т.е. загружаю конфигурацию из конфиг-файла если он есть, а потом поверх неё -- из параметров командной строки. Среди которых могут быть другие конфиг-файлы.
    Ответ написан
    Комментировать
  • Как скомпилировать код C в .ko?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Пробую собрать bmminer-cgminer492, ошибка при сборке. Каких зависимостей не хватает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    получаю следующую ошибку

    судя по тексту ошибок, всего хватает, но ошибки в коде. Я бы в cgminer.c добавил #include <inttypes.h>
    Ответ написан
    Комментировать
  • Почему waitpid() возвращает ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему waitpid возращает такую ошибку?
    waitpid: No child processes

    Потому что он вызывается как в родительском, так и в дочернем процессе. В родительском процессе он работает успешно, а у дочернего процесса waitpid вызывается с pid == 0, а такого процесса точно нет.
    Ответ написан
  • Avr-gcc почему не работает обращение к полям структуры по индексу в цикле?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    если просто вручную написать обращение по индексу, то всё работает корректно
    Почему такое может быть

    Если посмотреть в сгенерированный код (я компилировал командой
    avr-gcc -mmcu=atmega2560 -DF_CPU=8000000 -fverbose-asm -S test.c
    ), то можно увидеть, что он не обращается к массиву power_5v, а все константы просто подставлены как непосредственные значения в инструкции. Я думаю, что по этой причине.

    как это исправить

    Нужны детали: версия компилятора, опции компиляции.
    Ответ написан
    Комментировать
  • Почему нет ошибок, но ничего не выводит?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    struct message{
        int id;
        char* data;
    };
    …
    send(fds[i].fd, &msg, sizeof(msg), 0)

    Этот send отправляет клиенту не данные, а указатель. Указатель на данные, которых у клиента нет.

    // Add new socket to poll array
                fds[nfds].fd = new_socket;
                fds[nfds].events = POLLIN;
                nfds++;
            }
     
            // Check for data from clients
            for (int i = 1; i < nfds; i++) {
                if (fds[i].revents & POLLIN) {


    Здесь ты добавил сокет в массив дескрипторов полл и сразу проверяешь, не установлен ли у него revents. Но это поле в этот момент не инициализировано. Мало того, ты просишь ожидать POLLIN, но клиент никогда ничего не отправляет серверу, поэтому и сервер не дождавшись POLLIN никогда ничего не отправляет клиенту.

    struct pollfd fds[1];
        fds[0].fd = sock;
        fds[0].events = POLLOUT;
        if (poll(fds, 1, -1) <= 0) {
            perror("poll failed");
            exit(EXIT_FAILURE);
        }
        if (!(fds[0].revents & POLLOUT)) {
            perror("connect failed");
            exit(EXIT_FAILURE);
        }
    
        // Receive message from server
        while ((valread = read(sock, &msg, sizeof(msg))) == -1 && errno == EAGAIN);


    Здесь ты ждёшь до POLLOUT, но после этого начинаешь читать. Это малость нелогично, потому что наличие данных для чтения показывается флагом POLLIN. POLLOUT же на свежеустановленном соединении есть сразу, поэтому чтение тупо вертится в цикле while пока не прийдут данные.

    как это можно попробовать подебажить понять что не так, что происходит

    Можно тупо повставлять печать в ключевые места, что да, соединение установлено, соединение принято, полл завершился успехом, данные отправлены, данные приняты.
    Ответ написан
    Комментировать
  • STM32 ловит HardFault_Handler на операторе += как починить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вопрос номер раз: как такое вообще произошло?

    Насколько я понимаю STM32F207xx не поддерживает инструкцию uxtah, потому что это инструкция Thumb2 не реализованная в CortexM3.

    Вопрос номер два: как такое фиксить?

    Подозреваю, что ключом -march=, вероятно -march=armv6.
    Ответ написан
    1 комментарий
  • Почему он пишет что оно не shared? OPENMP?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    На что он ругается?

    На то, что ты в прагме сказал, что будешь редуцировать в norm_b_square, а в цикле работаешь с *norm_b_square. А если ты имел в виду одноимённый norm_b_square из функции main, то нет, нельзя так сослаться на автоматическую переменную из другой функции.

    Вся эта задумка сделать автоматическую переменную в одной функции shared а потом в другой функции с ней работать по указателю нерабочая. Либо работай с ней в той же самой функции, либо выноси её за пределы функции.
    Ответ написан
    Комментировать
  • Почему поведение fscanf ( stdin, "%c", &c ) различается при чтении EOF в msvc и gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    После ввода Ctrl+Z и нажатия Enter, если я правильно понимаю, в потоке появляется только EOF и символ новой строки.

    Это странное заявление. Потому что "конец файла" стандартом С (конкретно, С99) определяется так: end-of-file, that is, no more input from a stream. Это значит, что ни EOF как символ, ни что бы то ни было после конца файла прочитано быть не может. Если чтение работает (т.е. функции чтения не возвращают ошибок, либо ошибки не указывают на конец файла), то конец файла не достигнут.

    Сравните поведение этих программ при обычном запуске и при запуске с перенаправлением ввода из пустого файла. Если есть разница, то это может указывать на то, что нажатие Ctrl+Z в cmd не вызывает закрытие потока ввода для процесса.
    Ответ написан
  • Почему strcat перезаписывает переменные?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему так происходит?

    Потому что str и word -- это переменные размером в один символ, а в строке char delimeters[6] = " .,!?;" отсутствует 0-терминатор. Поэтому
    - scanf("%s", &str); вылезет за пределы str если ввести здесь что угодно.
    - strcat(&word, &c); вылезет за пределы word если в c будет не пустая строка. А в c будет неизвестно что, потому что c = getchar() не добавляет в эту строку 0-терминатор.
    - strchr(delimeters, c); может вернуть что угодно, если c не входит в delimiters.
    Ответ написан
    8 комментариев
  • Почему компиляторы не используют инструкции повторения REP movs?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему компиляторы не используют инструкции повторения REP movs?

    чего это "не используют"? Используют.

    Она должна быть в миллиард раз быстрее

    Инструкция которую не нужно читать из памяти, но которая сама лезет в память дважды на каждом цикле своего выполнения не может быть "в миллиард раз быстрее" других реализаций той же логики.
    Ответ написан
    Комментировать
  • Почему ptrace если не через execl не работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Потому что PTRACE_TRACEME не останавливает вызывающий процесс, а значит у родителя нет возможности заказать остановку по системному вызову. Останавливают трассируемый процесс только сигналы и явно запрошенные трассировщиком события.
    В частности, вызов execve трассируемым процессом вызывает отправку ему сигнала SIGTRAP.
    Можно вставить перед 20й строкой какой-нибудь asm volatile ("int3"); и это тоже вызовет доставку сигнала, останов и трассировку последующих вызовов write.
    Ответ написан
  • Как сделать вызов функции из терминала чтобы обработчик динамически искал и вызывал функцию?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    обработчик динамически ищет и выполняет функцию

    У этой задачи есть два больших класса решений -- системно-независимые и системно-зависимые, в зависимости от дополнительных условий. Для начала надо ответить на вопрос "где ищет". Если ответ на этот вопрос -- "в твоём приложении", а набор функций фиксированный, то можно построить отображение "имя функции" -> "адрес функции" с использованием какого-нибудь массива или хеш-таблицы и искать с его помощью.
    Если набор функций не фиксирован во время сборки приложения, или искать надо за пределами приложения, нужно ответить ещё на один вопрос: "знают ли функции о том, что их будут выполнять или нет". Если знают -- опять же построить отображение "имя функции" -> "адрес функции" и каким-нибудь образом сделать его доступным приложению. Если речь идёт о вызове произвольных заранее неизвестных функций, остаётся вариант с динамической загрузкой и поиском имён -- dlopen/dlsym или LoadLibrary/GetProcAddress для венды.
    Ответ написан
    Комментировать
  • Как правильно посчитать время выполнения fread/fwrite (gcc)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как правильно посчитать время выполнения fread/fwrite
    Нужно посчитать время чтения и время записи одинакого размера блока данных на диск.
    Причем, время момента, когда данные окажутся на диске

    fread/fwrite -- плохой выбор для этого, потому что это функции библиотеки C, т.е. между ними и ядром ОС ещё один слой абстракции.

    Я правильно понимаю, что fclose(f) закрывает файловый дескриптор f после того как данные записаны на диск?

    Неа. Тот кто читает маны должен приучаться делать это до конца. В случае fclose -> fflush там написано следующее:
    Note that fflush() flushes only the user-space buffers provided
    by the C library.  To ensure that the data is physically stored
    on disk the kernel buffers must be flushed too…


    нужна функция get_time_func()

    Стандартный способ -- clock_gettime, в качестве clockid думаю подойдёт CLOCK_MONOTONIC_RAW.
    Ответ написан