erpc/erpc_core.h

108 lines
3.7 KiB
C
Raw Permalink Normal View History

2024-12-08 01:14:22 +00:00
#ifndef _ERPC_CORE_H_
#define _ERPC_CORE_H_
2024-11-21 08:59:31 +00:00
#include "config.h"
2024-11-20 15:03:26 +00:00
2024-12-08 01:14:22 +00:00
#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;
2024-11-21 08:59:31 +00:00
/**
2024-12-08 01:14:22 +00:00
*
2024-11-21 08:59:31 +00:00
*/
2024-12-08 01:14:22 +00:00
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_