Компиляция «ядра»

Как скомпилировать

RF62X-Core может быть скомпилирован при помощи консоли или среды разработки (Visual Studio, Qt Creator).

Во-первых, вы должны загрузить проект (если не сделали этого ранее).

Примечание

Для получения дополнительной информации о шагах загрузки проекта см. Скачивание проекта

CMake

Находясь в папке проекта RF62X-SDK для построения RF62X-Core введите следующую команду в консоль (терминал):

cd RF62X-Core
mkdir build && cd build
cmake ..
cmake --build .

Qt Creator

Для построения RF62X-Core с использованием IDE Qt Creator:

  • Загрузите файл CMakeLists.txt из папки RF62X-Core через File > Open File or Project (выберите файл CMakeLists.txt)

  • Выберите компилятор (MinGW, MSVC, Clang) и нажмите Configure Project

  • Скомпилируйте проект

Visual Studio

Находясь в папке проекта RF62X-SDK для построения RF62X-Core введите следующую команду в консоль (терминал):

cd RF62X-Core
mkdir build && cd build
cmake ..
  • Откройте полученное решение RF62X-Core.sln в Visual Studio

  • Скомпилируйте проект

Как использовать

Для использования библиотеки RF62X-Core вместо имеющихся библиотек-«обёрток» разработчику необходимо будет самостоятельно реализовать платформозависимую часть «ядра».

Обзор платформозависимых функций

В RF62X-Core платформозависимые функции (работа с памятью, работа с сетью, функции ввода/вывода) представлены в виде указателей на функции.

Указатели на платформозависимые функции объявлены в файлах, memory_platform.h, network_platform.h и iostream_platform.h.

calloc_t

Прототип:

typedef void* (*calloc_t)(rfSize num, rfSize size);

Описание:

Указатель на функцию calloc_t выделяет блок памяти для массива размером num элементов, каждый из которых занимает size байт. В результате выделяется блок памяти размером number * size байт, причём весь блок заполнен нулями.

Параметры:
  • num - Количество элементов массива, под который выделяется память.

  • size - Размер одного элемента в байтах.

Возвращаемое значение:

Указатель на выделенный блок памяти. Тип данных на который ссылается указатель всегда void* , поэтому это тип данных может быть приведен к желаемому типу. Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель.

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief Allocates an array in memory with elements initialized to 0.
 *
 * @param num Number of elements to allocate.
 * @param size Size of each element.
 *
 * @return
 * - On success: returns a pointer to the allocated space.
 * - On error: NULL
 */
typedef void* (*calloc_t)(rfSize num, rfSize size);

malloc_t

Прототип:

typedef void* (*malloc_t)(rfSize size);

Описание:

Указатель на функцию malloc_t выделяет блок памяти размером size байт и возвращает указатель на начало блока. Содержание выделенного блока памяти не инициализируется, оно остается с неопределенными значениями.

Параметры:
  • size - Размер выделяемого блока памяти в байтах.

Возвращаемое значение:

Указатель на выделенный блок памяти. Тип данных на который ссылается указатель всегда void* , поэтому это тип данных может быть приведен к желаемому типу. Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель.

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief malloc_t - ptr to function whish allocates memory block
 * Allocates a block of size bytes of memory, returning a pointer
 * to the beginning of the block.
 *
 * @param size Size of the memory block, in bytes.
 *
 * @return
 * - On success: returns a pointer to the allocated space.
 * - On error: NULL.
 */
typedef void* (*malloc_t)(rfSize size);

realloc_t

Прототип:

typedef void* (*realloc_t)(void *ptr, rfSize newsize);

Описание:

Указатель на функцию realloc_t выполняет перераспределение блоков памяти. Размер блока памяти, на который ссылается параметр ptr изменяется на newsize байтов. Блок памяти может уменьшаться или увеличиваться в размере.

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

