Введение

Язык программирования nesC (произносится "NES see") — это компонентно-ориентированный, событийно-управляемый язык программирования, используемый для разработки приложений для платформы TinyOS. TinyOS — это операционная среда, предназначенная для работы на встраиваемых устройствах, применяемых в распределенных беспроводных сенсорных сетях. nesC создан как расширение языка программирования C, где компоненты "соединяются" между собой для запуска приложений на TinyOS. Название nesC является аббревиатурой от "network embedded systems C".

Компоненты и интерфейсы

Программы nesC строятся из компонентов, которые собираются ("соединяются") для формирования целых программ. Компоненты обладают внутренней параллельностью в виде задач. Потоки управления могут поступать в компонент через его интерфейсы. Эти потоки исходят либо из задачи, либо из аппаратного прерывания. Интерфейсы могут предоставляться или использоваться компонентами. Предоставляемые интерфейсы предназначены для представления функциональности, которую компонент предоставляет своему пользователю, а используемые интерфейсы – функциональности, необходимой компоненту для выполнения своей задачи. В nesC интерфейсы двунаправленны: они определяют набор функций, которые должен реализовать поставщик интерфейса (команды), и набор функций, которые должен реализовать пользователь интерфейса (события). Это позволяет одному интерфейсу представлять сложное взаимодействие между компонентами (например, регистрацию интереса к определенному событию, за которой следует обратный вызов при возникновении этого события). Это критически важно, поскольку все длительные команды в TinyOS (например, отправка пакета) не являются блокирующими; об их завершении сообщается посредством события (отправка завершена). Определяя интерфейсы, компонент не может вызвать команду отправки, если он не предоставляет реализацию события завершения отправки. Как правило, команды вызываются "вниз", то есть от компонентов приложения к компонентам, более близким к аппаратному обеспечению, а события вызываются "вверх". Определенные примитивные события привязаны к аппаратным прерываниям. Компоненты статически связаны друг с другом через свои интерфейсы. Это повышает эффективность выполнения, способствует надежному проектированию и позволяет проводить более качественный статический анализ программ.