erpc/erpc_core.h

108 lines
3.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _ERPC_CORE_H_
#define _ERPC_CORE_H_
#include "config.h"
#define ERPC_VERSION_MAJOR 0
#define ERPC_VERSION_MINOR 0
#define ERPC_VERSION_PATCH 1
#define ERPC_HW_CACHE_SIZE 10 // erpc 硬件缓存大小,单位为包
#define ERPC_SEND_ONCE_TIMEOUT 30 // ERPC_数据包发送超时时间单位为tick
#define ERPC_SEND_RETRY_COUNT 3 // ERPC_数据包重发次数
#define ERPC_ACK_TIMEOUT ERPC_SEND_ONCE_TIMEOUT // ERPC_ack超时时间单位为tick
typedef struct erpc_package_head_t
{
u8 dest_id;
u8 src_id;
u16 port;
u8 type;
u16 len;
} erpc_package_head_t;
// crc16 只能保护256字节的有效数据所以这里限制最大数据长度为256-sizeof(erpc_package_head_t)
#define ERPC_DATA_MAX_LEN (256 - sizeof(erpc_package_head_t))
typedef struct erpc_package_t
{
erpc_package_head_t head;
u16 crc;
u8 data[ERPC_DATA_MAX_LEN];
} erpc_package_t;
typedef struct erpc_packet_cache_t
{
u8 state;
u8 retry_count;
u8 timeout;
erpc_package_t package;
} erpc_packet_cache_t;
typedef enum cache_state
{
ERPC_CACHE_STA_FREE = 0, // 空闲状态
ERPC_CACHE_WAIT_SEND, // data包等待发送
ERPC_CACHE_SEND_ONCE, // 已经发送过一次等待ack
ERPC_CACHE_SEND_REPEAT, // data包多次发送
ERPC_CACHE_SEND_GET_ACK, // data包发送完成得到ack
ERPC_CACHE_HW_SEND_ERR, // 硬件发送失败
ERPC_CACHE_ERR_NO_RESP, // dest 无响应
ERPC_CACHE_RESP_DATA, // 收到响应包
ERPC_CACHE_REV_PACKAGE, // 收到数据包,但是还没有进行处理
ERPC_CACHE_RESP_ACK, // 接收到数据包正在回复ack
ERPC_CACHE_WAIT_DEAL, // 等待处理线程处理数据,处理线程已经获取到处理权限
} cache_state;
typedef enum erpc_package_type
{
ERPC_PKG_TYPE_REQUEST = 0,
ERPC_PKG_TYPE_RESPONSE,
ERPC_PKG_TYPE_ACK,
} erpc_package_type;
typedef enum erpc_transport_error
{
ERPC_ERR_SEND_CACHE_FULL = 1,
ERPC_ERR_SEND_TIMEOUT,
ERPC_ERR_DATA_LEN_OVERFLOW,
ERPC_ERR_HW_SEND_FAIL,
ERPC_ERR_DEST_NO_RESP,
} erpc_transport_state;
typedef struct erpc_handle_list_t
{
u16 port;
void (*handle)(void *hw, u8 src_id, u16 port);
} erpc_handle_list_t;
/**
* 硬件层实现
*/
typedef struct erpc_hardware_t
{
erpc_packet_cache_t send_cache[ERPC_HW_CACHE_SIZE];
erpc_packet_cache_t recv_cache[ERPC_HW_CACHE_SIZE];
u8 local_id; // hardware 节点ID
u32 (*send)(u8 *data, u32 len); // 需要在内部实现lock功能,确保send函数是原子操作
u32 (*sleep)(u32 ms); // 睡眠函数
void (*lock)(void); // 锁函数
void (*unlock)(void); // 解锁函数
erpc_handle_list_t *handle_list; // 处理函数列表
} erpc_hardware_t;
#define CHECK_RETURN(condition, ret) \
if (condition) \
{ \
return ret; \
}
#define CHECK_RETURN_DO(condition, ret, handle) \
if (condition) \
{ \
handle; \
return ret; \
}
u32 erpc_send_and_wait_resp(erpc_hardware_t *hw, u8 dest_id, u16 port, u8 *data, u16 len, u8 *resp_data, u16 *resp_len, u32 timeout);
u32 erpc_resp(erpc_hardware_t *hw, u8 dest_id, u16 port, u8 *data, u16 len, u32 timeout);
u32 erpc_data_out_core(erpc_hardware_t *hw);
void erpc_write_recv_cache(erpc_hardware_t *hw, u8 *data, u16 len);
u32 erpc_data_in_core(erpc_hardware_t *hw);
u32 erpc_deal_core(erpc_hardware_t *hw);
#endif // _ERPC_CORE_H_