Подскажите какую книгу лучше прочитать дабы лучше понять язык C и устройство ЭВМ. Как работает компилятор, что делает препроцессор, что такое связывание, раннее, позднее, динамическое, символы. Как в ЭВМ происходит выделение памяти, что происходит при вызове функции.
Что-то у меня ум за разум заходит. Не удаётся написать тривиальную программу для Arduino UNO. Хочу чтобы светодиод (который на ноге digital 13) моргал.
Алгоритм такой. Есть таймер, который каждые N миллисекунд вызывает прерывание, где добавляет 1 к переменной-счётчику. В основном цикле крутится проверка значения этой переменной. Если значение достигло некоторой величины, то меняем уровень сигнала на digital 13, и обнуляем переменную-счётчик. Вроде бы всё просто, но не работает. ЧЯДНТ?
Да, Arduino, конечно, offtopic на linux'овом сайте. Но надеюсь мне кто-нибудь поможет.
Вот код:
#include <avr/interrupt.h>
int status; // Глобальная переменная в которой лежит состояние светодиода, горит-не_горит.
int tick_counter; // Переменная-счётчик вызовов прерывания.
void init (void) {
cli(); // Запрещаем все прерывания на время инициализации.
DDRB |= (1<<PB5); // Set D13 as output pin.
//PORTB |= (1<<PB5); // Set D13 level high.
status = 0;
tick_counter = 0;
OCR0A = 65535;
TIMSK0 |= (1<<TOIE0); // Включаем прерывание по достижению Timer/Counter0 значения OCR0A.
TCCR0A |= (1<<WGM01) | (1<<WGM00); // Работаем в режиме FastPWM.
TCCR0B |= (1<<WGM02) | (1<<CS02) | (1<<CS00); // Делитель 1/1024. С таким делителем и OCR0A прерывание будет вызываться примерно каждые 4 мс.
sei(); // Закончили инициализацию, разрешаем все прерывания.
}
void run() {
while(1) {
if (tick_counter >= 5) {
if (status == 1) {
PORTB &= ~(1<<PB5);
status = 0;
}
else {
PORTB |= (1<<PB5);
status = 1;
}
tick_counter = 0;
}
}
}
ISR(TIMER0_OVF_vect) {//Обработка прерывания по переполнению Timer/Counter0
tick_counter++;
}
int main(void) {
init();
run();
return 0;
}
Дорогие друзья, напишите кто-нибудь, пожалуйста, новость про выход свежей версии Upstart'а. Сам я не специалист в системах иницилазации. Кроме того я не нашёл release notes или changelog'а. Запишем это Upstart'у в минус.
Есть железка Mele A2000G, в ней стоит ARM'овский процессор Allwinner A10, в нём есть графическое ядро Mali-400. В характеристиках заявлено, что имеется возможность аппаратно кодировать и декодировать h264 и MPEG. Подозреваю, что планшеты с Android'ом на том же чипе даже это используют. Ещё есть открытый драйвер для Mali под названием Lima, с которым даже удалось запустить Quake III.
Скажите, а в Ubuntu возможно использовать аппаратное кодирование/декодирование видео, или приходтся об этом пока только мечтать?
Поскольку минорная версия в которой только исправлены баги и ускорены некоторые места в программе даже на мини-новость для главной страницы не тянет, но всё же я считаю нужным объявить об этом здесь. 3 марта вышла новая минорная версия планировщика заданий Fcron.
Fcron является несомненно самым гибким в семействе подобных программ (vixie-cron, dcron, anacron). Имеет удобный синтаксис конфигурационного файла, который помимо стандартных «запускай в такое-то время» и «запускай каждые Nчасовминут» позволяет создавать задания видя «запусти с 1 часу ночи до 5 утра как только load упадёт ниже 3.0» или «запусти в случайный момент между 16:00 и 19:35», а так же многие другие. Конечно всё это можно реализовать стандартным vixie-cron'ом и bash'евскими сценариями, но зачем городить костыли.
Выход очередной версии означает, что проект жив и развивается.
Для меня остаётся загадкой почему Fcron до сих пор не стал планировщиком по умолчанию в большинстве дистрибутивов GNU/Linux, ведь он реально превосходит vixie-cron по удобству и возможностям, и не уступает по надёжности.
Кто-нибудь может хотя бы дать ссылку на описание успешной истории вытрясания из Почты РФ посылки из DX, а лучше ещё и получения с них компенсации за нарушение сроков доставки? Есть истории как удавалось вытрясти деньги когда посылало частное лицо, но там всё начиналось с подачи заявления с:
номером отслеживания (трекинг)
копией чека за оплату почтовых услуг
формой CP72
Первое есть, а с последними двумя пунктами загвоздка. Звонил в DX, там китаянка обещала подать заявление на розыск с их стороны. Это, конечно, хорошо, но подозреваю на такое заявление откуда-то из Китая на Почте РФ наплюют или пришлют отписку. В любом случая я не смогу оказывать довление и капать на мозг как в этой истории. Кроме того я не смогу вытрясти из Почты РФ компенсацию за нарушение сроков доставки, а очень хочется, для острастки, так сказать.
Update: по телефону горячей линии оператор Елена сказала, что для подачи заявления на розыск достаточно копии invoice и трекинг.
В Gstreamer'е у всякого элемента можно вызвать весьма полезный итератор iterate_pads() или iterate_sink_pads(). У этого итератор есть метод next() без которого использование его лишено смысла. Однако в качестве параметра этот метод принимает GLib.Value, соответственно в соответствующее место в памяти этот метод next() кладёт GLib.Value, а не Gst.Pad. По-простому преобразовать GLib.Value к Gst.Pad не получилось, возможно это надо делать каким-то специальным методом. Каким, спрашивается? Кто-нибудь может показать пример использовать итераторов в Vala и GStreamer (на Vala)?
На фоне бурного расцвета этих ваших ARM'ов хочется узнать как дела у другой «альтернативной» архитектуры, у MIPS'а?
Когда-то у меня был ноутбук на MIPS'е (Альфа-400), кажется на MIPS'е был первый планшет способный проигрывать FullHD, возможно Столман до сих пор пользуется ноутбуком на MIPS'е, изредка проскакивают новости о выпуске каких-то системных плат с MIPS'ом и поддержкой PCIexpress, DDR2 и других более-менее привычных комплектующих, но это капля в море по сравнению с потоком новостей про ARM. Свежих новостей про MIPS как-то не слышно. Неужели пациент скорее мертв, чем жив? А ведь MIPS изначально разрабатывался как архитектура для «серьёзных» вычислений и суперкомпьютеров, в отличие от энергоэффективного ARM'а.
На ARM'е, тем временем, помимо ноутбуков и планшетов можно настольную машину сделать задёшево. Например из Mele A2000G. А где пощупать живой MIPS?
На главной странице ресурса под видом новости висит какой-то уютный чатик. Зачем заблокирована возможность отправки комментариев для посетителей ресурса не пояснено.
Как в Vala использовать функцию на C? Знаю, что можно воспользоваться словом extern, но есть ещё вопросы.
У меня есть функция, которая принимает 2 параметра: gchar* и GHashTable*. В первом лежит имя файла, а по второй ссылке GHashTable в который эта функция кладёт всякие штуки. В Vala указателей нет, есть ссылки (reference). Как мне имея строку с именем файла и объект HashTable передать их в extern функцию?
А ещё, как это всё собирать/канпелять? С какими опциями запускать valac если в файле есть внешние функции из C?
Функция poll() не завершается пока не происходит событие на которое настроено прерывание. Когда это событие происходит выполнение poll() завершается, выполняется какая-то полезная функция, после чего снова переходим к функции poll() и ожидаем события.
А теперь вопрос, как это сделать с использованием GLib, желательно даже на Vala, но и на C пойдёт.
Правильно я понимаю, что «вместо» while (1) будет GMainLoop? Правильно ли я понимаю, что нужно в каком-то контексте завести источник событий (GIOSource?) ? А ещё нужно к чему-то прицепить g_source_add_poll() и g_source_set_callback(). Может кто-нибудь показать пример кода?
Если я подключаю USB'шную камеру, то в системе она видится как /dev/video0. Если я GStreamer'ом беру с неё поток данных, то это video/x-raw, хотя я подозреваю, что камера на самом деле передаёт по USB поток сжатый каким-то кодеком, возможно mpeg2 или mpeg4, а распаковкой его занимается драйвер (возможно сильно неоптимальным способом). Прав ли я? Можно ли получить необработанный поток данных чтобы самому с ним что-то делать, например писать на файловую систему, или передавать по сети, или распаковывать аппаратным декодером.
Как в Vala разбивать программу на множество мелких файлов? В C и C++ для этого были заголовочные файлы и #include'ы, а собственно исполняемый код можно было писать почти в произвольном порядке и разбивке по файлам. Ещё можно было в заголовочном файле объявить класс и его методы, а определение сделать в другом файле.
В Vala, насколько я смог понять, нет опции #include, нет заголовочных файлов, определение метода нельзя вынести за пределы его объявления. В результате классы у разрастаются, программа разрастается ещё больше, заповедям написания «чистого» кода это совершенно противоречит. Что же делать? С++ не предлагать.
Получается, что мне чтобы вызывать метод недостаточно знать, что он был определён в родительском классе, но точно знать, что в каком из классов иерархии наследования он был определён. Это так?
Помимо того что это лишняя головная боль, не является ли это нарушением принципов ООП?
Почему в многоэтажках пол холодный? Ведь этажом ниже тоже есть квартира, и в ней топят, и в ней тёплый воздух поднимается к потолку, значит должен греть мой пол.
Что такое индексы в файле? Читая индексы видеопроигрыватель может определить как долго длится видеофрагмент в файле? Дело в том, что моя программа испльзующая GStreamer создаёт файлы, если я правильно понимаю, без индекса. Их нельзя перематывать, а при воспроизведении не показывается сколько осталось до конца. Как это исправить? Я смотрел свойства элементов, у них у всех has no indexing capabilities. Единственно, у matroskamux есть свойство min-index-interval, но установка его в значение 0 или 1000000 ничего не меняет. Как заставить gstreamer проиндексировать файл?
Как в программе использующей GStreamer понять, что пропал сигнал с IP'шной камеры (ASF'ной или RTSP'шной)?
То есть предположим у меня в сети есть камера отдающая поток RTSP, на сервере крутится программа с gstreamer'овским pipeline'ом. Как понять, что поток данных прекратился? Например из-за отключения камеры.
Отлов сообщения GST_STREAM_STATUS_TYPE_LEAVE не подходит, поскольку внутри программы есть елемент tee к котором то подключаются, то отключатся «потребители», а указанное сообщение проходит по шине сообщений если кто-то отключается, что вовсе не означает отключения камеры и остановки всех элементов.
Если камера отключилась, то перейдут ли какие-нибудь элементы из состояния PLAYING в PAUSED или NULL? Какие элементы? source, demux? Вызываются ли при этом какие-то сигналы или выдаются сообщения? Может у source'а или demux'а какие-то pad'ы должны отвалится? Вообще, при каких условиях они отваливаются?
Предположим, что у меня есть интернет-кафе на 20 мест. Конечно же я хочу минимизировать расходы, потому ставлю один терминальный сервер и 20 тонких терминалов. Можно ли на этих терминалах использовать всякие эффекты задействующие видеокарту? Будет ли видеокарта терминального сервера использоваться при проигрывании видео? Или видеокарта такой ресурс, который невозможно делить?
Причём я уверен, что декодирование у меня делается нормально, потому что если вставить xvimagesink вместо queue перед энкодером, то на экране я увижу картинку с камеры, то есть до video/x-raw я нормально декодировал, а потом пытаюсь закодировать и муксить в mp4, но не достигаю успеха. ЧЯДНТ?
Помогите разобраться в каких случая при работе с GLib и GObject происходит выделение памяти. Правильно я понимаю, что объект уничтожается когда количество ссылок на него становится равных 0? При этом высвобождается занимаемая память. Если я вызываю unref(), то количество ссылок уменьшается на 1. А в каких случаях оно растёт? Что происходит со ссылками, если я вызываю remove() или destroy() ? Есть какие-то руководства по этому делу?