pico-util
实用数据结构与工具函数。
模块
datetime
日期/时间格式化。
pheap
配对堆实现。
queue
多核与 IRQ 安全的队列实现。
datetime
日期/时间格式化。
函数
struct tm ** pico_localtime_r (const time_t **time, struct tm *tm)
供 pico_util datetime 函数使用的 localtime_r 实现。
time_t pico_mktime (struct tm *tm)
供 pico_util datetime 函数使用的 mktime 实现。
函数文档
pico_localtime_r
struct tm ** pico_localtime_r (const time_t ** time, struct tm * tm)`
供 pico_util datetime 函数使用的 localtime_r 实现。
此方法默认调用 C 库中的 localtime_r,但声明为弱实现以允许用户代码覆盖它。
pico_mktime
time_t pico_mktime (struct tm * tm)
供 pico_util datetime 函数使用的 mktime 实现。
此方法默认调用 C 库中的 mktime,但声明为弱实现以允许用户代码覆盖它。
pheap
配对堆实现。
详细描述
pheap 定义了一个简单的配对堆。该实现仅跟踪数组索引,由用户负责提供堆条目的存储和比较函数。
此类不支持并发使用,需要外部保护。此外,如果并发使用,调用者需要在使用返回的 id 时进行保护。例如,ph_remove_and_free_head 返回一个不再在堆中的元素 id。用户仍可用它查看伴随数组中的数据,但显然对堆的进一步操作可能会覆盖那些数据,因为该 id 可能在后续操作中被重用。
宏
#define [PHEAP_DEFINE_STATIC](name, _max_nodes)
类型定义
typedef bool(** pheap_comparator)(void **user_data, pheap_node_id_t a, pheap_node_id_t b)
配对堆节点的用户比较函数。
函数
pheap_t ** ph_create (uint max_nodes, pheap_comparator comparator, void **user_data)
创建一个配对堆,有效地维护节点的高效排序。堆本身不存储每个节点的用户状态,用户需要维护一个伴随数组。必须提供比较函数,以便堆实现能够确定节点的相对顺序。
void ph_clear (pheap_t *heap)
从配对堆中移除所有节点。
void ph_destroy (pheap_t *heap)
释放配对堆。
static pheap_node_id_t ph_new_node (pheap_t *heap)
从堆的未用空间中分配一个新节点。
static pheap_node_id_t ph_insert_node (pheap_t *heap, pheap_node_id_t id)
将节点插入堆中。
static pheap_node_id_t ph_peek_head (pheap_t *heap)
返回堆中的头节点(即比较结果最靠前的节点),但不将其从堆中移除。
pheap_node_id_t ph_remove_head (pheap_t *heap, bool free)
从配对堆中移除头节点。头节点是比较器提供的逻辑顺序中排在最前面的节点。
static pheap_node_id_t ph_remove_and_free_head (pheap_t *heap)
从配对堆中移除头节点。头节点是比较器提供的逻辑顺序中排在最前面的节点。
bool ph_remove_and_free_node (pheap_t *heap, pheap_node_id_t id)<br/> 从配对堆中移除并释放任意节点。此操作比通过 ph_remove_and_free_head() 移除头节点代价更高。
static bool ph_contains_node (pheap_t *heap, pheap_node_id_t id)
判断堆是否包含给定节点。注意包含是指节点是否已被插入(ph_insert_node())而非已分配(ph_new_node())。
static void ph_free_node (pheap_t *heap, pheap_node_id_t id)
释放一个当前不在堆中但已分配的节点。
void ph_dump (pheap_t **heap, void(**dump_key)(pheap_node_id_t id, void **user_data), void **user_data)
打印堆的调试表示。
void ph_post_alloc_init (pheap_t **heap, uint max_nodes, pheap_comparator comparator, void **user_data)
初始化静态分配的堆(通过 C 堆使用 ph_create())。堆的 nodes 成员必须已分配大小为 max_nodes。
宏定义文档
PHEAP_DEFINE_STATIC
#define PHEAP_DEFINE_STATIC(name, _max_nodes) static_assert(_max_nodes && _max_nodes < (1u << (8 * sizeof(pheap_node_id_t))), ""); \
static pheap_node_t name ## _nodes[_max_nodes]; \
static pheap_t name = { \
.nodes = name ## _nodes, \
.max_nodes = _max_nodes \
};
定义静态分配的配对堆。必须通过 ph_post_alloc_init 进行初始化。