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. python中SQL的使用

    # 常用的关系型数据库有 mysql postgresql sqlite 等(具体区别上课再说) # # 传统数据库以表的形式存储数据 # 一张表可以有很多个字段 # 以用户表为例, 存储 4 个数据 ...

  2. TextFlow with JavaFX 2

    http://sahits.ch/blog/?p=2372 ———————————————————————————————————————————————————— TextFlow with Jav ...

  3. sscanf

    #include<stdio.h> 1.sscanf和scanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备 2.sscanf的使用,以解析时间字符串为例,将字符串“2009- ...

  4. libevent在windows下用visual studio编译时出现error C2894错误的原因与解决方法

    libevent是一个使用很广泛的网络库,今天想了解下它.于是去git clone了一份源码,用vs2005的命令行:nmake -f makefile.nmake编译之,顺利编译通过,生成三个静态库 ...

  5. c++ 判断windows系统和进程是32位还是64位

    BOOL Is64BitOS() { typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)( __out LPSYSTEM_INFO lpSystemInfo ...

  6. 1. 写出一个能创建多级目录的 PHP 函数(新浪网技术部)

    function create_dir($path,$mode){ if (is_dir($path)){ echo "该目录已经存在"; }else{ if(mkdir($pat ...

  7. Linux命令之split

    split用来将大文件分割成小文件.有时文件越来越大,传送这些文件时,首先将其分割可能更容易. 使用vi或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题. 因此有时没有选择余地, ...

  8. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  9. Java前端Rsa公钥加密,后端Rsa私钥解密(支持字符和中文)

    Base64工具类,可以让rsa编码的乱码变成一串字符序列 package com.utils; import java.io.ByteArrayInputStream; import java.io ...

  10. 洛谷 P3263 [JLOI2015]有意义的字符串

    洛谷 首先,看到\((\frac{(b+\sqrt{d})}{2})^n\),很快能够想到一元二次方程的解\(\frac{-b\pm\sqrt{\Delta}}{2a}\). 所以可以推出,\(\fr ...