{"id":319787,"date":"2021-03-17T21:01:10","date_gmt":"2021-03-17T21:01:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=319787"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=319787","title":{"rendered":"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c modbus \u0432 Embox RTOS \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430 STM32 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ix\/pc\/3u\/ixpc3u6nxjpj6k4inncv83cklwu.png\" alt=\"image\" align=\"right\" width=\"300\"><br \/>  \u041d\u0430\u0441 \u0447\u0430\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442, \u0447\u0435\u043c <a href=\"http:\/\/embox.github.io\/\">Embox<\/a> \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u041e\u0421 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, FreeRTOS? \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u041d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u043b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u043f\u043e\u0432\u0435\u0440\u0433\u0430\u044e\u0442 \u0432 \u043b\u0435\u0433\u043a\u043e\u0435 \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Embox? \u0410 \u043a\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438? \u0410 \u0432 Embox \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f modbus? \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u043e modbus \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c Embox \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 modbus server. \u041d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043c. \u0412\u0435\u0434\u044c \u043e\u043d\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 modbus, \u0414\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c\u0438 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 Modbus. \u0414\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ethernet \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modbus\">Modbus<\/a> \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u0428\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u041c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0438 RS-485, RS-422, RS-232 \u0438 \u0441\u0435\u0442\u0438 TCP\/IP (Modbus TCP).<\/p>\n<p>  \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b modbus \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u044e\u0431\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435.<\/p>\n<p>  \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 modbus \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/libmodbus.org\/\">libmodbus<\/a>. \u0415\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0448\u0438\u0431\u043e\u043a. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0438, \u0430 \u043d\u0435 \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<p>  \u041d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c <a href=\"https:\/\/github.com\/embox\/embox_project_modbus_iocontrol\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0432\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h2>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0430 Linux<\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c libmodbus \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c, \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c.<br \/>  \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b Makefile<\/p>\n<pre><code class=\"cmake\">libmodbus-$(LIBMODBUS_VER).tar.gz:     wget http:\/\/libmodbus.org\/releases\/libmodbus-$(LIBMODBUS_VER).tar.gz  $(BUILD_BASE)\/libmodbus\/lib\/pkgconfig\/libmodbus.pc : libmodbus-$(LIBMODBUS_VER).tar.gz     tar -xf libmodbus-$(LIBMODBUS_VER).tar.gz     cd libmodbus-$(LIBMODBUS_VER); \\     .\/configure --prefix=$(BUILD_BASE)\/libmodbus --enable-static --disable-shared; \\     make install; cd ..;<\/code><\/pre>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e prefix \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u0435\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d modbus \u0441\u0435\u0440\u0432\u0435\u0440. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 libmodbus \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<pre><code class=\"cpp\">    ctx = modbus_new_tcp(ip, port);     header_len = modbus_get_header_length(ctx);     query = malloc(MODBUS_TCP_MAX_ADU_LENGTH);      modbus_set_debug(ctx, TRUE);      mb_mapping = mb_mapping_wrapper_new();     if (mb_mapping == NULL) {         fprintf(stderr, &quot;Failed to allocate the mapping: %s\\n&quot;,                 modbus_strerror(errno));         modbus_free(ctx);         return -1;     }      listen_socket = modbus_tcp_listen(ctx, 1);     for (;;) {         client_socket = modbus_tcp_accept(ctx, &amp;listen_socket);         if (-1 == client_socket) {             break;         }          for (;;) {             int query_len;              query_len = modbus_receive(ctx, query);             if (-1 == query_len) {                 \/* Connection closed by the client or error *\/                 break;             }              if (query[header_len - 1] != MODBUS_TCP_SLAVE) {                 continue;             }              mb_mapping_getstates(mb_mapping);              if (-1 == modbus_reply(ctx, query, query_len, mb_mapping)) {                 break;             }              leddrv_updatestates(mb_mapping-&gt;tab_bits);         }          close(client_socket);     }     printf(&quot;exiting: %s\\n&quot;, modbus_strerror(errno));      close(listen_socket);     mb_mapping_wrapper_free(mb_mapping);     free(query);     modbus_free(ctx);<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e. \u041f\u0430\u0440\u0430 \u043c\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 mb_mapping_getstates \u0438 leddrv_updatestates. \u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<pre><code class=\"cpp\">static modbus_mapping_t *mb_mapping_wrapper_new(void) {     modbus_mapping_t *mb_mapping;     mb_mapping = modbus_mapping_new(LEDDRV_LED_N, 0, 0, 0);      return mb_mapping; }  static void mb_mapping_wrapper_free(modbus_mapping_t *mb_mapping) {      modbus_mapping_free(mb_mapping); }  static void mb_mapping_getstates(modbus_mapping_t *mb_mapping) {     int i;      leddrv_getstates(mb_mapping-&gt;tab_bits);      for (i = 0; i &lt; mb_mapping-&gt;nb_bits; i++) {         mb_mapping-&gt;tab_bits[i] = mb_mapping-&gt;tab_bits[i] ? ON : OFF;     } } <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b leddrv_updatestates, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432, \u0438 leddrv_getstates, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432.  <\/p>\n<pre><code class=\"cpp\"> static unsigned char leddrv_leds_state[LEDDRV_LED_N];  int leddrv_init(void) {     static int inited = 0;     if (inited) {         return 0;     }     inited = 1;     leddrv_ll_init();      leddrv_load_state(leddrv_leds_state);     leddrv_ll_update(leddrv_leds_state);      return 0; }  ... int leddrv_getstates(unsigned char leds_state[LEDDRV_LED_N]) {     memcpy(leds_state, leddrv_leds_state, sizeof(leddrv_leds_state));     return 0; }  int leddrv_updatestates(unsigned char new_leds_state[LEDDRV_LED_N]) {     memcpy(leddrv_leds_state, new_leds_state, sizeof(leddrv_leds_state));     leddrv_ll_update(leddrv_leds_state);     return 0; }<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0435 \u041f\u041e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0445\u043e\u0441\u0442\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445. <\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431\u0441\u0430\u0439\u0442 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432\u0435\u0431\u0441\u0430\u0439\u0442 \u0438 \u0443\u043a\u0430\u0436\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"cpp\">void leddrv_ll_update(unsigned char leds_state[LEDDRV_LED_N]) {     int i;     int idx;     char buff[LEDDRV_LED_N * 2];          for (i = 0; i &lt; LEDDRV_LED_N; i++) {         char state = !!leds_state[i];         fprintf(stderr, &quot;led(%03d)=%d\\n&quot;, i, state);         buff[i * 2] = state + '0';         buff[i * 2 + 1] = ',';     }     idx = open(LED_FILE_NAME, O_RDWR);     if (idx &lt; 0) {         return;     }      write(idx, buff, (LEDDRV_LED_N * 2) - 1);      close(idx); }  ...  void leddrv_load_state(unsigned char leds_state[LEDDRV_LED_N]) {     int i;     int idx;     char buff[LEDDRV_LED_N * 2];      idx = open(LED_FILE_NAME, O_RDWR);     if (idx &lt; 0) {         return;     }     read(idx, buff, (LEDDRV_LED_N * 2));     close(idx);          for (i = 0; i &lt; LEDDRV_LED_N; i++) {         leds_state[i] = buff[i * 2] - '0';     } }<\/code><\/pre>\n<p>  \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432. \u0424\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u0427\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432, 1 \u2014 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0430 0 -\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d. \u0412 \u043d\u0430\u0448\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 80 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432, \u0442\u043e\u0447\u043d\u0435\u0435 40 \u043f\u0430\u0440 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0430 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430<\/p>\n<pre><code class=\"plaintext\">0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440  <\/p>\n<pre><code class=\"plaintext\">.\/led-server led(000)=0 led(001)=1 ... led(078)=0 led(079)=1 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u0415\u0433\u043e \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0431\u0430\u0437\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 libmodbus<\/p>\n<pre><code class=\"cpp\">ctx = modbus_new_tcp(ip, port);     if (ctx == NULL) {         fprintf(stderr, &quot;Unable to allocate libmodbus context\\n&quot;);         return -1;     }      modbus_set_debug(ctx, TRUE);     modbus_set_error_recovery(ctx,             MODBUS_ERROR_RECOVERY_LINK |             MODBUS_ERROR_RECOVERY_PROTOCOL);      if (modbus_connect(ctx) == -1) {         fprintf(stderr, &quot;Connection failed: %s\\n&quot;,                 modbus_strerror(errno));         modbus_free(ctx);         return -1;     }       if (1 == modbus_write_bit(ctx, bit_n, bit_value)) {         printf(&quot;OK\\n&quot;);     } else {         printf(&quot;FAILED\\n&quot;);     }      \/* Close the connection *\/     modbus_close(ctx);     modbus_free(ctx); <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c 78 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d<\/p>\n<pre><code class=\"plaintext\">.\/led-client set 78 Connecting to 127.0.0.1:1502 [00][01][00][00][00][06][FF][05][00][4E][FF][00] Waiting for a confirmation... &lt;00&gt;&lt;01&gt;&lt;00&gt;&lt;00&gt;&lt;00&gt;&lt;06&gt;&lt;FF&gt;&lt;05&gt;&lt;00&gt;&lt;4E&gt;&lt;FF&gt;&lt;00&gt; OK<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0443\u0432\u0438\u0434\u0438\u043c  <\/p>\n<pre><code class=\"plaintext\">... led(076)=0 led(077)=1 led(078)=1 led(079)=1 Waiting for an indication... ERROR Connection reset by peer: read<\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e.  <\/p>\n<pre><code class=\"plaintext\">.\/led-client clr 78 Connecting to 127.0.0.1:1502 [00][01][00][00][00][06][FF][05][00][4E][00][00] Waiting for a confirmation... &lt;00&gt;&lt;01&gt;&lt;00&gt;&lt;00&gt;&lt;00&gt;&lt;06&gt;&lt;FF&gt;&lt;05&gt;&lt;00&gt;&lt;4E&gt;&lt;00&gt;&lt;00&gt; OK<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438  <\/p>\n<pre><code class=\"plaintext\">... led(076)=0 led(077)=1 led(078)=0 led(079)=1 Waiting for an indication... ERROR Connection reset by peer: read<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c http \u0441\u0435\u0440\u0432\u0435\u0440. \u041e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/541662\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b modbus. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 cgi \u0441\u043a\u0440\u0438\u043f\u0442<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash  echo -ne &quot;HTTP\/1.1 200 OK\\r\\n&quot; echo -ne &quot;Content-Type: application\/json\\r\\n&quot; echo -ne &quot;Connection: close\\r\\n&quot; echo -ne &quot;\\r\\n&quot;  if [ $REQUEST_METHOD = &quot;GET&quot; ]; then     echo &quot;Query: $QUERY_STRING&quot; &gt;&amp;2     case &quot;$QUERY_STRING&quot; in         &quot;c=led_driver&amp;a1=serialize_states&quot;)             echo [ $(cat ..\/emulate\/conf\/leds.txt) ]             ;;         &quot;c=led_driver&amp;a1=serialize_errors&quot;)             echo [ $(printf &quot;0, %.0s&quot; {1..79}) 1 ]             ;;         &quot;c=led_names&amp;a1=serialize&quot;)             echo '[ &quot;one&quot;, &quot;two&quot;, &quot;WWWWWWWWWWWWWWWW&quot;, &quot;W W W W W W W W &quot; ]'             ;;     esac elif [ $REQUEST_METHOD = &quot;POST&quot; ]; then     read -n $CONTENT_LENGTH POST_DATA     echo &quot;Posted: $POST_DATA&quot; &gt;&amp;2 fi<\/code><\/pre>\n<p>  \u0418 \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u044e\u0431\u043e\u0433\u043e http \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 CGI. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 python \u0441\u0435\u0440\u0432\u0435\u0440. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439  <\/p>\n<pre><code class=\"plaintext\">python3 -m http.server --cgi -d .<\/code><\/pre>\n<p>  \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u043d\u0430\u0448 \u0441\u0430\u0439\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2v\/pv\/ei\/2vpveimzpt6okmsgzxunpssbnvk.png\"><\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c 78 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430  <\/p>\n<pre><code class=\"plaintext\">.\/led-client -a 127.0.0.1 set 78 Connecting to 127.0.0.1:1502 [00][01][00][00][00][06][FF][05][00][4E][FF][00] Waiting for a confirmation... &lt;00&gt;&lt;01&gt;&lt;00&gt;&lt;00&gt;&lt;00&gt;&lt;06&gt;&lt;FF&gt;&lt;05&gt;&lt;00&gt;&lt;4E&gt;&lt;FF&gt;&lt;00&gt; OK<\/code><\/pre>\n<p>  \u0441\u0431\u0440\u043e\u0441\u0438\u043c 79 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434  <\/p>\n<pre><code class=\"plaintext\">.\/led-client -a 127.0.0.1 clr 79 Connecting to 127.0.0.1:1502 [00][01][00][00][00][06][FF][05][00][4F][00][00] Waiting for a confirmation... &lt;00&gt;&lt;01&gt;&lt;00&gt;&lt;00&gt;&lt;00&gt;&lt;06&gt;&lt;FF&gt;&lt;05&gt;&lt;00&gt;&lt;4F&gt;&lt;00&gt;&lt;00&gt; OK<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0443<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8g\/f0\/na\/8gf0naewrbnapiygu1u8tnnyaxc.png\"><\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0435, \u043d\u0430 Linux \u043d\u0430\u0448\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<h2>\u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u043a Embox \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435<\/h2>\n<p>  <\/p>\n<h3>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libmodbus<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043a\u043e\u0434 \u0432 Embox. \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 libmodbus.<br \/>  \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f (Mybuild)  <\/p>\n<pre><code class=\"plaintext\">package third_party.lib  @Build(script=&quot;$(EXTERNAL_MAKE)&quot;) @BuildArtifactPath(cppflags=&quot;-I$(ROOT_DIR)\/build\/extbld\/third_party\/lib\/libmodbus\/install\/include\/modbus&quot;) module libmodbus {     @AddPrefix(&quot;^BUILD\/extbld\/^MOD_PATH\/install\/lib&quot;)     source &quot;libmodbus.a&quot;      @NoRuntime depends embox.compat.posix.util.nanosleep }<\/code><\/pre>\n<p>  \u041c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <i><a href=\"https:\/\/habr.com\/ru\/users\/build\/\" class=\"user_link\">Build<\/a>(script=&quot;$(EXTERNAL_MAKE)&quot;)<\/i> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Makefile \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <i><a href=\"https:\/\/habr.com\/ru\/users\/build\/\" class=\"user_link\">Build<\/a>ArtifactPath<\/i> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043a \u0442\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>  \u0418 \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <i>source \u00ablibmodbus.a\u00bb<\/i><\/p>\n<pre><code class=\"cmake\">PKG_NAME := libmodbus PKG_VER  := 3.1.6  PKG_SOURCES := http:\/\/libmodbus.org\/releases\/$(PKG_NAME)-$(PKG_VER).tar.gz PKG_MD5     := 15c84c1f7fb49502b3efaaa668cfd25e  PKG_PATCHES := accept4_disable.patch  include $(EXTBLD_LIB)  libmodbus_cflags = -UHAVE_ACCEPT4  $(CONFIGURE) :     export EMBOX_GCC_LINK=full; \\     cd $(PKG_SOURCE_DIR) &amp;&amp; ( \\         CC=$(EMBOX_GCC) .\/configure --host=$(AUTOCONF_TARGET_TRIPLET) \\         prefix=$(PKG_INSTALL_DIR) \\         CFLAGS=$(libmodbus_cflags) \\     )     touch $@  $(BUILD) :     cd $(PKG_SOURCE_DIR) &amp;&amp; ( \\         $(MAKE) install MAKEFLAGS='$(EMBOX_IMPORTED_MAKEFLAGS)'; \\     )     touch $@<\/code><\/pre>\n<p>  Makefile \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u043e\u0442\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 (<i>$(EMBOX_GCC) <\/i>) Embox \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (<i>&#8212;host<\/i>) \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u043d\u0430 \u0432 Embox (<i>$(AUTOCONF_TARGET_TRIPLET)<\/i>).<\/p>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043a Embox<\/h3>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a Embox \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c Embox \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<br \/>  \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b   <\/p>\n<pre><code class=\"plaintext\">make ext_conf EXT_PROJECT_PATH=&lt;path to project&gt; <\/code><\/pre>\n<p>  \u0432 \u043a\u043e\u0440\u043d\u0435 Embox. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,  <\/p>\n<pre><code class=\"plaintext\"> make ext_conf EXT_PROJECT_PATH=~\/git\/embox_project_modbus_iocontrol<\/code><\/pre>\n<h3>modbus-server<\/h3>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 modbus \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Mybuild  <\/p>\n<pre><code class=\"plaintext\">package iocontrol.modbus.cmd  @AutoCmd @Build(script=&quot;true&quot;) @BuildDepends(third_party.lib.libmodbus) @Cmd(name=&quot;modbus_server&quot;) module modbus_server {     source &quot;modbus_server.c&quot;      @NoRuntime depends third_party.lib.libmodbus }<\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0442\u043e \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libmodbus.<\/p>\n<p>  \u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438. \u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c Mybuild \u0434\u043b\u044f \u043d\u0438\u0445, \u043e\u043d\u0438 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b, \u043b\u0438\u0448\u044c \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 modbus \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<br \/>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 mods.conf  <\/p>\n<pre><code class=\"plaintext\">    include iocontrol.modbus.http_admin     include iocontrol.modbus.cmd.flash_settings     include iocontrol.modbus.cmd.led_names     include third_party.lib.libmodbus     include iocontrol.modbus.cmd.modbus_server     include iocontrol.modbus.cmd.led_driver      include embox.service.cgi_cmd_wrapper(cmds_check=true, allowed_cmds=&quot;led_driver led_names flash_settings&quot;)      include iocontrol.modbus.lib.libleddrv_ll_stub<\/code><\/pre>\n<p>  \u0410 \u043d\u0430\u0448 \u0444\u0430\u0439\u043b leds.txt \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0434\u0435\u043c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c RAM disk \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0444\u0430\u0439\u043b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0434\u0438\u0441\u043a. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 system_start.inc  <\/p>\n<pre><code class=\"plaintext\">&quot;export PWD=\/&quot;, &quot;export HOME=\/&quot;, &quot;netmanager&quot;, &quot;service telnetd&quot;, &quot;service httpd http_admin&quot;, &quot;ntpdate 0.europe.pool.ntp.org&quot;, &quot;mkdir -v \/conf&quot;, &quot;mount -t ramfs \/dev\/static_ramdisk \/conf&quot;, &quot;cp leds.txt \/conf\/leds.txt&quot;, &quot;led_driver init&quot;, &quot;service modbus_server&quot;, &quot;tish&quot;,<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c Embox \u043d\u0430 qemu  <\/p>\n<pre><code class=\"plaintext\">.\/scripts\/qemu\/auto_qemu<\/code><\/pre>\n<p>  modbus \u0438 httpd \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e modbus \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u0432 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e QEMU (10.0.2.16)  <\/p>\n<pre><code class=\"plaintext\">.\/led-client -a 10.0.2.16 set 78 Connecting to 10.0.2.16:1502 [00][01][00][00][00][06][FF][05][00][4E][FF][00] Waiting for a confirmation... &lt;00&gt;&lt;01&gt;&lt;00&gt;&lt;00&gt;&lt;00&gt;&lt;06&gt;&lt;FF&gt;&lt;05&gt;&lt;00&gt;&lt;4E&gt;&lt;FF&gt;&lt;00&gt; OK<\/code><\/pre>\n<p>  \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e  <\/p>\n<pre><code class=\"plaintext\">.\/led-client -a 10.0.2.16 clr 79 Connecting to 10.0.2.16:1502 [00][01][00][00][00][06][FF][05][00][4F][00][00] Waiting for a confirmation... &lt;00&gt;&lt;01&gt;&lt;00&gt;&lt;00&gt;&lt;00&gt;&lt;06&gt;&lt;FF&gt;&lt;05&gt;&lt;00&gt;&lt;4F&gt;&lt;00&gt;&lt;00&gt;<\/code><\/pre>\n<p>  \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dn\/ug\/sd\/dnugsdtcu-vol3frtl7bympwzdw.png\"><\/p>\n<p>  \u041a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0447\u0435\u0440\u0435\u0437 modbus \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0443\u0436\u0435 \u043d\u0430 Embox.<\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435<\/h2>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c STM32F4-discovery. \u041d\u0430 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 80 \u043d\u043e\u0433 \u0432\u044b\u0432\u043e\u0434\u0430, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u0440\u044b, \u0438 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0443 \u044d\u0442\u0438\u0445 \u043f\u0430\u0440 \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043c\u044f, \u0438\u043b\u0438 \u043f\u0430\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043a\u043e\u0434 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u0438\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0443\u0431\u0440\u0430\u043d\u044b \u043b\u0438\u0448\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u0438. 80 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0438\u043d\u043e\u0432 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.<\/p>\n<p>  \u041d\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 STM32F4-discovery \u0432\u0441\u0435\u0433\u043e 4 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430. \u0411\u044b\u043b\u043e \u0431\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0412 Embox \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438. \u041d\u0443\u0436\u043d\u043e \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f (Mybuild) \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u044e  <\/p>\n<pre><code class=\"plaintext\">package iocontrol.modbus.lib  static module libleddrv {     option number leds_quantity = 80 ... }<\/code><\/pre>\n<p>  \u0418 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435  <\/p>\n<pre><code class=\"cpp\">#ifdef __EMBOX__ #include &lt;framework\/mod\/options.h&gt; #include &lt;module\/iocontrol\/modbus\/lib\/libleddrv.h&gt; #define LEDDRV_LED_N OPTION_MODULE_GET(iocontrol__modbus__lib__libleddrv,NUMBER,leds_quantity) #else #define LEDDRV_LED_N 80 #endif<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0432 \u0435\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 mods.conf  <\/p>\n<pre><code class=\"plaintext\">    include  iocontrol.modbus.lib.libleddrv(leds_quantity=4)<\/code><\/pre>\n<p>  \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u043d \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c 80.<\/p>\n<p>  \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043b\u0438\u043d\u0438\u044f\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430. \u041a\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439  <\/p>\n<pre><code class=\"cpp\">struct leddrv_pin_desc {     int gpio; \/**&lt; port *\/     int pin; \/**&lt; pin mask *\/ };  static const struct leddrv_pin_desc leds[] = {     #include &lt;leds_config.inc&gt; };   void leddrv_ll_init(void) {     int i;     for (i = 0; i &lt; LEDDRV_LED_N; i++) {         gpio_setup_mode(leds[i].gpio, leds[i].pin, GPIO_MODE_OUTPUT);     } }  void leddrv_ll_update(unsigned char leds_state[LEDDRV_LED_N]) {     int i;      for (i = 0; i &lt; LEDDRV_LED_N; i++) {         gpio_set(leds[i].gpio, leds[i].pin,                 leds_state[i] ? GPIO_PIN_HIGH : GPIO_PIN_LOW);     } }<\/code><\/pre>\n<p>  \u0412 \u0444\u0430\u0439\u043b\u0435 mods.conf \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u0442\u044b. \u041a \u043d\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438  <\/p>\n<pre><code class=\"plaintext\">    include iocontrol.modbus.http_admin     include iocontrol.modbus.cmd.flash_settings     include iocontrol.modbus.cmd.led_names     include third_party.lib.libmodbus     include iocontrol.modbus.cmd.modbus_server     include iocontrol.modbus.cmd.led_driver      include embox.service.cgi_cmd_wrapper(cmds_check=true, allowed_cmds=&quot;led_driver led_names flash_settings&quot;)      include iocontrol.modbus.lib.libleddrv(leds_quantity=4)     include iocontrol.modbus.lib.libleddrv_ll_stm32_f4_demo<\/code><\/pre>\n<p>  \u041f\u043e \u0441\u0443\u0442\u0438 \u0434\u0435\u043b\u0430, \u0442\u0435 \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043a\u0430\u043a \u0438 \u0434\u043b\u044f ARM QEMU, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<p>  \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c, \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c. \u0418 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u043e\u0433\u043e \u0436\u0435 modbus \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c\u0438. \u041d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u043e 4 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435.<\/p>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 stm32f4-discovery \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u043c \u0432\u0438\u0434\u0435\u043e   <\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"60521a7530f707d266c0ecb5\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/60521a7530f707d266c0ecb5\"><\/iframe><\/div>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u0447\u0435\u043c \u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 Embox \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u041e\u0421 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 POSIX \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0412\u0435\u0434\u044c \u043c\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u0434\u0435\u043b\u0430, \u0432\u0437\u044f\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430 Linux \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0418 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0432 \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0432 \u0441\u0430\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<p>  \u0414\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0438 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435. \u0421\u0430\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b modbus \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 modbus. \u0410 \u043d\u0430\u0448 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0447\u0430\u0441\u0442\u0438. \u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u0447\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 \u043f\u043b\u0430\u0442\u0435.<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/547582\/\"> https:\/\/habr.com\/ru\/company\/embox\/blog\/547582\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ix\/pc\/3u\/ixpc3u6nxjpj6k4inncv83cklwu.png\" alt=\"image\" align=\"right\" width=\"300\"><br \/>  \u041d\u0430\u0441 \u0447\u0430\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442, \u0447\u0435\u043c <a href=\"http:\/\/embox.github.io\/\">Embox<\/a> \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u041e\u0421 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, FreeRTOS? \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u041d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u043b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u043f\u043e\u0432\u0435\u0440\u0433\u0430\u044e\u0442 \u0432 \u043b\u0435\u0433\u043a\u043e\u0435 \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Embox? \u0410 \u043a\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438? \u0410 \u0432 Embox \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f modbus? \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u043e modbus \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c Embox \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-319787","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319787","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=319787"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319787\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=319787"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=319787"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=319787"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}