В случае, если ptr равен NULL , функция ведет себя именно так, как функция malloc_t , т. е. выделяет память и возвращает указатель на этот участок памяти.

В случае, если newsize равен 0, ранее выделенная память будет освобождена, как если бы была вызвана функция free_t , и возвращается нулевой указатель.

Параметры:
  • ptr - Указатель на блок ранее выделенной памяти функциями malloc_t , calloc_t или realloc_t для перемещения в новое место. Если этот параметр — NULL , просто выделяется новый блок, и функция возвращает на него указатель.

  • newsize - Новый размер, в байтах, выделяемого блока памяти. Если newsize равно 0, ранее выделенная память освобождается и функция возвращает нулевой указатель, ptr устанавливается в 0.

Возвращаемое значение:

Указатель на перераспределенный блок памяти, который может быть либо таким же, как аргумент ptr *или ссылаться на новое место.

Тип данных возвращаемого значения всегда void* , который может быть приведен к любому другому.

Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель, и блок памяти, на который указывает аргумент ptr остается неизменным.

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief realloc_t - ptr to function whish reallocates memory block
 * Changes the size of the memory block pointed to by ptr. The function
 * may move the memory block to a new location (whose address is
 * returned by the function).
 *
 * @param ptr Pointer to a memory block previously allocated.
 * @param newsize New size for the memory block, in bytes.
 *
 * @return A pointer to the reallocated memory block, which may be either
 * the same as ptr or a new location.
 */
typedef void* (*realloc_t)(void *ptr, rfSize newsize);

free_t

Прототип:

typedef void (*free_t)(void* data);

Описание:

Указатель на функцию free_t освобождает место в памяти. Блок памяти, ранее выделенный с помощью вызова malloc_t , calloc_t или realloc_t освобождается.

Обратите внимание, что эта функция оставляет значение data неизменным, следовательно, он по-прежнему указывает на тот же блок памяти, а не на нулевой указатель.

Параметры:
  • data - Указатель на блок памяти, ранее выделенный функциями malloc_t , calloc_t или realloc_t , которую необходимо высвободить. Если в качестве аргумента передается нулевой указатель, никаких действий не происходит.

Возвращаемое значение:

Функция не имеет возвращаемое значение.

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief Deallocates or frees a memory block.
 *
 * @param data Previously allocated memory block to be freed.
 */
typedef void (*free_t)(void* data);

memset_t

Прототип:

typedef void* (*memset_t)(void* memptr, rfInt val, rfSize num);

Описание:

Указатель на функцию memset_t заполняет num байтов блока памяти, через указатель memptr . Код заполняемого символа передаётся в функцию через параметр val .

Параметры:
  • memptr - Указатель на блок памяти для заполнения.

  • val - Передается целое число, но функция заполняет блок памяти символом, преобразуя это число в символ

  • num - Количество байт, которые необходимо заполнить указанным символом.

Возвращаемое значение:

Функция возвращает указатель на блок памяти.

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief memset_t - ptr to function whish fills block of memory
 * Sets the first num bytes of the block of memory pointed by ptr to the
 * specified value (interpreted as an unsigned rfChar).
 *
 * @param memptr Pointer to the block of memory to fill.
 * @param val Value to be set.
 * @param num Number of bytes to be set to the value.
 * rfSize is an unsigned rfIntegral type.
 *
 * @return ptr is returned.
 */
typedef void* (*memset_t)(void* memptr, rfInt val, rfSize num);

memcpy_t

Прототип:

typedef void* (*memcpy_t)(void* destination, const void* source, rfSize num);

Описание:

Указатель на функцию memset_t копирует num байтов первого блока памяти, на который ссылается указатель source , во второй блок памяти, на который ссылается указатель destination .

Параметры:
  • destination - Указатель на блок памяти назначения (куда будут копироваться байты данных).

  • source - Указатель на блок памяти источник (т. е., откуда будут копироваться байты данных).

  • num - Количество копируемых байтов.

