Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
bitarray.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS_BITARRAY_H_
8#define ZEPHYR_INCLUDE_SYS_BITARRAY_H_
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14#include <stddef.h>
15#include <stdint.h>
16
17#include <zephyr/kernel.h>
18#include <zephyr/sys/util.h>
19
32
34struct sys_bitarray {
35 /* Number of bits */
36 uint32_t num_bits;
37
38 /* Number of bundles */
39 uint32_t num_bundles;
40
41 /* Bundle of bits */
42 uint32_t *bundles;
43
44 /* Spinlock guarding access to this bit array */
45 struct k_spinlock lock;
46};
48
50typedef struct sys_bitarray sys_bitarray_t;
51
59#define _SYS_BITARRAY_DEFINE(name, total_bits, sba_mod) \
60 sba_mod uint32_t _sys_bitarray_bundles_##name \
61 [DIV_ROUND_UP(DIV_ROUND_UP(total_bits, 8), \
62 sizeof(uint32_t))] = {0}; \
63 sba_mod sys_bitarray_t name = { \
64 .num_bits = (total_bits), \
65 .num_bundles = DIV_ROUND_UP( \
66 DIV_ROUND_UP(total_bits, 8), sizeof(uint32_t)), \
67 .bundles = _sys_bitarray_bundles_##name, \
68 }
69
76#define SYS_BITARRAY_DEFINE(name, total_bits) \
77 _SYS_BITARRAY_DEFINE(name, total_bits,)
78
85#define SYS_BITARRAY_DEFINE_STATIC(name, total_bits) \
86 _SYS_BITARRAY_DEFINE(name, total_bits, static)
87
98int sys_bitarray_set_bit(sys_bitarray_t *bitarray, size_t bit);
99
110int sys_bitarray_clear_bit(sys_bitarray_t *bitarray, size_t bit);
111
123int sys_bitarray_test_bit(sys_bitarray_t *bitarray, size_t bit, int *val);
124
136int sys_bitarray_test_and_set_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val);
137
149int sys_bitarray_test_and_clear_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val);
150
170int sys_bitarray_alloc(sys_bitarray_t *bitarray, size_t num_bits,
171 size_t *offset);
172
187int sys_bitarray_xor(sys_bitarray_t *dst, sys_bitarray_t *other, size_t num_bits, size_t offset);
188
208int sys_bitarray_find_nth_set(sys_bitarray_t *bitarray, size_t n, size_t num_bits, size_t offset,
209 size_t *found_at);
210
225int sys_bitarray_popcount_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset,
226 size_t *count);
227
243int sys_bitarray_free(sys_bitarray_t *bitarray, size_t num_bits,
244 size_t offset);
245
259bool sys_bitarray_is_region_set(sys_bitarray_t *bitarray, size_t num_bits,
260 size_t offset);
261
275bool sys_bitarray_is_region_cleared(sys_bitarray_t *bitarray, size_t num_bits,
276 size_t offset);
277
292int sys_bitarray_set_region(sys_bitarray_t *bitarray, size_t num_bits,
293 size_t offset);
294
318 size_t offset, bool to_set);
319
334int sys_bitarray_clear_region(sys_bitarray_t *bitarray, size_t num_bits,
335 size_t offset);
336
340
341#ifdef __cplusplus
342}
343#endif
344
345#endif /* ZEPHYR_INCLUDE_SYS_BITARRAY_H_ */
int sys_bitarray_find_nth_set(sys_bitarray_t *bitarray, size_t n, size_t num_bits, size_t offset, size_t *found_at)
Find nth bit set in region.
struct sys_bitarray sys_bitarray_t
Bitarray structure.
Definition bitarray.h:50
int sys_bitarray_xor(sys_bitarray_t *dst, sys_bitarray_t *other, size_t num_bits, size_t offset)
Calculates the bit-wise XOR of two bitarrays in a region.
bool sys_bitarray_is_region_cleared(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Test if bits in a region is all cleared.
bool sys_bitarray_is_region_set(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Test if bits in a region is all set.
int sys_bitarray_test_and_clear_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val)
Test the bit and clear it.
int sys_bitarray_set_bit(sys_bitarray_t *bitarray, size_t bit)
Set a bit in a bit array.
int sys_bitarray_clear_bit(sys_bitarray_t *bitarray, size_t bit)
Clear a bit in a bit array.
int sys_bitarray_popcount_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset, size_t *count)
Count bits set in a bit array region.
int sys_bitarray_set_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Set all bits in a region.
int sys_bitarray_alloc(sys_bitarray_t *bitarray, size_t num_bits, size_t *offset)
Allocate bits in a bit array.
int sys_bitarray_clear_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Clear all bits in a region.
int sys_bitarray_test_and_set_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val)
Test the bit and set it.
int sys_bitarray_test_and_set_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset, bool to_set)
Test if all bits in a region are cleared/set and set/clear them in a single atomic operation.
int sys_bitarray_test_bit(sys_bitarray_t *bitarray, size_t bit, int *val)
Test whether a bit is set or not.
int sys_bitarray_free(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Free bits in a bit array.
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Misc utilities.