程序逻辑的梳理
- 上面的逻辑优化: 将SPI处理线程与RF出现线程合并掉
整理之后得逻辑时序图如下:(黑色为接收缓存,红色为发送缓存)
对应的软件缓存操作的链表与缓存的结构定义如下:
rbuf_t rbuf[SPI_RBUF_SZIE + 1]; /* 接收缓存 */
tbuf_t tbuf[SPI_RBUF_SZIE + 1]; /* 发送缓存 */
node_t rbuf_node[SPI_RBUF_SZIE]; /* 接收缓存节点 */
node_t tbuf_node[SPI_RBUF_SZIE]; /* 发送缓存节点 */
list_t s0_rbuf_list; /* 未使用 SPI 接收缓存 */
list_t spi_rbuf_list; /* 中断接收 */
list_t rf_rbuf_list; /* 待处理 RF 缓存数据 */
list_t s0_tbuf_list; /* 未使用 SPI 发送缓存 */
list_t spi_tbuf_list; /* 处理好等待发送 SPI 缓存 */
程序核心代码
核心数据结构
struct node
{
struct node *next; /**< point to next node. */
struct node *prev; /**< point to prev node. */
uint8_t *pbuf;
};
typedef struct node node_t; /**< Type for lists. */
typedef struct node list_t; /**< Type for lists. */
核心函数
void list_init(list_t *l)
{
l->next = l->prev = l;
}
void list_insert_after(list_t *l, node_t *n)
{
__set_PRIMASK(1);
l->next->prev = n;
n->next = l->next;
l->next = n;
n->prev = l;
__set_PRIMASK(0);
}
void list_insert_before(list_t *l, node_t *n)
{
__set_PRIMASK(1);
l->prev->next = n;
n->prev = l->prev;
l->prev = n;
n->next = l;
__set_PRIMASK(0);
}
void list_remove(list_t *n)
{
__set_PRIMASK(1);
n->next->prev = n->prev;
n->prev->next = n->next;
n->next = n->prev = n;
__set_PRIMASK(0);
}
uint32_t list_isempty(const list_t *l)
{
return l->next == l;
}
uint32_t list_len(const list_t *l)
{
__set_PRIMASK(1);
uint32_t len = 0;
const list_t *p = l;
while (p->next != l)
{
p = p->next;
len++;
}
__set_PRIMASK(0);
return len;
}
核心操作
移除节点
node_t *c_node;
c_node = spi_tcb.spi_rbuf_list.next;
list_remove(spi_tcb.spi_rbuf_list.next);
添加节点
list_insert_before(&spi_tcb.spi_tbuf_list, c_node);
转接节点
从 rf_rbuf_list 移除头结点转接到 s0_rbuf_list 尾节点上默认拼接采用FIFO的方式操作
node_t *c_node = spi_tcb.rf_rbuf_list.next;
list_remove(spi_tcb.rf_rbuf_list.next);
list_insert_before(&spi_tcb.s0_rbuf_list, (node_t *)c_node);
调试操作的显示如下:
LIST_BUF_LOG("[%s] rlist:[i:%2d r:%2d d:%2d] tlist:[u:%2d t:%2d]\n",
tag, list_len(&spi_tcb.s0_rbuf_list), list_len(&spi_tcb.spi_rbuf_list),
list_len(&spi_tcb.rf_rbuf_list), list_len(&spi_tcb.s0_tbuf_list),
list_len(&spi_tcb.spi_tbuf_list));
调试操作的对应的输出如下:
从日志中可以看到数据节点在不同的链表上面流转。