Лечим полное зависание ubuntu на asus e502m - e502ma

Posted on 2017-02-16 23:11:26

Да, теперь вы знаете, какой у меня ноут), который вполне меня устраиват, кроме одной мелочи - на сайте производителя доступны драйвера только для windows 10.

Проблема в следующем - на ubuntu 16.10 или на текущей операционной системе - elementary os 0.4 loki время от времени наблюдалось полное зависание системы, вплоть до того, что не реагировала клавиатура, ноутбук по сети не отвечал на пинг. Неприятно, но раньше я этой особенностью не заморачивался. Теперь, когда я решил использовать как основную систему linux, с этой проблемой нужно разобраться.

Первое подозрение - криво работает драйвер видеокарты. Определяем, какая у нас карточка:

lspci -vnn | grep -i VGA

Для ноутбука ASUS E502M должно быть следующее - VGA compatible controller [0300]: Intel Corporation Atom Processor Z36xxx/Z37xxx Series Graphics & Display [8086:0f31] (rev 0e) (prog-if 00 [VGA controller]). Поиск драйверов для linux не увенчался успехом.

В итоге проблема оказалась в процессоре, а именно в его особом режиме энергосбережения "C". Когда он переходил в него, происходило зависание. Лечится редактирование файла /etc/default/grub. В параметр GRUB_CMDLINE_LINUX_DEFAULT добавляем к тому что есть еще строку intel_idle.max_cstate=1. Должно получится что то вроде этого - "GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_idle.max_cstate=1". Выполняем sudo update-grub и перезагружаем систему. Проблема зависания должна исчезнуть.

elementary os freezes

 

 

 

Исправление ошибки компиляции вида cannot find -lбиблиотека

Posted on 2017-02-15 00:36:06

Иногда при компиляции на новой машине, или нового проекта возникают ошибки вида "cannot find -lбиблиотека". Если немного погуглить, то в 99 % случаев вы найдете ответ типа "установите библиотеку sudo apt-get install библиотека". Хотя этот ответ решит вашу проблему, он на самом деле не является таким уж и правильным. Потому что если не вникать в таких ситуациях, может возникнуть проблема, когда на очередную ошибку "cannot find -lбиблиотека" вы  не найдете в гугле ответа, какую же библиотеку нужно установить? Так что куда более правильным ответом будет следующий. На примере "cannot find -lpulse".

Как вы уже догадались, скорей всего в системе не хватает версии  библиотеки "pulse", но это не объязательно. Если выполнить "sudo apt-get install pulse", то ситуация скорей всего не поменяется, потому что нужна development версия пакета. А именно, нужно выполнить "sudo apt-get install libpulse-dev" или "sudo apt-get install libбиблиотека-dev".

Кольцевой буфер в Qt С++

Posted on 2017-02-02 00:32:00

Кольцевой буфер - буфер фиксированного размера, часто применяемый в шаблоне "Поставщик - Потребитель" (Producer-Сonsumer), когда, например, нужно организовать взаимодействие двух асинхронных друг к другу процесса - запись (Producer) и чтение (Сonsumer). Принцип работы кольцевого буфера - когда буфер заполнен, новые данные пишутся в начало. Отсюда и название. В общем, типичное решение в потоковой обработке данных, с которой я столкнулся при  проектировании архитектуры SDR приложения UnoSDR. Вместо кольцевого буфера можно применять очередь (FIFO) QQueue - но при этом уменьшается производительность из - за не фиксированного размера буфера. Если потребитель и поставщик находятся в разных потоках, совместный доступ к буферу нужно защитить с помощью мьютексов, которые не обьязательно должны быть в самом классе. 

Ниже представлен класс кольцевого буфера, реализованный на С++ с применением фреймворка Qt.

class RingBuffer : public QObject
{
    Q_OBJECT

public:
    explicit RingBuffer(quint32 _size, QObject *parent = 0);
    ~RingBuffer();

    void clean();
    bool read(float *data, quint32 len);
    bool write(float *data, quint32 len);
    float getSample();
    void addSample(float sample);
    quint32 availableRead(); // available size read data
    quint32 availableWrite(); // available size write data

private:
    quint32 size;
    quint32 mask;
    quint32 idxRead;
    quint32 idxWrite;
    quint32 dataCount; // available read data size
    float *buf = NULL;
};

 

RingBuffer::RingBuffer(int type, quint32 _size, QObject *parent)
    : QObject(parent),
      size(_size)
{
    mask = size - 1;
    fbuf = (float*) malloc(sizeof(float) * size);
    clean();
}

RingBuffer::~RingBuffer()
{
    free(fbuf);
}

void RingBuffer::clean()
{
    idxRead = 0;
    idxWrite = 0;
    dataCount = 0;
}

bool RingBuffer::write(float *data, quint32 len)
{
    if(availableWrite() < len)
        return false;

    dataCount += len;

    for(int i = 0; i < len; i++)
    {
        fbuf[idxWrite++] = data[i];
        idxWrite &= mask;
    }

    return true;
}

bool RingBuffer::read(float *data, quint32 len)
{
    if(availableRead() < len)
        return false;

    dataCount -= len;

    for(int i = 0; i < len; i++)
    {
        data[i] = fbuf[idxRead++];
        idxRead &= mask;
    }

    return true;
}

float RingBuffer::getSample()
{
    dataCount --;
    float sample = fbuf[idxRead++];
    idxRead &= mask;
    return sample;
}

void RingBuffer::addSample(float sample)
{
    dataCount ++;
    fbuf[idxWrite++] = sample;
    idxWrite &= mask;
}

quint32 RingBuffer::availableRead()
{
    return dataCount;
}

quint32 RingBuffer::availableWrite()
{
    return size - dataCount;
}

Размер буфера должен быть равен степени двойки. Для оптимизации быстродействия, в методах read и write в цикле for можно убрать наложение маски mask, и присваивать новые значения указателем на позицию чтения и записи другим путем.

Нормальным функционированием буфера считается, когда указатель на запись не догоняет указатель на чтение, т.е. потребитель успевает прочитать все данные, сгенерированные поставщиком, а поставщику есть куда писать данные. Другими словами скорость чтения должна быть равна скорости записи информации. И конечно же, нужно отлавливать и обрабатывать ситуации, когда данный принцип нарушается, что бы программа вела себя предсказуемо. Для этого в классе есть два метода - availableRead и availableWrite, которые возвращают количество доступных данных для чтения и размер области буфера, доступный для записи. Эти методы нужно вызывать всякий раз, когда вы пользуетесь другими двумя методами - getSample и addSample. Для оптимизации быстродействия, проверки были выкинуты из классов, так как они могут применятся в цикле. Если нужна запись или чтение блока данных, то можно использовать методы write и read, где уже встроена проверка.

Релиз фреймворка Qt 5.8

Posted on 2017-01-24 00:07:03

Так случилось, что я пристально следил за датой релиза Qt 5.8, которую несколько раз переносили. И вот, наконец, сегодня можно скачать Qt 5.8

Первым делом, я проверил компиляцию моего проекта, который использует OpenGL ES 2.0 - в новой версии Qt значительно переделали рендеринг quick, добавили программный рендеринг, Direct, а так же убрали зависимости OpenGL - это меня очень настрораживало. Но, проект компилируется без ошибок!

Так же, в Qt 5.8 добавили долгожданные quick controls - MenuBar, Menu, SystemTrayIcon, ColorDialog, FontDialog, MessageDialog, FileDialog and FolderDialog и др. Обо всех новых вкусностях вы можете узнать здесь

First 1 2 3 4 5 6 7 8 9 10 11 12 13 Last