nrf_ringbuf

    nrf_ringbuf_init(&m_log_push_ringbuf);
    上面一句话干了啥?
    1--参数是啥
    没有参数 goto只看到前面这句话 风格很nordic
    如下
    也就是一股脑出来很多static东西!!
    
    NRF_RINGBUF_DEF(m_log_push_ringbuf, NRF_LOG_STR_PUSH_BUFFER_SIZE);
    
    #define NRF_RINGBUF_DEF(_name, _size)                                         \
    STATIC_ASSERT(IS_POWER_OF_TWO(_size));                                    \
    static uint8_t CONCAT_2(_name,_buf)[_size];                               \
    static nrf_ringbuf_cb_t CONCAT_2(_name,_cb);                              \
    static const nrf_ringbuf_t _name = {                                      \
            .p_buffer = CONCAT_2(_name,_buf),                                 \
            .bufsize_mask = _size - 1,                                        \
            .p_cb         = &CONCAT_2(_name,_cb),                             \
    }
    
    
    
typedef struct
{
    nrf_atomic_flag_t   wr_flag;   //!< Protection flag.
    nrf_atomic_flag_t   rd_flag;   //!< Protection flag.
    uint32_t            wr_idx;     //!< Write index (updated when putting).
    uint32_t            tmp_wr_idx; //!< Temporary write index (updated when allocating).
    uint32_t            rd_idx;     //!< Read index (updated when freeing).
    uint32_t            tmp_rd_idx; //!< Temporary read index (updated when getting).
} nrf_ringbuf_cb_t;

/**
 * @brief Ring buffer instance structure.
 * */
typedef struct
{
    uint8_t           * p_buffer;     //!< Pointer to the memory used by the ring buffer.
    uint32_t            bufsize_mask; //!< Buffer size mask (buffer size must be a power of 2).
    nrf_ringbuf_cb_t  * p_cb;         //!< Pointer to the instance control block.
} nrf_ringbuf_t;

2--上面这句话 就是memset


nrf_ringbuf.c

继续看

 

看不懂 WHY 只有一个函数呢

 

自己成功的测试 模型

#include "gsdk_task.h"
#include "gsdk_cmd.h"
#include "gProtocol.h"

#include "freertos.h"
#include "task.h"


NRF_RINGBUF_DEF(m_sendData_ringbuf, NRF_LOG_STR_PUSH_BUFFER_SIZE);
nrf_ringbuf_t const * psendData_ringbuf = &m_sendData_ringbuf;
static TaskHandle_t m_send_thread;                               
static TaskHandle_t m_recv_thread;                             

static void sendDataTask(void *pvParameters) 
{
    int32_t tempLength = 0;
    uint8_t tempData  = 'A';
    uint8_t data[2]  = {0};
    size_t ssize = 1+1; 
    uint8_t * p_dst = data;
    //gfifotx.init();
    nrf_ringbuf_init(&m_sendData_ringbuf);
    ((void)(pvParameters));
    for (; ;) 
    {
        //vTaskSuspend(NULL); // Suspend myself
        vTaskDelay(2000);
        //tempLength = gfifotx.readone(&tempData);
        //if (tempLength > 0) 
        //{
           //tcpWrite(tempData, tempLength);
           //  SHOWME
       // }
     
        if (nrf_ringbuf_alloc(&m_sendData_ringbuf, &p_dst, &ssize, true) == NRF_SUCCESS)
        {
            ret_code_t err;
            
            ++tempData;
            if(tempData == 'z') tempData = 'A';
            
            memcpy(p_dst, &tempData, ssize);

            //Terminate in case string was partial.
            p_dst[ssize - 1] = '\0';

            err = nrf_ringbuf_put(&m_sendData_ringbuf, ssize);
            ASSERT(err == NRF_SUCCESS);
            NRF_LOG_DEBUG("in%d----[%s]",ssize,p_dst);
            //Immediately free the space where string was put.
//            err = nrf_ringbuf_free(&m_sendData_ringbuf, ssize);
//            ASSERT(err == NRF_SUCCESS);
        }
          


    }
}

static void recvDataTask(void *pvParameters) 
{
    //gfiforx.init();
    //gfifopag.init();
     ret_code_t err;
     uint8_t data[10]={0};
     uint8_t * pdata = data;
     size_t len=2;
    ((void)(pvParameters));
    for (; ;) 
    {
        //gProtocolLoop();
        vTaskDelay(1000);
        //ret_code_t nrf_ringbuf_get(nrf_ringbuf_t const * p_ringbuf, uint8_t * * pp_data, size_t * p_length, bool start);

       if(nrf_ringbuf_get(psendData_ringbuf ,&pdata , &len ,1  )== NRF_SUCCESS)
        {
           if(len)
           {               
             NRF_LOG_DEBUG("out%d---[%s]",len,pdata);
             nrf_ringbuf_free(&m_sendData_ringbuf, len);
           }
           else
               NRF_LOG_DEBUG("out null");  
           
           len =2; // 因为 一旦成功 len会被修改 一般是修改为0
        }
        else
            SHOWME          
    }
}




