嵌入式C函数优化

0. 引言

  这是一个简单函数的优化,但却体现了代码易读性和效率的综合考虑。

  如果问我如何写出优秀的代码,答曰:再写一版。

1. 版本1

  从环形buffer中取出数据,然后放到一个结构体中。buffer中的数据是按字节存储,但是结构体的每个单元数据是int16.

void GetDataFromMeas(int8_t *rawDataBuf, fftStruct *fftBufVx)
 {
    int8_t *src_ptr = rawDataBuf;  // pointer to raw data buffer.
    uint32_t i=0;
    int16_t volt[4] = {0,0,0,0};

    for(i = 0; i< LEN_NUM; i++)
    {
        volt[0] = *(int16_t *)src_ptr; // UL1
        src_ptr++;
        src_ptr++;
        volt[1] = *(int16_t *)src_ptr; // UL2
        src_ptr++;
        src_ptr++;
        volt[2] = *(int16_t *)src_ptr; // UL3
        src_ptr++;
        src_ptr++;
        volt[3] = *(int16_t *)src_ptr; // ULN
        src_ptr++;
        src_ptr++;
        *(fftBufVx->nL1_r + i) = (float32_t)(volt[0]-volt[3]);
        *(fftBufVx->nL1_i + i) = 0;
        *(fftBufVx->nL2_r + i) = (float32_t)(volt[1]-volt[3]);
        *(fftBufVx->nL2_i + i) = 0;
        *(fftBufVx->nL3_r + i) = (float32_t)(volt[2]-volt[3]);
        *(fftBufVx->nL3_i + i) = 0;
     }
 }

2. 版本2

  上一版怎么看都啰啰嗦嗦,先把数据按照字节取出来,然后拼成16位的再放入到临时数组,最后按照顺序写入到接收结构体数组里。

  既然数据是16位的,那么为什么还要先按照8位取出来在拼接呢,多此一举。

  修改后,代码行数锐减,结构更加清晰。

void GetDataFromMeas(int8_t *rawDataBuf, fftStruct *fftBufVx)
 {
    int16_t *src_ptr = (int16_t *)rawDataBuf;  // pointer to raw data buffer.
    uint32_t i=0;
    for(i = 0; i< LEN_NUM; i++)
    {
        *(fftBufVx->nL1_r + i) = (float32_t)(src_ptr[0]-src_ptr[3]); // UL1
        *(fftBufVx->nL1_i + i) = 0;
        *(fftBufVx->nL2_r + i) = (float32_t)(src_ptr[1]-src_ptr[3]); // UL2
        *(fftBufVx->nL2_i + i) = 0;
        *(fftBufVx->nL3_r + i) = (float32_t)(src_ptr[2]-src_ptr[3]); // UL3
        *(fftBufVx->nL3_i + i) = 0;

        src_ptr = src_ptr + 4;
     }
 }

3. 版本3

  指针加偏移与数组下标其实本质都是一个东西,数据量是如此之大,可以考虑省下计算地址偏移的操作,直接引用数组的下标。

void GetDataFromMeas(int8_t *rawDataBuf, fftStruct *fftBufVx)
 {
    int16_t *src_ptr = (int16_t *)rawDataBuf;  // pointer to raw data buffer.
    uint32_t i=0;
    for(i = 0; i< LEN_NUM; i++)
    {
        fftBufVx->nL1_r[i] = (float32_t)(src_ptr[0]-src_ptr[3]); // UL1
        fftBufVx->nL1_i[i] = 0;
        fftBufVx->nL2_r[i] = (float32_t)(src_ptr[1]-src_ptr[3]); // UL2
        fftBufVx->nL2_i[i] = 0;
        fftBufVx->nL3_r[i] = (float32_t)(src_ptr[2]-src_ptr[3]); // UL3
        fftBufVx->nL3_i[i] = 0;

        src_ptr = src_ptr + 4
     }
 }

4. 总结

  再不改变接口的情况下,尽量提高函数的易读性与效率。永不止步,下一版更好。

时间: 2024-10-06 17:02:57

嵌入式C函数优化的相关文章

Linux 嵌入式启动以及优化

