Использование BCM2835 с ядром RT-PREEMPT
Я делаю проект, который посылает сигнал 40 кГц от антенны. Я обнаружил, что сигнал не слишком точный, поэтому я решил попробовать ядро в реальном времени.
Я использую Raspbian Jessie на своем Raspberry-Pi 2B. После чистой установки скрипт запускается без проблем. bcm2835_delayMicroseconds может быть запущен.
Я следую этому уроку http://www.frank-durr.de/?p=203 скомпилировал и установил ядро RT. Однако сценарий больше не может быть успешно запущен. После показа "ВЫСОКИЙ СОН", и он задерживается.
Это фрагмент кода:
fprintf(stdout , "HIGH\n");
bcm2835_gpio_write(PIN, HIGH);
fprintf(stdout , "SLEEP\n");
bcm2835_delayMicroseconds(12);
fprintf(stdout , "LOW\n");
bcm2835_gpio_write(PIN, LOW);
fprintf(stdout , "SLEEP\n");
bcm2835_delayMicroseconds(12);
Я что-то пропускаю при компиляции ядра?
2 ответа
Я только что видел и запомнил эту тему. Около полугода назад я хочу генерировать 40 кГц из малины. Но в конце концов я обнаружил, что использую не тот инструмент. Я считаю, что Raspberry не может справиться с такой задачей, поскольку она работает под управлением ОС. Я перешел на Arduino, и проблема сразу решается без проблем. Использование правильного инструмента для вашей задачи очень важно!
Чтобы использовать PREEMPT_RT, вам просто нужно:
- получить конфигурацию вашего текущего ядра
- получить исходные коды ядра
- исправьте исходные коды ядра с помощью исправления PREEMPT_RT (или получите уже исправленное ядро)
- настроить новое ядро как текущее ядро (т. е. используя
make oldconfig
) - включить полную предопределенность в конфигурации ядра (например, запустив
make menuconfig
). - скомпилировать ядро стандартным способом
- установить новое ядро
Поэтому никаких конкретных действий не требуется.
Затем, если производительность все еще недостаточна, вы можете настроить приоритеты конкретных потоков IRQ.
Из вашей конкретной ошибки кажется, что новое ядро было скомпилировано с конфигурацией, отличной от текущей (например, GPIO не включены).