#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_