转载:http://www.embeddedlinux.org.cn/html/jishuzixun/201312/19-2717.html 第一步: BootLoader -- U boot 1 在cpu/arm926ejs/start.s中 a) b reset ; //jump to reset b) set cpsr ;svc mode ,disable I,F interrupt c)调用lowlevel_init  (在board\xxxx\lowlevel_init.S中 将调用

poj 2154 Color(polya计数 + 欧拉函数优化)

http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目,旋转后一样的属于同一种,结果模p. n个珠子应该有n种旋转置换,每种置换的循环个数为gcd(i,n).如果直接枚举i,显然不行.但是我们可以缩小枚举的数目.改为枚举每个循环节的长度L,那么相应的循环节数是n/L.所以我们只需求出每个L有多少个i满足gcd(i,n)= n/L,就得到了循环节数为n/L的个数.重点就是求出这样的i的个数. 令cnt = gcd(i,n) =

poj2409 &amp; 2154 polya计数+欧拉函数优化

这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 旋转可以旋转 i=[1,n]次..画图可以看出循环节有gcd(n,i)个 镜像对称的置换画个图也是很容易找的 然后通过polya定理就可以容易的求出等价类的种数了 2409就是这样一个裸题,以下为ac代码 #include <iostream> #include <stdio.h> #

poj 2154 Color 欧拉函数优化的ploya计数

枚举位移肯定超时,对于一个位移i,我们需要的是它的循环个数,也就是gcd(i,n),gcd(i,n)个数肯定不会很多,因为等价于n的约数的个数. 所以我们枚举n的约数,对于一个约数k,也就是循环个数为n/k这样的个数有phi[k]种,证明网上有很多.所以答案就是 phi[k]*(pow(n,n/k)) (k是n的所有约数) 由于约数会很大所以不能打表,只能单个算. 再由于最后要除以n,如果做除法就不能直接取模,所以我们在算每一次pow(n,n/k)的时候,都少乘一个n,这样就相当于除法了. #i

Python3 (函数优化版)简单实现下载某个网站轮播图片

昨日刚刚学习到函数篇,想把函数应用起来,就把前几日写的简单使用函数优化了一下,思路更清晰 import urllib.request import re import os import urllib def getHtml(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} redown = urllib.request.Reques

SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对二元函数优化求解——Jason niu

%SA:T1法利用Matlab编写主函数实现对定义域[-5,5]上的二元函数求最优解-Jason niu [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20; figure mesh(x,y,z) hold on xlabel('x') ylabel('y') zlabel('z') title('SA:利用SA最优化,定义域[-5,5]上的二元函数z = x^2

嵌入式LINUX启动时间优化

目录: 1.实践过程 2.参考链接 2.1:嵌入式Linux-启动时间优化 2.2:嵌入式 Linux 启动时间优化- goodluckwhh 2.3:嵌入式linux启动时间优化-qinus 1. 实践过程 2. 参考帖子 2.1 嵌入式Linux-启动时间优化: 链接:嵌入式Linux-启动时间优化 要点如下: 优化第一步: ?? 修改u-boot,把QSPI的读取速度进行提升 优化第二步: ??? 对内核进行裁剪,把不需要的硬件驱动砍掉 优化第三步: ?? 自定义rootfs,缩小文件系统

遗传算法之函数优化

一.遗传算法简介: 遗传算法是模拟生物在自然环境下的遗传和进化过程的一种自适应的全局优化搜索算法,通过借助遗传学的原理,经过自然选择.遗传.变异等作用机制进而筛选出具有适应性更高的个体(适者生存).遗传算法从20世纪七八十年代的诞生到现在主要集中的适用范围为:NP问题(指存在多项式算法能够解决的非决定性问题).非线性.多峰函数优化和多目标优化问题等等.同时在机器学习.模式识别和神经网络及社会科学中的应用也显得非常出色. 二.遗传算法的实现与目的: 实现 :在计算机上模拟生物的进化过程和基因的操作

汉字转全拼音函数优化方案(SQLServer),值得你看看

函数要求实现功能 select 函数名 ('你好,我是追索') 返回的结果(ni hao , wo shi zhui suo) 解决方案一: 解决方案一 /* 根据汉字获取全拼 1.生成所有读音临时表 2.根据Chinese_PRC_CS_AS_KS_WS 排序获取读音 */ create function dbo.fn_Getquanpin1(@str varchar(100)) returns varchar(8000) as begin declare @re varchar(8000)