Возвращаемое значение:

Указатель на блок памяти назначения.

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief memcpy_t - ptr to function whish copies block of memory
 * Copies the values of num bytes from the location pointed to by source
 * directly to the memory block pointed to by destination.
 *
 * @param destination Pointer to the destination array where the content is to
 * be copied, type-casted to a pointer of type void*.
 * @param source Pointer to the source of data to be copied, type-casted to a
 * pointer of type const void*.
 * @param num Number of bytes to copy. rfSize is an unsigned rfIntegral type.
 *
 * @return destination is returned.
 */
typedef void* (*memcpy_t)(void* destination, const void* source, rfSize num);

memcmp_t

Прототип:

typedef rfInt (*memcmp_t)(const void* ptr1, const void* ptr2, rfSize num );

Описание:

Указатель на функцию memcmp_t сравнивает первые num байтов блока памяти указателя ptr1 с первыми num байтами блока памяти ptr2 . Возвращаемое значение 0 если блоки равны, и значение отличное от 0, если блоки не равны.

Параметры:
  • ptr1 - Указатель на первый блок памяти.

  • ptr2 - Указатель на второй блок памяти.

  • num - Количество байтов для сравнения.

Возвращаемое значение:

Возвращает значение, информирующее о результате сравнения содержимого блоков памяти. Нулевое значение указывает, что содержимое обоих блоков памяти равны. Значение больше нуля говорит о том, что первый блок памяти — ptr1 больше, чем блок памяти — ptr2 , и значение меньше нуля свидетельствует об обратном

Пример в коде:

/** @file memory_platform.h */

/**
 * @brief memcmp_t - ptr to function whish compare two blocks of memory
 * Compares the first num bytes of the block of memory pointed by ptr1 to the
 * first num bytes pointed by ptr2, returning zero if they all match or a
 * value different from zero representing which is greater if they do not.
 *
 * @param ptr1 Pointer to block of memory.
 * @param ptr2 Pointer to block of memory.
 * @param num Number of bytes to compare.
 *
 * @return
 * 0 - if the contents of both memory blocks are equal,
 * <0 - if the first byte that does not match in both memory blocks has a
 * lower value in ptr1 than in ptr2.
 * >0 - if the first byte that does not match in both memory blocks has a
 * greater value in ptr1 than in ptr2.
 */
typedef rfInt (*memcmp_t)(const void* ptr1, const void* ptr2, rfSize num);

hton_long_t, ntoh_long_t, hton_short_t, ntoh_short_t

Прототип:
  • typedef rfUint32 (*hton_long_t) (rfUint32 hostlong);

  • typedef rfUint32 (*ntoh_long_t) (rfUint32 netlong);

  • typedef rfUint16 (*hton_short_t)(rfUint16 hostshort);

  • typedef rfUint16 (*ntoh_short_t)(rfUint16 netshort);

Описание:

Указатели на функции hton_long_t , ntoh_long_t , hton_short_t , ntoh_short_t необходимы для преобразования многобайтовых целочисленных типов из байтового порядка хоста в сетевой порядок байтов и наоборот.

Параметры:
  • hostlong/hostshort - 32/16-битное число в байтовом порядке хоста.

  • netlong/netshort - 32/16-битное число в сетевом порядке байтов.

Возвращаемое значение:

Функция возвращает значение в сетевом/обратном порядке байтов.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief The hton_long_t function converts a u_long from host to network byte
 * order (which is big-endian).
 *
 * @param hostlong A 32-bit number in host byte order.
 *
 * @return The function returns the value in network byte order.
 */
typedef rfUint32 (*hton_long_t) (rfUint32 hostlong);

/**
 * @brief The ntoh_long_t function converts a u_long from network order to
 * host byte order (which is little-endian on rfIntel processors).
 *
 * @param netlong A 32-bit number in network byte order.
 *
 * @return: The function returns the value supplied in the netlong parameter
 * with the byte order reversed.
 */
