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=;
int16_t volt[] = {,,,}; for(i = ; i< LEN_NUM; i++)
{
volt[] = *(int16_t *)src_ptr; // UL1
src_ptr++;
src_ptr++;
volt[] = *(int16_t *)src_ptr; // UL2
src_ptr++;
src_ptr++;
volt[] = *(int16_t *)src_ptr; // UL3
src_ptr++;
src_ptr++;
volt[] = *(int16_t *)src_ptr; // ULN
src_ptr++;
src_ptr++;
*(fftBufVx->nL1_r + i) = (float32_t)(volt[]-volt[]);
*(fftBufVx->nL1_i + i) = ;
*(fftBufVx->nL2_r + i) = (float32_t)(volt[]-volt[]);
*(fftBufVx->nL2_i + i) = ;
*(fftBufVx->nL3_r + i) = (float32_t)(volt[]-volt[]);
*(fftBufVx->nL3_i + i) = ;
}
}

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=;
for(i = ; i< LEN_NUM; i++)
{
*(fftBufVx->nL1_r + i) = (float32_t)(src_ptr[]-src_ptr[]); // UL1
*(fftBufVx->nL1_i + i) = ;
*(fftBufVx->nL2_r + i) = (float32_t)(src_ptr[]-src_ptr[]); // UL2
*(fftBufVx->nL2_i + i) = ;
*(fftBufVx->nL3_r + i) = (float32_t)(src_ptr[]-src_ptr[]); // UL3
*(fftBufVx->nL3_i + i) = ; src_ptr = src_ptr + ;
}
}

3. 版本3

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

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

4. 总结

  在不改变接口的情况下,尽量提高函数的易读性与效率,逐步掌握代码产出效率和质量之间的平衡点。永不止步,下一版更好。

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

  1. 嵌入式C语言优化小技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...

  2. 嵌入式Linux启动优化手记2&nbsp;U…

    参考一下 原文地址:U-boot优化">嵌入式Linux启动优化手记2 U-boot优化作者:ZhaoJunling 既然不能使用新的U-boot,那就优化一点是一点,慢慢干吧. 1. ...

  3. JavaScript的妙与乐(一)之 函数优化

    JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...

  4. poj2409 & 2154 polya计数+欧拉函数优化

    这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...

  5. 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 + ...

  6. 嵌入式LINUX启动时间优化

    1. 实践过程 我是对海思3559进行启动时间优化的.具体的操作可以参考<Hi3559V100/Hi3556V100 快速启动优化指南>.软件上启动时间的优化一般是从三方面进行的:ubbo ...

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

    函数要求实现功能 select 函数名 ('你好,我是追索') 返回的结果(ni hao , wo shi zhui suo) 解决方案一: 解决方案一 /* 根据汉字获取全拼 1.生成所有读音临时表 ...

  8. 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性

    凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...

  9. 【react】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性

    凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...

随机推荐

  1. Asteroids - poj 3041(二分图最大匹配问题)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17258   Accepted: 9386 Description Be ...

  2. Linux 文件管理(C语言库函数三)

    找到当前目录 char *getcwd(char * buf,size_t size) getcwd函数把当前工作目录的绝对路径名复制到buf中,size指示buf的大小 如果buf不够大,不能装下整 ...

  3. 我的第八个java程序--读取word内容

    package World; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.p ...

  4. char * const p和const char *p的区别

    1. 前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表 ...

  5. ViewPager页面切换特效

    ViewPager页面切换特效如下效果 看效果: 效果1: 效果2: 下面就开始讲解如何实现这两个页面翻转效果 1.首先你得会ViewPager控件的使用(废话!现在还有人不会使用吗???!!) 2. ...

  6. 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数

    [BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...

  7. Farm Tour(最小费用最大流模板)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18150   Accepted: 7023 Descri ...

  8. EasyNVR摄像机无插件直播安装使用错误原因解析

    背景需求 EasyNVR(www.easynvr.com)摄像机无插件直播流媒体服务器对于互联网的视频直播还是有着一定的贡献的.为了方便用户的体验使用,我们也在互联网上放置了对应的试用版本,并且也会随 ...

  9. bfs_迷宫求最短路径

    宽度优先搜索按照距离开始状态由近及远的顺序进行搜索,可以很容易用来求解最短路径或者最少操作等问题. 将已经访问过的状态用标记管理起来,便可以很好地做到由近及远的搜索. import java.util ...

  10. eclipse远程debug Java程序

    使用Eclipse JPDA远程调试Java程序 本文将介绍使用Eclipse JPDA,在Eclipse的开发环境下对远程运行的Java程序进行调试操作. 请按以下步骤进行(本人已经在Eclipse ...