void creatTXtask(void)
{
    BaseType_t xReturned = xTaskCreate(sendDataTask,
                                       "sendDataTask",
                                       128,
                                       NULL,
                                       configMAX_PRIORITIES,
                                       &m_send_thread);
    if (xReturned != pdPASS)
    {
        NRF_LOG_ERROR("sendDataTask not created.");
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }
    
    return ;
}

void creatRXtask(void)
{
    BaseType_t xReturned = xTaskCreate(recvDataTask,
                                       "recvDataTask",
                                       128,
                                       NULL,
                                       configMAX_PRIORITIES,
                                       &m_recv_thread);
    if (xReturned != pdPASS)
    {
        NRF_LOG_ERROR("recvDataTask not created.");
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }
    
    return ;
}

void creatSDKTask(void)
{
    registerCmds();
    creatTXtask();
    creatRXtask();
}

 

 

 

继续研究 nrf的那个cpy的接口是做什么的呢?

我想你知道了 既然做了FIFO那就是做了内存池 

如果你每次 put get 还要自己用内存 memcpy只有的话 那就是带cpy的

也就是前后都浪费内存!!!而我上面测试的 原理是 ** 也就是那内存池在用 不要自己携带内存!!

所以 ** 应该会修改的!!!!

再次测试

#include "gsdk_task.h"
#include "gsdk_cmd.h"
#include "gProtocol.h"

#include "freertos.h"
#include "task.h"


NRF_RINGBUF_DEF(m_sendData_ringbuf, NRF_LOG_STR_PUSH_BUFFER_SIZE);
nrf_ringbuf_t const * psendData_ringbuf = &m_sendData_ringbuf;
static TaskHandle_t m_send_thread;                               
static TaskHandle_t m_recv_thread;                             

static void sendDataTask(void *pvParameters) 
{
    int32_t tempLength = 0;
    uint8_t tempData  = 'A';
    uint8_t data[2]  = {0};
    size_t ssize = 1+1; 
    uint8_t * p_dst = data;
    //gfifotx.init();
    nrf_ringbuf_init(&m_sendData_ringbuf);
    ((void)(pvParameters));
    for (; ;) 
    {
        //vTaskSuspend(NULL); // Suspend myself
        vTaskDelay(2000);
        //tempLength = gfifotx.readone(&tempData);
        //if (tempLength > 0) 
        //{
           //tcpWrite(tempData, tempLength);
           //  SHOWME
       // }
     
        if (nrf_ringbuf_alloc(&m_sendData_ringbuf, &p_dst, &ssize, true) == NRF_SUCCESS)
        {
            ret_code_t err;
            
            ++tempData;
            if(tempData == 'z') tempData = 'A';
            
            memcpy(p_dst, &tempData, ssize);
            p_dst[ssize - 1] = '\0';            //Terminate in case string was partial.

            err = nrf_ringbuf_put(&m_sendData_ringbuf, ssize);
            ASSERT(err == NRF_SUCCESS);
            NRF_LOG_DEBUG("in%d----[%s]--[%d-%d]",ssize,p_dst,data[0],data[1]);
        }
          


    }
}

static void recvDataTask(void *pvParameters) 
{
    //gfiforx.init();
    //gfifopag.init();
     ret_code_t err;

uint8_t data[2]  = {1,2};
uint8_t * p_dst = data;
p_dst[0]=3;
p_dst[1]=4;
NRF_LOG_DEBUG("[%d-%d]--[%d-%d]",data[0],data[1],p_dst[0],p_dst[1]);//3434
     uint8_t * pdata = NULL;
     size_t len=2;
    ((void)(pvParameters));
    for (; ;) 
    {
        //gProtocolLoop();
        vTaskDelay(1000);
        //ret_code_t nrf_ringbuf_get(nrf_ringbuf_t const * p_ringbuf, uint8_t * * pp_data, size_t * p_length, bool start);

       if(nrf_ringbuf_get(psendData_ringbuf ,&pdata , &len ,1  )== NRF_SUCCESS)
        {
           if(len)
           {               
             NRF_LOG_DEBUG("out%d---[%s]--0X%08x",len,pdata,pdata);
             nrf_ringbuf_free(&m_sendData_ringbuf, len);
           }
           else
               NRF_LOG_DEBUG("out null");  
           
           len =2; // 因为 一旦成功 len会被修改 一般是修改为0
        }
        else
            SHOWME          
    }
}




void creatTXtask(void)
{
    BaseType_t xReturned = xTaskCreate(sendDataTask,
                                       "sendDataTask",
                                       128,
                                       NULL,
                                       configMAX_PRIORITIES,
                                       &m_send_thread);
    if (xReturned != pdPASS)
    {
        NRF_LOG_ERROR("sendDataTask not created.");
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }
    
    return ;
}

