Bitmap位图数据结构总结(可应用于查找RTOS中优先级最高的任务)

1、定义一个位图数据结构,支持32位的位图

typedef struct 
{
	uint32_t bitmap;
}tBitmap;

2、位图结构的初始化

void tBitmapInit (tBitmap * bitmap) 
{
	bitmap->bitmap = 0;
}

3、位图结构的某个位的设置以及删除

void tBitmapSet (tBitmap * bitmap, uint32_t pos)
{
	bitmap->bitmap |= 1 << pos;
}
void tBitmapClear (tBitmap * bitmap, uint32_t pos)
{
	bitmap->bitmap &= ~(1 << pos);
}

4、返回位图的大小

uint32_t tBitmapPosCount (void) 
{
	return sizeof(uint32_t);
}

5、从位图第0个位开始查找,找到第一个被设置为1的位是第几位

uint32_t tBitmapGetFirstSet (tBitmap * bitmap) 
{
    	static const uint8_t quickFindTable[] =     
	{
	    /* 00 */ 0xff, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 10 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 20 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 30 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 40 */ 6,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 50 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 60 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 70 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 80 */ 7,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 90 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* A0 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* B0 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* C0 */ 6,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* D0 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* E0 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* F0 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
	};

        if (bitmap->bitmap & 0xff)
        {
            return quickFindTable[bitmap->bitmap & 0xff];
        }
        else if (bitmap->bitmap & 0xff00)
        {
            return quickFindTable[(bitmap->bitmap >> 8) & 0xff] + 8;
        }
        else if (bitmap->bitmap & 0xff0000)
        {
            return quickFindTable[(bitmap->bitmap >> 16) & 0xff] + 16;
        }
        else if (bitmap->bitmap & 0xff000000)
        {
            return quickFindTable[(bitmap->bitmap >> 24) & 0xFF] + 24;
        }
        else
        {
            return tBitmapPosCount();
        }
}

 

在车机系统中,MCU(Micro Control Unit)承担着实时控制、数据处理和通信等关键任务。为了高效完成这些任务,车机系统中常使用多种数据结构来组织和管理数据。以下是一些常用的**数据结构及其在车机系统中的应用场景**: ### 3.1 队列(Queue) 队列是一种先进先出(FIFO)的数据结构,广泛用于任务调度和异步通信中。例如,在CAN总线通信中,接收或发送的消息帧通常通过队列进行缓存,以确保消息按顺序处理[^2]。 ```c typedef struct { uint8_t *data; int front; int rear; int capacity; } Queue; void enqueue(Queue *q, uint8_t value); uint8_t dequeue(Queue *q); ``` **应用场景**: - CAN总线消息缓冲区管理。 - 实时操作系统(RTOS)中的任务调度队列。 ### 3.2 栈(Stack) 栈是一种后进先出(LIFO)的数据结构,常见于函数调用、中断嵌套以及状态保存等场景。在MCU的中断服务程序中,栈用于保存寄存器现场和返回地址[^1]。 ```c typedef struct { uint32_t *stack; int top; int capacity; } Stack; void push(Stack *s, uint32_t value); uint32_t pop(Stack *s); ``` **应用场景**: - 中断处理中的上下文保存。 - 状态机的回溯与恢复。 ### 3.3 链表(Linked List) 链表提供灵活的内存分配方式,适合动态数据管理。在需要频繁插入和删除节点的场合(如设备驱动注册表、任务控制块链),链表非常实用[^4]。 ```c typedef struct Node { void *data; struct Node *next; } ListNode; void insert(ListNode **head, void *newData); void delete(ListNode **head, void *targetData); ``` **应用场景**: - 设备驱动链表维护。 - 动态任务控制块(TCB)管理。 ### 3.4 数组(Array) 数组是最基础也是最常用的数据结构之一,适用于存储固定大小的数据集合。例如,ADC采样值、PWM波形数据、传感器数据缓存等都常使用数组实现。 ```c #define MAX_ADC_SAMPLES 100 uint16_t adcSamples[MAX_ADC_SAMPLES]; ``` **应用场景**: - ADC采样缓冲。 - PWM波形生成表。 - 数据日志记录。 ### 3.5 哈希表(Hash Table) 哈希表用于快速查找和匹配操作。在需要快速访问配置参数或映射关系的场景中(如车辆ID到CAN通道的映射),哈希表能显著提升效率[^4]。 ```c typedef struct HashNode { uint32_t key; void *value; struct HashNode *next; } HashNode; typedef struct { HashNode **buckets; int size; } HashTable; void hashInsert(HashTable *table, uint32_t key, void *value); void* hashGet(HashTable *table, uint32_t key); ``` **应用场景**: - 车辆网络节点ID映射。 - 参数配置数据库索引。 ### 3.6 树(Tree) 树结构(尤其是二叉搜索树、红黑树)用于有序数据管理。例如,在事件调度系统中,可以使用时间排序的树结构来管理定时任务[^3]。 ```c typedef struct TreeNode { uint32_t timestamp; void *eventData; struct TreeNode *left; struct TreeNode *right; } TreeNode; TreeNode* insertEvent(TreeNode *root, uint32_t timestamp, void *eventData); TreeNode* findNextEvent(TreeNode *root); ``` **应用场景**: - 定时任务调度。 - 事件优先级管理。 ### 3.7 位图Bitmap位图用于表示布尔状态集合,特别适合资源有限的嵌入式系统。例如,GPIO引脚占用状态、DMA通道使用情况等都可以用位图高效表示[^1]。 ```c #define NUM_GPIO_PINS 32 uint32_t gpioUsageBitmap; // 每一位代表一个GPIO是否被占用 void setGpioUsed(int pin) { gpioUsageBitmap |= (1 << pin); } void setGpioFree(int pin) { gpioUsageBitmap &= ~(1 << pin); } int isGpioUsed(int pin) { return (gpioUsageBitmap >> pin) & 1; } ``` **应用场景**: - GPIO引脚管理。 - DMA通道状态跟踪。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值