嵌入式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=;
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函数优化的更多相关文章
- 嵌入式C语言优化小技巧
嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...
- 嵌入式Linux启动优化手记2 U…
参考一下 原文地址:U-boot优化">嵌入式Linux启动优化手记2 U-boot优化作者:ZhaoJunling 既然不能使用新的U-boot,那就优化一点是一点,慢慢干吧. 1. ...
- JavaScript的妙与乐(一)之 函数优化
JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...
- poj2409 & 2154 polya计数+欧拉函数优化
这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...
- 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 + ...
- 嵌入式LINUX启动时间优化
1. 实践过程 我是对海思3559进行启动时间优化的.具体的操作可以参考<Hi3559V100/Hi3556V100 快速启动优化指南>.软件上启动时间的优化一般是从三方面进行的:ubbo ...
- 汉字转全拼音函数优化方案(SQLServer),值得你看看
函数要求实现功能 select 函数名 ('你好,我是追索') 返回的结果(ni hao , wo shi zhui suo) 解决方案一: 解决方案一 /* 根据汉字获取全拼 1.生成所有读音临时表 ...
- 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...
- 【react】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...
随机推荐
- 简单介绍一下vue2.0
Vue Vue是用于构建用户界面的渐进框架.作者尤雨熙特别强调它与其他的框架不同,Vue是渐进式的框架,可以逐步采用,不必一下就通过框架去重构项目. 另外Vue的核心库只专注于视图层,这样就更容易与其 ...
- Spectral Graph Theory的一些定理
邻接矩阵的特征值和特征向量不会随着节点的排列不同而变化.两个图同构可以推出他们的邻接矩阵具有相同的特征值和特征向量,但是反过来不行.
- AndroidHttpClient和HttpEntity详解
AndroidHttpClient结构: public final class AndroidHttpClient extends Object implements HttpClient 前言:这类 ...
- ChemDraw破解版真的不大好用
一直以来都有很多的用户朋友在网上找ChemDraw破解版使用,但是现在厂商清理的厉害,还有国家对知识产权的保护越来越严格,破解版ChemDraw越来越难找了.大家与其花那么多的时候找破解版的,不如买个 ...
- hdu 4705(树形DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...
- lumen model orm
我尽量遍历写一遍Illuminate\Database\Query\Builder类的大部分方法 select设置查询字段 Notice::select('title')->get(); Not ...
- 【BZOJ4817】[Sdoi2017]树点涂色 LCT+线段树
[BZOJ4817][Sdoi2017]树点涂色 Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路 ...
- 从ELK到EFK
https://my.oschina.net/itshare/blog/775466 http://blog.51cto.com/467754239/1700828 日志系统 日志就是程序产生的,遵循 ...
- ID生成策略
在电商项目中,图片名.商品ID都要唯一且方便存储,于是记录下这两个ID生成策略的方法,以便日后项目再有需要.具体代码如下 import java.util.Random; /** * 图片名生成 */ ...
- spring多数据源事务配置
项目中遇到多数据源问题, 对于每个数据源需要单独完成事务控制, 这里记录下具体实现方法 在spring配置文件中 定义两个数据源 <!-- 数据源定义(spring-jndi) --> ...