typedef rfUint32 (*ntoh_long_t) (rfUint32 netlong);

/**
 * @brief The hton_short_t function converts a u_short from host to network
 * byte order (which is big-endian).
 *
 * @param hostlong A 16-bit number in host byte order.
 *
 * @return The modbusHtoN_short_t function returns the value in network
 * byte order.
 */
typedef rfUint16 (*hton_short_t)(rfUint16 hostshort);

/**
 * @brief The ntoh_short_t function converts a u_short from network byte order
 * to host byte order
 *
 * @param netshort A 16-bit number in network byte order.
 *
 * @return The function returns the value in host byte order.
 */
typedef rfUint16 (*ntoh_short_t)(rfUint16 netshort);

create_udp_socket_t

Прототип:

typedef void* (*create_udp_socket_t)();

Описание:

Указатель на функцию create_udp_socket_t создает несвязанный UDP сокет

Возвращаемое значение:

После успешного завершения create_udp_socket_t должен вернуть указатель на дескриптор сокета. В противном случае должно быть возвращено значение NULL и вызвана ​​ошибка создания сокета.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to UDP socket creation function
 *
 * @param af The address family specification.
 * @param type The type specification for the new socket.
 * @param protocol The protocol to be used.
 *
 * @return
 * - On success: A descriptor referencing the new socket
 * - On error: NULL
 */
typedef void* (*create_udp_socket_t)();

set_broadcast_socket_option_t, set_reuseaddr_socket_option_t, set_socket_recv_timeout_t

Прототип:
  • typedef rfInt8 (*set_broadcast_socket_option_t)(void* socket);

  • typedef rfInt8 (*set_reuseaddr_socket_option_t)(void* socket);

  • typedef rfInt8 (*set_socket_recv_timeout_t)(void* socket, rfInt32 msec);

Описание:

Указатели на функции set_broadcast_socket_option_t , set_reuseaddr_socket_option_t , set_socket_recv_timeout_t , необходимы для вкючение в UDP сокетах таких сетевых настроек как: broadcast (позволяет отправлять или получать широковещательные пакеты), reuseaddr (позволяет сокету принудительно связываться с портом, используемым другим сокетом), recv_timeout (время, в течение которого сокет ожидает, пока данные станут доступными для чтения).

Параметры:
  • socket - Указатель дескриптора сокета

  • msec (только для set_socket_recv_timeout_t) - Время ожидания в миллисекундах.

Возвращаемое значение:

После успешного завершения везвращается 0. В противном случае должно быть возвращено значение -1.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that sets a broadcast socket option.
 *
 * @param socket A descriptor that identifies a socket.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*set_broadcast_socket_option_t)(void* socket);

