嵌入式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 ...
随机推荐
- 虚拟化笔记04.OpenFiler.install
4.OpenFiler install OPENFILER 介绍 1.OpenFiler 作用 OpenFiler 基于Linux 内核,主要作用是实现IP-SAN. 在VSPHERE中我们可以将VM ...
- js 把字符串当做方法执行
<SCRIPT LANGUAGE="JavaScript"> function test(str){ alert(str); } eval('test("aa ...
- 基础的 Web Services 平台是 XML + HTTP。
HTTP 协议是最常用的因特网协议. XML 提供了一种可用于不同的平台和编程语言之间的语言. Web services 平台的元素: SOAP (简易对象访问协议) UDDI (通用描述.发现及整合 ...
- python django -2 ORM模型
ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...
- java string 首字母大小写方法
String字符串需要进行首字母大小写改写,查询google,就是将首字母截取,转化大小写 + 首字母后面字符串 //首字母小写 public static String captureName(St ...
- OpenCV学习笔记十五:opencv_features2d模块
一,简介: 该库用于2D特征检测,描述与匹配.
- MySQL索引使用:字段为varchar类型时,条件要使用''包起来
结论: 当MySQL中字段为int类型时,搜索条件where num='111' 与where num=111都可以使用该字段的索引.当MySQL中字段为varchar类型时,搜索条件where nu ...
- 7、easyui 表单
这是最后一个小节了,后面将会使用一个小项目来进一步实用讲解: 在之前的什么相关只是点都以及讲过了或者说涉及到过,如datagrid表格,树形菜单,布局面板panel,页签,拖放功能,只是在表格的属性细 ...
- Scanner类与Random类
1.Scanner类 Scanner类的作用是获得输入,下面代码用于获得用户的键盘输入,实例如下: 常用方法: String next():将输入信息的下一个标记扫描为一个字符串 Int nextIn ...
- CodeIgniter框架——源码分析之Config.php
CI框架的配置信息被存储在$config数组中,我们可以添加自己的配置信息或配置文件到$config中: $this->config->load('filename'); //加载配置文件 ...