Компиляция «ядра»¶
Как скомпилировать¶
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- Длина в байтах данных в буфере, на который указывает параметрdatadest_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- Длина в байтах буфера, на который указывает параметрbufsrs_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);