/**
 * @brief Pointer to the function that sets a reuseaddr socket option.
 *
 * @param socket A descriptor that identifies a socket.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*set_reuseaddr_socket_option_t)(void* socket);

/**
 * @brief Pointer to the function that sets a timeout for socket receive.
 *
 * @param socket A descriptor that identifies a socket.
 * @param msec The timeout in millisec.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*set_socket_recv_timeout_t)(void* socket, rfInt32 msec);

set_socket_option_t

Прототип:

typedef rfInt8 (*set_socket_option_t)(void* socket, rfInt32 level, rfInt32 optname, const rfChar* optval, rfInt32 optlen);

Описание:

Указатель на функцию set_socket_option_t устанавливает параметр сокета.

Параметры:
  • socket - Указатель дескриптора сокета

  • level - Уровень, на котором определена опция (например, SOL_SOCKET).

  • optname - Параметр сокета, для которого должно быть установлено значение (например, SO_BROADCAST)

  • optval - Указатель на буфер, в котором указано значение запрошенной опции.

  • optlen - Размер в байтах буфера, на который указывает параметр optval

Возвращаемое значение:

Если ошибок не происходит, set_socket_option_t возвращает ноль. В противном случае возвращается значение RF_SOCKET_ERROR

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that sets a socket option.
 *
 * @param socket A descriptor that identifies a socket.
 * @param level The level at which the option is defined.
 * @param optname The socket option for which the value is to be set.
 * @param optval A pointer to the buffer in which the value for the requested
 * option is specified.
 * @param optlen The size, in bytes, of the buffer pointed to by the optval
 * parameter.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*set_socket_option_t)(
        void* socket, rfInt32 level, rfInt32 optname,
        const rfChar* optval, rfInt32 optlen);

socket_connect_t

Прототип:

typedef rfInt8 (*socket_connect_t)(void* socket, rfUint32 dst_ip_addr, rfUint16 dst_port);

Описание:

Указатель на функцию socket_connect_t устанавливает соединение с указанным сокетом.

Параметры:
  • socket - Указатель дескриптора сокета

  • dst_ip_addr - IP-адрес назначения, с которым должно быть установлено соединение.

  • dst_port - Порт назначения, к которому должно быть установлено соединение.

Возвращаемое значение:

Если ошибок не происходит, socket_connect_t возвращает ноль. В противном случае возвращается значение RF_SOCKET_ERROR

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that establishes a connection to a
 * specified socket
 *
 * @param socket A descriptor identifying an unconnected socket.
 * @param dst_ip_addr Destination IP Addr to which the connection should be
 * established.
 * @param dst_port Destination port to which the connection should be
 * established.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*socket_connect_t)(
        void* socket, rfUint32 dst_ip_addr, rfUint16 dst_port);

socket_bind_t

Прототип:

typedef rfInt (*socket_bind_t)(void* socket, rfUint32 host_ip_addr, rfUint16 host_port);

Описание:

Указатель на функцию socket_bind_t связывает локальный адрес с сокетом.

Параметры:
  • socket - Указатель дескриптора сокета

  • dst_ip_addr - IP-адрес, с которым должен быть связан сокет.

  • dst_port - Порт, с которым должен быть связан сокет.

Возвращаемое значение:

Если ошибок не происходит, socket_bind_t возвращает ноль. В противном случае возвращается значение RF_SOCKET_ERROR

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that associates a local address with
 * a socket.
 *
 * @param socket A descriptor identifying an unconnected socket.
 * @param host_ip_addr Host IP Addr to which the connection should be bind.
 * @param host_port Host port to which the connection should be bind.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt (*socket_bind_t)(
        void* socket, rfUint32 host_ip_addr, rfUint16 host_port);

socket_listen_t

Прототип:

typedef rfInt8 (*socket_listen_t)(void* socket, rfInt32 backlog);

Описание:

Указатель на функцию socket_listen_t переводит сокет в состояние, в котором он ожидает входящее соединения.

Параметры:
  • socket - Указатель дескриптора сокета

  • backlog - Максимальная длина очереди ожидающих подключений.

Возвращаемое значение:

Если ошибок не происходит, socket_listen_t возвращает ноль. В противном случае возвращается значение RF_SOCKET_ERROR

Пример в коде:

/** @file network_platform.h */

/** @brief Pointer to the function that places a socket in a state in which
 * it is listening for an incoming connection.
 *
 * @param socket A descriptor identifying a bound, unconnected socket.
 * @param backlog The maximum length of the queue of pending connections.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*socket_listen_t)(void* socket, rfInt32 backlog);

socket_accept_t

Прототип:

typedef void* (*socket_accept_t)(void* socket, rfUint32* srs_ip_addr, rfUint16* srs_port);

Описание:

Указатель на функцию socket_accept_t разрешает попытку входящего подключения к сокету.

Параметры:
  • socket - Указатель дескриптора сокета

  • srs_ip_addr - Указатель на IP-адрес входящего соединения.

  • srs_port - Указатель на порт входящего соединения.

Возвращаемое значение:

Если ошибок не происходит, socket_accept_t возвращает указатель на дескриптор принятого сокета. В противном случае возвращается нулевой указатель.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that permits an incoming connection attempt
 * on a socket.
 *
 * @param socket A descriptor that identifies a socket that has been placed in
 * a listening state with the modbusSocketListen_t function.
 * The connection is actually made with the socket that is returned by accept.
 * @param srs_ip_addr Pointer to the IP address of the incoming connection.
 * @param srs_port Pointer to the port of the incoming connection.
 *
 * @return
 * - On success: value is a handle for the socket
 * - On error : NULL
 */
