首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实时监测空气波

实时监测空气波
EN

Code Review用户
提问于 2017-04-18 05:11:37
回答 1查看 113关注 0票数 2

我有一个程序,监测实时的空气波,并将它们解调成有用的数据.该程序运行良好,随着时间的推移,问题很少。我真正感兴趣的唯一问题是对memcpy的调用是否可以以不同的方式处理。

我尝试过使用valgrind,这段代码似乎没有泄漏内存。

代码语言:javascript
复制
static output_buffer o_buffers[MAX_OUTPUT_BUFF_COUNT]; //MAX_OUTPUT_BUFF_COUNT = 100
static int o_buffer_count = 0;

struct output_buffer
{
    int16_t buf[MAXIMUM_BUF_LENGTH]; //= 262144
    int len;
};

static void rtlsdr_data_callback(unsigned char *buf, uint32_t len, void *ctx)
{
    if (do_exit)
        return;
    rtl_dev *dev_ctx = (rtl_dev *)ctx;

    demod_state *d = &dev_ctx->demod;

    rotate_90(buf, len);

    int16_t buf16[MAXIMUM_BUF_LENGTH];

    //normalize the data
    for (int i = 0; i < (int)len; i++)
        buf16[i] = (int16_t)buf[i] - 127;

    //create a new output buffer
    output_buffer o;
    memcpy(o.buf, buf16, 2 * len);
    o.len = len;

    if (do_exit)
        return;

    //notify the demodulation thread
    pthread_rwlock_wrlock(&d->rw);
    o_buffers[o_buffer_count] = o;
    o_buffer_count++;
    pthread_rwlock_unlock(&d->rw);
}

static void *demod_thread_fn(void *arg)
{
    rtl_dev *ctx = (rtl_dev *)arg;

    demod_state *d = &ctx->demod;

    int fbuf_cnt = 0;
    float fbuf[MAX_DEMOD_BUFFERSIZE];
    int16_t *sp;

    d->lowpassed[0] = 0;

    while (!do_exit)
    {
        if (do_exit)
        {

            return 0;
        }
        if (!o_buffer_count)
        {
            continue;
        }

        //copy the buffers and reset the counter.. TODO: make quicker, watch for leaks
        pthread_rwlock_wrlock(&d->rw);
        int old_buffer_count = o_buffer_count;
        output_buffer *old_buffers = (output_buffer *)malloc(sizeof(output_buffer) * MAX_OUTPUT_BUFF_COUNT);
        memcpy(old_buffers, o_buffers, sizeof(output_buffer) * MAX_OUTPUT_BUFF_COUNT);

        o_buffer_count = 0;
        pthread_rwlock_unlock(&d->rw);

        for (int i = 0; i < old_buffer_count; i++)
        {
            output_buffer o = old_buffers[i];

            memcpy(d->lowpassed, o.buf, 2 * o.len);
            d->lp_len = o.len;
            //do work with the data...
        }
        free(old_buffers);
    }

    return 0;
}

现在实际的程序相当大,所以很难创建一个工作样例。

然而,一些人注意到:

  1. pthread_rwlock_wrlock(&d->rw);正在引用一个pthread_rwlock_t rw;
  2. 一旦缓冲区准备就绪,就会调用rtlsdr_data_callback。该方法需要尽可能快地退出,以防止数据丢失。
  3. demod_thread_fn对性能的影响并不像我们在另一个线程上那样重要,没有对实时电波作出响应,但是块pthread_rwlock_wrlock(&d->rw); to pthread_rwlock_unlock(&d->rw);将因此阻塞rtlsdr_data_callback
  4. “空气波”是简单的弯曲传呼波,传输可能在毫秒内。
EN

回答 1

Code Review用户

发布于 2017-04-18 16:44:29

  • 这个回路看起来很奇怪..。静态void *demod_thread_fn(void *arg) { while (!do_exit) { if (do_exit) {返回0;}}返回0;}在我看来,您可以摆脱if。如果do_exit可以在第一次检查和第二次检查之间进行更改,这很重要,那么您就有了一个竞赛条件--在第二次检查之后,它也可能发生变化。再多的检查都不能给你任何保证。
  • 考虑使用信号量,而不是忙着等待o_buffer_count的改变。
  • 决定这是C还是C++。如果它应该是C++,那么您应该使用newdelete,而不是mallocfree。如果不是,那么您应该选择类型为类型为结构类型的类型,或者实际上是struct output_buffer等。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/161070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档