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();
}