typedef void* (*socket_accept_t)(
        void* socket, rfUint32* srs_ip_addr, rfUint16* srs_port);

close_socket_t

Прототип:

typedef rfInt8 (*close_socket_t)(void* socket);

Описание:

Указатель на функцию close_socket_t закрывает существующий сокет.

Параметры:
  • socket - Указатель дескриптора сокета

Возвращаемое значение:

Если ошибок не происходит, close_socket_t возвращает ноль. В противном случае возвращается значение RF_SOCKET_ERROR

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that closes an existing socket.
 *
 * @param socket A descriptor identifying the socket to close.
 *
 * @return
 * - On success: 0
 * - On error: -1
 */
typedef rfInt8 (*close_socket_t)(void* socket);

send_tcp_data_t

Прототип:

typedef rfInt (*send_tcp_data_t)(void* socket, const void *buf, rfSize len);

Описание:

Указатель на функцию send_tcp_data_t отправляет данные в подключенный TCP сокет.

Параметры:
  • socket - Указатель дескриптора сокета

  • buf - Указатель на буфер, содержащий данные для передачи.

  • len - Длина в байтах данных в буфере, на который указывает параметр buf

Возвращаемое значение:

Если ошибок не происходит, send_tcp_data_t возвращает общее количество отправленных байтов, которое может быть меньше количества, запрошенного для отправки в параметре len . В противном случае возвращается значение -1.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the send function that sends data on a TCP
 * connected socket.
 *
 * @param socket A descriptor identifying a connected socket.
 * @param buf A pointer to a buffer containing the data to be transmitted.
 * @param len The length, in bytes, of the data in buffer pointed to by the
 * buf parameter.
 *
 * @return
 * - On success: the total number of bytes sent, which can be less than the
 * number requested to be sent in the len parameter.
 * - On error: -1
 */
typedef rfInt (*send_tcp_data_t)(void* socket, const void *buf, rfSize len);

send_udp_data_t

Прототип:

typedef rfInt (*send_udp_data_t)(void* socket, const void *data, rfSize len, rfUint32 dest_ip_addr, rfUint16 dest_port);

Описание:

Указатель на функцию send_udp_data_t отправляет данные по UDP в определенное место назначения.

Параметры:
  • socket - Указатель дескриптора сокета

  • data - Указатель на буфер, содержащий данные для передачи.

  • len - Длина в байтах данных в буфере, на который указывает параметр data

  • dest_ip_addr - IP-адрес, на который данные должны быть отправлены.

  • dest_port - Порт, на который данные должны быть отправлены.

Возвращаемое значение:

Если ошибок не происходит, send_udp_data_t возвращает общее количество отправленных байтов, которое может быть меньше количества, запрошенного для отправки в параметре len . В противном случае возвращается значение -1.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the send function that sends data on a UDP socket
 *
 * @param socket A descriptor identifying a socket.
 * @param buf A pointer to a buffer containing the message to be sent.
 * @param len The size of the message in bytes.
 * @param dest_addr Points to a sockaddr_in structure containing the
 * destination address.
 * @param addrlen Specifies the length of the sockaddr_in structure pointed
 * to by the dest_addr argument.
 *
 * @return
 * - On success: the total number of bytes sent, which can be less than
 * the number requested to be sent in the len parameter
 * - On error: -1
 */
