цифровая электроника
вычислительная техника
встраиваемые системы

 

Как программировать Raspberry Pi на языке C

Автор: Mike(admin) от 31-10-2017, 19:55

Одноплатный компьютер Raspberry Pi зачастую программируют на языке Python. Но это вовсе не значит, что данный миникомпьютер нельзя программировать на каком-либо другом языке.


Как программировать Raspberry Pi на языке C

Среди матерых программистов очень популярен язык C, и этот язык можно с успехом использовать в написании программ для Raspberry Pi. В данном материале будет показано, как это осуществить.

Реализация простого планировщика задач

Автор: Mike(admin) от 19-08-2014, 06:55

При создании операционной системы или реализации ее отдельных элементов во встраиваемом приложении важны знания о планировщике задач. Этот сервис позволяет запускать другие программы или задачи в зависимости от конкретных событий. К ним можно отнести, например, наступление определённого времени, переход операционной системы в определенное состояние, поступление запроса через пользовательский интерфейс.


планировщик задач

Приведенный код планировщика задач полезен для знакомства с данным механизмом. Он представляет собой планировщик по методу round-robin, написан на языке C и удобен при отладке на ПК, поскольку содержит приличное количество команд вывода данных на экран printf.

Конечный автомат на C

Автор: Mike(admin) от 10-02-2014, 04:55

При программировании приложений для встраиваемых систем удобно пользоваться конечными автоматами.


конечный автомат

Они дают ряд преимуществ:


  • Вы можете перевести требования системы в диаграмму состояний или в таблицу состояний переходов.

  • По диаграмме состояний или таблице состояний переходов вы можете проверить правильность проекта до написания программы.

  • Это облегчает понимание кода.

  • Вы можете быстро сопоставлять друг с другом код и требования к системе.

  • Обеспечивается детерминизм, то есть вы сможете точно знать, что делает система в определенный момент.

При использовании автоматного подхода важно грамотно организовать конечный автомат у себя в коде. Поэтому ниже приводится шаблон конечного автомата, написанный на языке C. Он не сложен и позволяет понять принцип работы конечных автоматов. Овладев этим инструментом, его в последствии можно будет масштабировать на более сложные программные архитектуры.

Программная реализация часов реального времени

Автор: Mike(admin) от 25-01-2014, 13:57

Часы реального времени (Real Time Clock или RTC) являются полезным элементом в случае, когда нужно вести учёт хронометрических данных. Но, к сожалению, не во всех вычислительных устройствах есть этот элемент.


часы реального времени

Тем не менее, RTC можно попытаться реализовать программным способом, что и представляет собой код, приведенный ниже.

Срежьте жирок с AVR-GCC кода

Автор: Mike(admin) от 8-12-2013, 09:15

Хотя использование AVR-ассемблера позволяет легко писать компактные по размеру кода программы, все же использование языка C и AVR Libc дает больше удобств. В этой статье будет показано, как написать код на C, который avr-gcc скомпилирует с минимальным размером. Существует ряд руководств по написанию компактного кода для AVR, но ни одно из них не рассматривает вопрос сокращения оверхеда в start-up библиотеке avr-gcc (gcrt1).


avr-gcc

Многие все еще применяют avr-gcc 4.3.3, поскольку он дает более плотный код по сравнению с версиями 4.5.3 и 4.7, но для ниже приведенного примера avr-gcc 4.8.2 дал еще более компактный код, нежели 4.3.3.


Тестовая программа работает со встроенным температурным датчиком ATtiny85 и мигает светодиодом. После компиляции с оптимизацией –Os получаем программу размером 274 байта:


Встроенные функции в C и C++

Автор: Mike(admin) от 14-11-2013, 14:16

Замена вызова функции копией кода этой функции может представлять собой эффективное решение при оптимизации, особенно если скорость выполнения программы является приоритетной целью. Ниже будет рассмотрено, как работает принцип встраивания функций, когда это может быть эффективно и как это может выполняться автоматически в C и C++.


