pico-util
实用数据结构与工具函数。
模块
datetime
日期/时间格式化。
fixed_bitset
简单的固定大小位集实现。
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,但声明为弱实现以允许用户代码覆盖它。
fixed_bitset
简单的固定大小位集实现。
宏
#define fixed_bitset_type(N)#define fixed_bitset_with_fill(type, N, fill) ({ type bitset; fixed_bitset_init(&bitset, type, N, fill); bitset; })#define fixed_bitset_init(ptr, type, N, fill)
函数
static uint fixed_bitset_size (const fixed_bitset_t *bitset)
获取位集的大小。
static uint fixed_bitset_word_size (const fixed_bitset_t *bitset)
获取位集的大小(以字为单位)。
static void check_fixed_bitset (__unused const fixed_bitset_t *bitset)
检查位集是否有效。
static fixed_bitset_t * fixed_bitset_write_word (fixed_bitset_t *bitset, uint word_num, uint32_t value)
写入位集中的一个字。
static uint32_t fixed_bitset_read_word (const fixed_bitset_t *bitset, uint word_num)
读取位集中的一个字。
static fixed_bitset_t * fixed_bitset_clear_all (fixed_bitset_t *bitset)
清除位集中的所有位。
static fixed_bitset_t * fixed_bitset_set_all (fixed_bitset_t *bitset)
设置位集中的所有位。
fixed_bitset_t * fixed_bitset_flip_all (fixed_bitset_t *bitset)
翻转位集中的所有位。
bool fixed_bitset_is_empty (fixed_bitset_t *bitset)
判断位集是否为空。
static fixed_bitset_t * fixed_bitset_set (fixed_bitset_t *bitset, uint bit_index)
设置位集中的单个位。
static fixed_bitset_t * fixed_bitset_clear (fixed_bitset_t *bitset, uint bit_index)
清除位集中的单个位。
static fixed_bitset_t * fixed_bitset_flip (fixed_bitset_t *bitset, uint bit_index)
翻转位集中的单个位。
static bool fixed_bitset_get (const fixed_bitset_t *bitset, uint bit_index)
获取位集中单个位的值。
static bool fixed_bitset_equal (const fixed_bitset_t *bitset1, const fixed_bitset_t *bitset2)
检查两个位集是否相等。
宏定义文档
fixed_bitset_type
#define fixed_bitset_type(N) union { \
fixed_bitset_t bitset; \
struct { \
uint16_t size; \
uint16_t word_size; \
uint32_t words[((N) + 31) / 32]; \
} sized_bitset; \
}
用于定义给定大小的固定位集的宏。
此宏用于声明固定位集的类型。用法如下:
typedef fixed_bitset_type(17) my_bitset_t;
将定义一个名为 my_bitset_t 的新位集类型,可容纳 17 个布尔值。
该类型可使用 my_bitset_t bitset; 来声明新的位集。
参数
- N: 位集中布尔值的数量
fixed_bitset_with_fill
#define fixed_bitset_with_fill(type, N, fill) ({ type bitset; fixed_bitset_init(&bitset, type, N, fill); bitset; })
用于创建所有位设置为指定值的位集的宏。
参数
- type: 位集的类型
- N: 位集中的位数
- fill: 要将位设置的值(0 或 1)
返回
位集
fixed_bitset_init
#define fixed_bitset_init(ptr, type, N, fill) ({ \
assert(sizeof(type) == fixed_bitset_sizeof_for(N)); \
__unused type *type_check = ptr; \
(ptr)->bitset.size = N; \
(ptr)->bitset.word_size = ((N) + 31u) / 32u; \
__builtin_memset(&(ptr)->bitset.words, (fill) ? 0xff : 0, (ptr)->bitset.word_size * sizeof(uint32_t)); \
})
初始化位集。
参数
- ptr: 要初始化的位集
- type: 位集的类型
- N: 位集中的位数
- fill: 要填充位集的值(0 或 1)
函数文档
check_fixed_bitset
static void check_fixed_bitset (__unused const fixed_bitset_t * bitset) [inline], [static]
检查位集是否有效。
如果位集无效,此函数将触发断言。
参数
- bitset: 要检查的位集
fixed_bitset_clear
static fixed_bitset_t * fixed_bitset_clear (fixed_bitset_t * bitset, uint bit_index) [inline], [static]
清除位集中的单个位。
参数
- bitset: 位集
- bit_index: 要清除的位
返回
位集
fixed_bitset_clear_all
static fixed_bitset_t * fixed_bitset_clear_all (fixed_bitset_t * bitset) [inline], [static]
清除位集中的所有位。
参数
- bitset: 位集
返回
位集
fixed_bitset_equal
static bool fixed_bitset_equal (const fixed_bitset_t * bitset1, const fixed_bitset_t * bitset2) [inline], [static]
检查两个位集是否相等。
参数
- bitset1: 要检查的第一个位集
- bitset2: 要检查的第二个位集
返回
若位集相等返回 true,否则返回 false
fixed_bitset_flip
static fixed_bitset_t * fixed_bitset_flip (fixed_bitset_t * bitset, uint bit_index) [inline], [static]
翻转位集中的单个位。
参数
- bitset: 位集
- bit_index: 要翻转的位
返回
位集
fixed_bitset_flip_all
fixed_bitset_t * fixed_bitset_flip_all (fixed_bitset_t * bitset)
翻转位集中的所有位。
参数
- bitset: 位集
返回
位集
fixed_bitset_get
static bool fixed_bitset_get (const fixed_bitset_t * bitset, uint bit_index) [inline], [static]
获取位集中单个位的值。
参数
- bitset: 位集
- bit_index: 要获取值的位
返回
该位的值
fixed_bitset_is_empty
bool fixed_bitset_is_empty (fixed_bitset_t * bitset)
判断位集是否为空。
参数
- bitset: 位集
返回
若没有位被设置返回 true
fixed_bitset_read_word
static uint32_t fixed_bitset_read_word (const fixed_bitset_t * bitset, uint word_num) [inline], [static]
读取位集中的一个字。
参数
- bitset: 位集
- word_num: 要读取的字编号
返回
该字的值
fixed_bitset_set
static fixed_bitset_t * fixed_bitset_set (fixed_bitset_t * bitset, uint bit_index) [inline], [static]
设置位集中的单个位。
参数
- bitset: 位集
- bit_index: 要设置的位
返回
位集
fixed_bitset_set_all
static fixed_bitset_t * fixed_bitset_set_all (fixed_bitset_t * bitset) [inline], [static]
设置位集中的所有位。
参数
- bitset: 位集
返回
位集
fixed_bitset_size
static uint fixed_bitset_size (const fixed_bitset_t * bitset) [inline], [static]
获取位集的大小。
参数
- bitset: 要获取大小的位集
返回
位集的大小
fixed_bitset_word_size
static uint fixed_bitset_word_size (const fixed_bitset_t * bitset) [inline], [static]
获取位集的大小(以字为单位)。
参数
- bitset: 要获取大小的位集
返回
位集的大小(以字为单位)
fixed_bitset_write_word
static fixed_bitset_t * fixed_bitset_write_word (fixed_bitset_t * bitset, uint word_num, uint32_t value) [inline], [static]
写入位集中的一个字。
参数
- bitset: 要写入的位集
- word_num: 要写入的字编号
- value: 要写入该字的值
返回
位集
pheap
配对堆实现。
详细描述
pheap 定义了一个简单的配对堆。该实现仅跟踪数组索引,由用户负责提供堆条目的存储和比较函数。
此类不支持并发使用,需要外部保护。此外,如果并发使用,调用者需要在使用返回的 id 时进行保护。例如,ph_remove_and_free_head 返回一个不再在堆中的元素 id。用户仍可用它查看伴随数组中的数据,但显然对堆的进一步操作可能会覆盖那些数据,因为该 id 可能在后续操作中被重用。
宏
#define PHEAP_DEFINE_STATIC(name, _max_nodes)