用于RP2040的软件临界区,支持递归重入。

话不多说,直接上代码:

#ifndef _RECURSIVE_SECTION_
#define _RECURSIVE_SECTION_
#include "Common.h"


class CRecursiveSection 
{


    private:
        std::atomic<uint32_t> owner_core;   // 锁所有者的核心ID
        uint32_t recursion_count;           // 递归锁定计数



    public:

        inline CRecursiveSection():
        owner_core(UINT32_MAX), recursion_count(0) 
        {
        }
        
        // 锁定函数 (支持递归)
        inline void Enter() 
        {
            const uint32_t current_core = get_core_num();
            
            // 检查是否是当前核心的递归锁定
            if( owner_core.load() == current_core ) 
            {
                recursion_count++;
                return;
            }
            
            // 等待直到获取锁
            while( true ) 
            {
                uint32_t expected = UINT32_MAX;
                if( owner_core.compare_exchange_weak(expected, current_core) ) 
                {
                    recursion_count = 1;
                    break;
                }
                
                // 避免忙等待消耗CPU
                sleep_us(1); 
            }
        }

        // 解锁函数
        inline void Leave() 
        {
            const uint32_t current_core = get_core_num();
            
            // 确保只有锁的拥有者才能解锁
            if( owner_core.load() == current_core ) 
            {
                // 如果递归计数归零,释放锁
                if( -- recursion_count == 0 ) {
                    owner_core.store(UINT32_MAX);
                }
            }
        }

        // 获取递归深度
        inline uint32_t GetDepth() const {
            return recursion_count;
        }


};



#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值