typedef rfInt (*send_udp_data_t)(
        void* socket, const void *data, rfSize len,
        rfUint32 dest_ip_addr, rfUint16 dest_port);

recv_data_from_t

Прототип:

typedef rfInt (*recv_data_from_t)(void* socket, void *buf, rfSize len, rfUint32* srs_ip_addr, rfUint16* srs_port);

Описание:

Указатель на функцию recv_data_from_t получает данные из сокета и адрес отправителя.

Параметры:
  • socket - Указатель дескриптора сокета

  • buf - Указатель на буфер для приема входящих данных

  • len - Длина в байтах буфера, на который указывает параметр buf

  • srs_ip_addr - Указатель на IP-адрес из которого были получены данные

  • srs_port - Указатель на порт из которого были получены данные

Возвращаемое значение:

Если ошибок не происходит, recv_data_from_t возвращает общее количество принятых байтов. В противном случае возвращается значение -1.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that receive message from socket and capture
 * address of sender.
 *
 * @param socket Specifies a socket descriptor from which data should
 * be received.
 * @param buf Specifies the buffer in which to place the message.
 * @param len Specifies the length of the buffer area.
 * @param srs_ip_addr Pointer to the IP address from which the data
 * was received.
 * @param srs_port Pointer to the port from which the data was received.
 *
 * @return
 * - On success: the number of bytes received
 * - On error: -1
 */
typedef rfInt (*recv_data_from_t)(
        void* socket, void *buf, rfSize len,
        rfUint32* srs_ip_addr, rfUint16* srs_port);

recv_data_t

Прототип:

typedef rfInt (*recv_data_t)(void* socket, void *buf, rfSize len);

Описание:

Указатель на функцию recv_data_t получает данные от подключенного сокета или привязанного сокета без установления соединения.

Параметры:
  • socket - Указатель дескриптора сокета

  • buf - Указатель на буфер для приема входящих данных

  • len - Длина в байтах буфера, на который указывает параметр buf

Возвращаемое значение:

Если ошибок не происходит, recv_data_t возвращает общее количество принятых байтов. В противном случае возвращается значение -1.

Пример в коде:

/** @file network_platform.h */

/**
 * @brief Pointer to the function that receive message from socket and capture
 * address of sender.
 *
 * @param sockfd Specifies a socket descriptor from which data
 * should be received.
 * @param buf Specifies the buffer in which to place the message.
 * @param len Specifies the length of the buffer area.
 *
 * @return
 * - On success: the number of bytes received
 * - On error: -1
 */
typedef rfInt (*recv_data_t)(void* socket, void *buf, rfSize len);

trace_info_t, trace_warning_t, trace_error_t

Прототип:
  • typedef rfInt(*trace_info_t)(const rfChar* msg, …);

  • typedef rfInt(*trace_warning_t)(const rfChar* msg, …);

  • typedef rfInt(*trace_error_t)(const rfChar* msg, …);

Описание:

Указатели на функции trace_info_t , trace_warning_t и trace_error_t , необходимы для вывода как информационных сообщений, так и сообщений о предупреждениях и ошибках.

Параметры:
  • msg - Указатель на строку, содержащую текст для вывода

  • ... (дополнительные аргументы) - В зависимости от формата строки, функция может ожидать последовательность дополнительных аргументов.

Возвращаемое значение:

В случае успеха возвращается общее количество написанных символов

Пример в коде:

/** @file iostream_platform.h */

/**
 * @brief Method for outputting debugging information
 *
 * @param msg Pointer to a string containing the text to be output
 * @param ...(additional arguments) Depending on the format string,
 * the function may expect a sequence of additional arguments
 *
 * @return On success, the total number of characters written is returned.
 */
typedef rfInt(*trace_info_t)(const rfChar* msg, ...);