void creatRXtask(void)
{
    BaseType_t xReturned = xTaskCreate(recvDataTask,
                                       "recvDataTask",
                                       128,
                                       NULL,
                                       configMAX_PRIORITIES,
                                       &m_recv_thread);
    if (xReturned != pdPASS)
    {
        NRF_LOG_ERROR("recvDataTask not created.");
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }
    
    return ;
}

void creatSDKTask(void)
{
    registerCmds();
    creatTXtask();
    creatRXtask();
}

果然 你看到 ** 指针的地址在奔跑!!!!就是内存池 所以 RX里面我不要自己数组了!!!!

那么箭头能解释吗?WHY后面是 0 0 没有被赋值呢?看来也不需要内存!!!继续修改!!!

 

 

果然!!OK

代码如下 

也即是PUT的时候 那个不是二级指针  那个nrf_ringbuf_alloc 参数进去 就是二级指针了 它会修改指针的指向的!!!!以前NULL也可以的!!

出来的时候 指到内存次的一个地方 然后数据放进去即可

#include "gsdk_task.h"
#include "gsdk_cmd.h"
#include "gProtocol.h"

#include "freertos.h"
#include "task.h"


NRF_RINGBUF_DEF(m_sendData_ringbuf, NRF_LOG_STR_PUSH_BUFFER_SIZE);
nrf_ringbuf_t const * psendData_ringbuf = &m_sendData_ringbuf;
static TaskHandle_t m_send_thread;                               
static TaskHandle_t m_recv_thread;                             

static void sendDataTask(void *pvParameters) 
{
    int32_t tempLength = 0;
    uint8_t tempData  = 'A';
    size_t ssize = 1+1; 
    uint8_t * p_dst = NULL;
    //gfifotx.init();
    nrf_ringbuf_init(&m_sendData_ringbuf);
    ((void)(pvParameters));
    for (; ;) 
    {
        //vTaskSuspend(NULL); // Suspend myself
        vTaskDelay(2000);
        //tempLength = gfifotx.readone(&tempData);
        //if (tempLength > 0) 
        //{
           //tcpWrite(tempData, tempLength);
           //  SHOWME
       // }
     
        if (nrf_ringbuf_alloc(&m_sendData_ringbuf, &p_dst, &ssize, true) == NRF_SUCCESS)
        {
            ret_code_t err;
            
            ++tempData;
            if(tempData == 'z') tempData = 'A';
            
            memcpy(p_dst, &tempData, ssize);
            p_dst[ssize - 1] = '\0';            //Terminate in case string was partial.

            err = nrf_ringbuf_put(&m_sendData_ringbuf, ssize);
            ASSERT(err == NRF_SUCCESS);
            NRF_LOG_DEBUG("in%d----[%s]--0X%08x",ssize,p_dst,p_dst);
        }
          


    }
}

static void recvDataTask(void *pvParameters) 
{
    //gfiforx.init();
    //gfifopag.init();
     ret_code_t err;

uint8_t data[2]  = {1,2};
uint8_t * p_dst = data;
p_dst[0]=3;
p_dst[1]=4;
NRF_LOG_DEBUG("[%d-%d]--[%d-%d]",data[0],data[1],p_dst[0],p_dst[1]);//3434
     uint8_t * pdata = NULL;
     size_t len=2;
    ((void)(pvParameters));
    for (; ;) 
    {
        //gProtocolLoop();
        vTaskDelay(1000);
        //ret_code_t nrf_ringbuf_get(nrf_ringbuf_t const * p_ringbuf, uint8_t * * pp_data, size_t * p_length, bool start);

       if(nrf_ringbuf_get(psendData_ringbuf ,&pdata , &len ,1  )== NRF_SUCCESS)
        {
           if(len)
           {               
             NRF_LOG_DEBUG("out%d---[%s]--0X%08x",len,pdata,pdata);
             nrf_ringbuf_free(&m_sendData_ringbuf, len);
           }
           else
               NRF_LOG_DEBUG("out null");  
           
           len =2; // 因为 一旦成功 len会被修改 一般是修改为0
        }
        else
            SHOWME          
    }
}




void creatTXtask(void)
{
    BaseType_t xReturned = xTaskCreate(sendDataTask,
                                       "sendDataTask",
                                       128,
                                       NULL,
                                       configMAX_PRIORITIES,
                                       &m_send_thread);
    if (xReturned != pdPASS)
    {
        NRF_LOG_ERROR("sendDataTask not created.");
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }
    
    return ;
}

void creatRXtask(void)
{
    BaseType_t xReturned = xTaskCreate(recvDataTask,
                                       "recvDataTask",
                                       128,
                                       NULL,
                                       configMAX_PRIORITIES,
                                       &m_recv_thread);
    if (xReturned != pdPASS)
    {
        NRF_LOG_ERROR("recvDataTask not created.");
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }
    
    return ;
}

void creatSDKTask(void)
{
    registerCmds();
    creatTXtask();
    creatRXtask();
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值