Основы принципа встраивания функций


В первом приближении все настольные компьютеры одинаковы. Поэтому достаточно написать работающее на одной машине приложение, и оно будет работать на любой другой машине. Кроме того, ожидания и требования пользователей ПК в целом схожи. Но встраиваемые системы зачастую сильно отличаются друг от друга, поскольку они имеют различное аппаратное и программное обеспечение, и требования к ним со стороны пользователей также сильно разнятся. Все это довольно интересным образом влияет на разработку программного обеспечения для встраиваемых систем.


Встроенный компилятор, как правило, имеет множество опций для управления оптимизацией. Иногда такой богатый набор вариантов очень важен, в других же случаях все сводится к простому выбору оптимизации по скорости или по размеру кода. Хотя некоторые эмпирические наблюдения показывают, что небольшой код чаще получается медленнее, а для быстрого кода требуется больше памяти.



Программирование на языке C: оптимизация типа integer

Автор: Mike(admin) от 19-10-2013, 12:49

Инженер Фабьен ле Ментек (Fabien le Mentec) привел небольшое исследование, позволяющее лучше оптимизировать работу 8-разрядных контроллеров. Он работал над регулятором напряжения на основе 8-разрядного микроконтроллера ATMEGA328P фирмы ATMEL. Основная логика контроллера была реализована в главной функции main() и зависела от периодического таймера, функционирующего с фиксированной частотой. В обработчике прерывания по таймеру инкрементировалась переменная-счетчик, которая затем использовалась в основной программе для правильной в плане синхронизации работы контроллера напряжения.


тип integer

Посмотрев на код Фабьена, один интересующийся человек отметил, что в этом коде для счетчиков используется тип uint8_t вместо unsigned int, и сказал, что с этим могут возникнуть трудности в рамках данного проекта. Но Фабьен пояснил причины и последствия такого решения.

На самом ли деле ассемблер так хорош?

Автор: Mike(admin) от 28-09-2013, 11:25

Население этой планеты свято верит в то, что ассемблерный код, написанный в тяжелых муках, несмотря на свою времязатратность и высокие требования к навыкам программиста, всегда даст лучший результат. Поэтому ниже будут приведены еретические доводы против подобных заблуждений, и будут представлены случаи, когда язык C в паре с современным хорошим компилятором могут сделать работу лучше.


ассемблерные инструкции

Получение оптимального кода


Всем известно, что лучший способ получить быстрый, компактный код для встроенных приложений заключается в эксплуатации на полную навыков программиста-ассемблерщика. Конечно, программист должен быть знаком с архитектурой конкретного устройства, набором команд и местным ассемблером, и он также должен быть всесторонне проинформирован о задачах данного приложения. Очевидно, что в таком случае компилятор не может конкурировать с таким мастером спорта по ассемблеру, поскольку он не может быть в курсе всех требований приложения.


Это может показаться очевидным, но здесь имеется один неучтенный фактор — человеческая природа. Но мы поговорим об этом ниже.


Советы для разработчиков аппаратного обеспечения при программировании на языке C

Автор: Mike(admin) от 18-09-2013, 13:58

В процессе разработки программного обеспечения зачастую возникают трудности и препятствия, которые требуют придельного внимания и определенных навыков для того, чтобы успешно завершить проект. Последнее, что хочет инженер, это проблемы, связанные с языком программирования. В большинстве случаев во встраиваемых системах используется язык C, и, несмотря на преимущества сред разработки и структурного программирования, время от времени инженеры допускают ошибки, приводящие в конечном итоге к багам и кошмарам при обслуживании продукта. Поэтому ниже приводятся советы, позволяющие избежать их появления.


Совет 1 — не используйте goto


Примерно пару десятилетий назад, когда компьютерное программирование, каким мы его знаем сегодня, пребывало в состоянии младенчества, последовательность выполнения программ в первую очередь определялась командой goto. Она позволяет перепрыгнуть с одной части кода к другой. Вот как это выглядит:


использование goto

Листинг 1 — использование goto