/**
 * @brief Method for outputting alert information
 *
 * @param msg Pointer to a string containing the text to be output
 * @param ...(additional arguments) Depending on the format string,
 * the function may expect a sequence of additional arguments
 *
 * @return On success, the total number of characters written is returned.
 */
typedef rfInt(*trace_warning_t)(const rfChar* msg, ...);

/**
 * @brief Method for outputting error information
 *
 * @param msg Pointer to a string containing the text to be output
 * @param ...(additional arguments) Depending on the format string,
 * the function may expect a sequence of additional arguments
 *
 * @return On success, the total number of characters written is returned.
 */
typedef rfInt(*trace_error_t)(const rfChar* msg, ...);

Запуск «ядра»

После реализации всех платформозависимых функций разработчику необходимо проинициализировать следующие структуры iostream_platform_dependent_methods_t, memory_platform_dependent_methods_t и network_platform_dependent_methods_t

Пример в коде:

/** @file iostream_platform.h */

/**
 * @brief Structure with user-provided iostream platform-specific methods
 */
typedef struct
{
   trace_info_t trace_info;
   trace_warning_t trace_warning;
   trace_error_t trace_error;
}iostream_platform_dependent_methods_t;
extern iostream_platform_dependent_methods_t iostream_platform;


/** @file memory_platform.h */

/**
 * @brief Structure with user-provided memory platform-specific methods
 */
typedef struct
{
   calloc_t rf_calloc;
   malloc_t rf_malloc;
   realloc_t rf_realloc;
   free_t rf_free;

   memset_t rf_memset;
   memcpy_t rf_memcpy;
   memcmp_t rf_memcmp;

}memory_platform_dependent_methods_t;
extern memory_platform_dependent_methods_t memory_platform;


   /** @file memory_platform.h */

/**
 * @brief Structure with user-provided network platform-specific methods
 */
typedef struct
{
   hton_long_t hton_long;
   ntoh_long_t ntoh_long;
   hton_short_t hton_short;
   ntoh_short_t ntoh_short;

   create_udp_socket_t create_udp_socket;
   set_broadcast_socket_option_t set_broadcast_socket_option;
   set_reuseaddr_socket_option_t set_reuseaddr_socket_option;
   set_socket_option_t set_socket_option;
   set_socket_recv_timeout_t set_socket_recv_timeout;
   socket_connect_t socket_connect;
   socket_bind_t socket_bind;
   socket_listen_t socket_listen;
   socket_accept_t  socket_accept;
   close_socket_t close_socket;

   send_tcp_data_t send_tcp_data;
   send_udp_data_t send_udp_data;

   recv_data_from_t recv_data_from;
   recv_data_t recv_data;
}network_platform_dependent_methods_t;

typedef struct
{
   rfUint32 host_ip_addr;
   rfUint32 host_mask;
}network_platform_dependent_settings_t;

typedef struct
{
   network_platform_dependent_methods_t network_methods;
   network_platform_dependent_settings_t network_settings;
}network_platform_t;
extern network_platform_t network_platform;

Инициализация данных структур производится путем присваивания указателей на реализованные платформозависимые функции, а адреса проинициализированных экземпляров структур передаются в метод init_platform_dependent_methods для инициализации кросс-платформенной части «ядра».

Пример в коде:

/** @file rf62X_core.h */

/**
 * @brief Init platform dependent methods and settings
 *
 * @param memory_methods Structure with platform-specific methods
 * for work with memory
 * @param iostream_methods Structure with platform-specific methods
 * for work with iostream
 * @param network_methods Structure with platform-specific methods
 * for work with network
 * @param adapter_settings Structure with adapter settings
 */
API_EXPORT void init_platform_dependent_methods(
         memory_platform_dependent_methods_t* memory_methods,
         iostream_platform_dependent_methods_t* iostream_methods,
         network_platform_dependent_methods_t* network_methods,
         network_platform_dependent_settings_t* adapter_settings);