由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 嵌入式编程问题
相关主题
FIR IIR 能否降低算法复杂度?瓶颈在哪儿?
菜鸟请教什么类型的项目需要linux下面的编程C++多线程和硬件的关系
请问我应该学什么? (转载)你们写过的最长的main函数有多长?
公司高层要软件组接管我们的嵌入式软件震惊:java 的矩阵操作比 c++ 快?
申请成立嵌入式技术版 (转载)请大牛们帮忙看一段并行c++代码的效率问题
问个double和long double的问题functional programming?
请教一个boost::bind的问题在图像算法领域,纯java没戏,用java和c++混合编程很恶心
基于macro的meta programming真难懂看魏老师和好虫论战,总结一句话
相关话题的讨论汇总
话题: asm话题: cpu话题: 代码话题: 优化话题: dsp
进入Programming版参与讨论
1 (共1页)
r******s
发帖数: 925
1
【 以下文字转载自 robotics 讨论区 】
发信人: robotics (机器人技术), 信区: robotics
标 题: 嵌入式编程问题
发信站: BBS 未名空间站 (Sun Jul 20 16:56:13 2008), 转信
通常涉及到real-time部分,一方面要考虑代码的可维护性,
一方面要考虑到系统的哦执行时间,大家觉得怎么取舍?
比方说要读写100个地址,如果用循环,每次循环要多运算好多东西
for (i=0; i <100; i++)
read[i] = *(*****+i);
但是要是用
read[0] = *(******00);
read[1] = *(******01);
会让代码很长不好维护
一般我是用后者的,即使只读10个地址(对系统影响很小)。
各位有没有什么其他的观点?
每一个小地方节约几个CPU周期,整个系统就会提高很大的效率。
或者,硬件升级很快,不用把代码搞得这么冗长?
D*******a
发帖数: 3688
2
循环部分可以用asm写吧

【在 r******s 的大作中提到】
: 【 以下文字转载自 robotics 讨论区 】
: 发信人: robotics (机器人技术), 信区: robotics
: 标 题: 嵌入式编程问题
: 发信站: BBS 未名空间站 (Sun Jul 20 16:56:13 2008), 转信
: 通常涉及到real-time部分,一方面要考虑代码的可维护性,
: 一方面要考虑到系统的哦执行时间,大家觉得怎么取舍?
: 比方说要读写100个地址,如果用循环,每次循环要多运算好多东西
: for (i=0; i <100; i++)
: read[i] = *(*****+i);
: 但是要是用

a****l
发帖数: 8211
3
I don't think the latter one will be faster. Larger code segment might be
slower for execution.
Save a few cycles here and there does NOT necessarily mean your system will
提高很大的效率. You must understand where the bottleneck is.
Real-time system is more about scheduling than making code faster.

【在 r******s 的大作中提到】
: 【 以下文字转载自 robotics 讨论区 】
: 发信人: robotics (机器人技术), 信区: robotics
: 标 题: 嵌入式编程问题
: 发信站: BBS 未名空间站 (Sun Jul 20 16:56:13 2008), 转信
: 通常涉及到real-time部分,一方面要考虑代码的可维护性,
: 一方面要考虑到系统的哦执行时间,大家觉得怎么取舍?
: 比方说要读写100个地址,如果用循环,每次循环要多运算好多东西
: for (i=0; i <100; i++)
: read[i] = *(*****+i);
: 但是要是用

r******s
发帖数: 925
4
schedule当然很重要,我是说应该保持一个什么样的嵌入式编程习惯
每个小地方都注意还是切实去寻找大大提高性能的地方,例如硬件更新或者你说的
schedule
就像生活中:是从小处节俭还是找更多的赚钱路子。

will

【在 a****l 的大作中提到】
: I don't think the latter one will be faster. Larger code segment might be
: slower for execution.
: Save a few cycles here and there does NOT necessarily mean your system will
: 提高很大的效率. You must understand where the bottleneck is.
: Real-time system is more about scheduling than making code faster.

r******s
发帖数: 925
5
可是我的asm不是利索,找时间再翻翻书,找找例子

【在 D*******a 的大作中提到】
: 循环部分可以用asm写吧
O*******d
发帖数: 20343
6
google "loop unrolling"

【在 r******s 的大作中提到】
: 可是我的asm不是利索,找时间再翻翻书,找找例子
h*******e
发帖数: 225
7
最重要的习惯是保持头脑清醒,知道自己应该干什么。
比如不知道循环会不会成为瓶颈,就做展开之类的末端优化,就是不清醒的表现。

【在 r******s 的大作中提到】
: schedule当然很重要,我是说应该保持一个什么样的嵌入式编程习惯
: 每个小地方都注意还是切实去寻找大大提高性能的地方,例如硬件更新或者你说的
: schedule
: 就像生活中:是从小处节俭还是找更多的赚钱路子。
:
: will

e******e
发帖数: 147
8
最好是搞清楚你使用的complier的特性。
ASM的效率是最高的,不过麻烦,可以用C/C++高级语言来做测试,
编一些测试代码,对照来调试,看看翻译的ASM是否高效,选择出适合你这个平台的编
程习惯。
如果使用时间足够长,你可以用C/C++编制出近乎ASM效率的程序。
要提高效率,必须在每一个细节处做改进,最后你才能获得足够的余量实现所谓“不可
能”完成的任务。
real-time system的效率还是非常重要的。。。
l******r
发帖数: 156
9
1. figure out where your memory is located and use DM.
2. figure out how big is your I$ and do loop unrolling.
m********a
发帖数: 1312
10
至少要++i比i++快点。
相关主题
问个double和long double的问题瓶颈在哪儿?
请教一个boost::bind的问题C++多线程和硬件的关系
基于macro的meta programming真难懂你们写过的最长的main函数有多长?
进入Programming版参与讨论
r******s
发帖数: 925
11
;)多谢指教

【在 h*******e 的大作中提到】
: 最重要的习惯是保持头脑清醒,知道自己应该干什么。
: 比如不知道循环会不会成为瓶颈,就做展开之类的末端优化,就是不清醒的表现。

r******s
发帖数: 925
12
以前别人也是这样教我的,不过是我对细节地方钻研的不够透彻

【在 e******e 的大作中提到】
: 最好是搞清楚你使用的complier的特性。
: ASM的效率是最高的,不过麻烦,可以用C/C++高级语言来做测试,
: 编一些测试代码,对照来调试,看看翻译的ASM是否高效,选择出适合你这个平台的编
: 程习惯。
: 如果使用时间足够长,你可以用C/C++编制出近乎ASM效率的程序。
: 要提高效率,必须在每一个细节处做改进,最后你才能获得足够的余量实现所谓“不可
: 能”完成的任务。
: real-time system的效率还是非常重要的。。。

b******a
发帖数: 215
13
compiler的优化有时间好像也会有问题。
我以前用analog的 visual DSP在他自己的DSP上跑大规模的模拟程序,算法的核心就是
矩阵的LU变换。这个东西得C语言的算法已经很成熟了,但是在DSP上如果不做优化的话
,基本上不能用,速度太慢了。但是如果用comipler的优化选项打开,选择优化到最少
的运行时间,编译好的程序跑出来的结果总是不对,一个4x4的矩阵的LU分解都算不对
,不知道为什么。
后来就是自己手工写asm码,loop unrolling加上DSP支持的SIMD,速度差不多提高了20
多倍。

【在 e******e 的大作中提到】
: 最好是搞清楚你使用的complier的特性。
: ASM的效率是最高的,不过麻烦,可以用C/C++高级语言来做测试,
: 编一些测试代码,对照来调试,看看翻译的ASM是否高效,选择出适合你这个平台的编
: 程习惯。
: 如果使用时间足够长,你可以用C/C++编制出近乎ASM效率的程序。
: 要提高效率,必须在每一个细节处做改进,最后你才能获得足够的余量实现所谓“不可
: 能”完成的任务。
: real-time system的效率还是非常重要的。。。

e******e
发帖数: 147
14
不同开发平台的complier特性是不同的,特别是嵌入式系统,每个厂商水平不一,风格
不同,规则也不同。尽管基本的编译原理相同,但是细节处理上却非常不同。
要想开发好一个实时嵌入式系统,必须做到两点:第一,对你所使用的语言了解;第二
,对你所使用的平台的深入理解。
对照着你的高级语言代码,仔细研究编译后的list code,甚至是binary code,是成为
高手不可或缺的重要步骤。
r******s
发帖数: 925
15
牛,不过我还没法看懂list code和binary code

【在 e******e 的大作中提到】
: 不同开发平台的complier特性是不同的,特别是嵌入式系统,每个厂商水平不一,风格
: 不同,规则也不同。尽管基本的编译原理相同,但是细节处理上却非常不同。
: 要想开发好一个实时嵌入式系统,必须做到两点:第一,对你所使用的语言了解;第二
: ,对你所使用的平台的深入理解。
: 对照着你的高级语言代码,仔细研究编译后的list code,甚至是binary code,是成为
: 高手不可或缺的重要步骤。

r******s
发帖数: 925
16
都是高手啊

20

【在 b******a 的大作中提到】
: compiler的优化有时间好像也会有问题。
: 我以前用analog的 visual DSP在他自己的DSP上跑大规模的模拟程序,算法的核心就是
: 矩阵的LU变换。这个东西得C语言的算法已经很成熟了,但是在DSP上如果不做优化的话
: ,基本上不能用,速度太慢了。但是如果用comipler的优化选项打开,选择优化到最少
: 的运行时间,编译好的程序跑出来的结果总是不对,一个4x4的矩阵的LU分解都算不对
: ,不知道为什么。
: 后来就是自己手工写asm码,loop unrolling加上DSP支持的SIMD,速度差不多提高了20
: 多倍。

k****f
发帖数: 3794
17
嵌入式的cpu一般比较简单的,手写汇编还是可以的。
我曾经在intel cpu上手写过汇编,调用mmx,sse指令加速一个算法,
mmd,比直接用c编译出来差不少的

20

【在 b******a 的大作中提到】
: compiler的优化有时间好像也会有问题。
: 我以前用analog的 visual DSP在他自己的DSP上跑大规模的模拟程序,算法的核心就是
: 矩阵的LU变换。这个东西得C语言的算法已经很成熟了,但是在DSP上如果不做优化的话
: ,基本上不能用,速度太慢了。但是如果用comipler的优化选项打开,选择优化到最少
: 的运行时间,编译好的程序跑出来的结果总是不对,一个4x4的矩阵的LU分解都算不对
: ,不知道为什么。
: 后来就是自己手工写asm码,loop unrolling加上DSP支持的SIMD,速度差不多提高了20
: 多倍。

e******e
发帖数: 147
18
最简单的方法:利用debug单步调试,观察cpu每个寄存器,在你程序运行时的变化情况
,看多了,你就有感觉了。
你玩过游戏,改过什么经验,物品,money等等,不是也是要研究binary code吗?一回
事。
对照着你使用的dsp/mcu的asm指令表去研究研究,对于你要关注的部分代码看明白就ok
,不一定要全部研究,也不一定要你自己去写。只是要建立高级语言如c/c++到目标代
码的一种影射。也就是说写出的c语言,脑子里就能反映出cpu寄存器怎么run的,
binary code是怎么分配,整个程序从头到尾怎么跑得。当然这个需要时间和经验的积
累。
r******s
发帖数: 925
19
改游戏是很久以前了,玩仙剑的时候,你写的真好,非常感谢
我现在用的是real-time PC + DSP,写的程序目前感觉还没出现什么大问题
可能是现在实现的功能和算法简单的缘故吧,什么时候也用你的方法试一试

ok

【在 e******e 的大作中提到】
: 最简单的方法:利用debug单步调试,观察cpu每个寄存器,在你程序运行时的变化情况
: ,看多了,你就有感觉了。
: 你玩过游戏,改过什么经验,物品,money等等,不是也是要研究binary code吗?一回
: 事。
: 对照着你使用的dsp/mcu的asm指令表去研究研究,对于你要关注的部分代码看明白就ok
: ,不一定要全部研究,也不一定要你自己去写。只是要建立高级语言如c/c++到目标代
: 码的一种影射。也就是说写出的c语言,脑子里就能反映出cpu寄存器怎么run的,
: binary code是怎么分配,整个程序从头到尾怎么跑得。当然这个需要时间和经验的积
: 累。

r******s
发帖数: 925
20
不错!

【在 k****f 的大作中提到】
: 嵌入式的cpu一般比较简单的,手写汇编还是可以的。
: 我曾经在intel cpu上手写过汇编,调用mmx,sse指令加速一个算法,
: mmd,比直接用c编译出来差不少的
:
: 20

相关主题
震惊:java 的矩阵操作比 c++ 快?在图像算法领域,纯java没戏,用java和c++混合编程很恶心
请大牛们帮忙看一段并行c++代码的效率问题看魏老师和好虫论战,总结一句话
functional programming?大家不要爱屋及乌
进入Programming版参与讨论
p****s
发帖数: 32405
21
听着真是很强。。。。
我不会用汇编, 所以现在写个SDIO的driver, 要提高效率经常用的笨办法,就是
拿示波器去看底下的包是怎么收发的。

【在 e******e 的大作中提到】
: 最简单的方法:利用debug单步调试,观察cpu每个寄存器,在你程序运行时的变化情况
: ,看多了,你就有感觉了。
: 你玩过游戏,改过什么经验,物品,money等等,不是也是要研究binary code吗?一回
: 事。
: 对照着你使用的dsp/mcu的asm指令表去研究研究,对于你要关注的部分代码看明白就ok
: ,不一定要全部研究,也不一定要你自己去写。只是要建立高级语言如c/c++到目标代
: 码的一种影射。也就是说写出的c语言,脑子里就能反映出cpu寄存器怎么run的,
: binary code是怎么分配,整个程序从头到尾怎么跑得。当然这个需要时间和经验的积
: 累。

d*****l
发帖数: 8441
22
有时是不是也要考虑流水线和循环操作中前后数据的相关性啊.
人工去考虑和安排操作和指令来配合pipeline应当比compiler自己去优化更好吧。
b******a
发帖数: 215
23
this needs more time, experience and knowledge of CPU hardware.
As I know, a optimised ASM FIR algorithm can eliminate almost all the stalls.
This is many many times faster than written in C.

【在 d*****l 的大作中提到】
: 有时是不是也要考虑流水线和循环操作中前后数据的相关性啊.
: 人工去考虑和安排操作和指令来配合pipeline应当比compiler自己去优化更好吧。

e******e
发帖数: 147
24
ASM的本质就是数字信号0,1,单个语句或者很小功能实现ASM确实比C好那么一点点,
但是考虑的系统的设计复杂度,可读性,可靠性,可维护性等等,C和ASM 的混合编程
就显得非常有优势。
某些C代码经过complier翻译后,效率会低很多,可以使用嵌入asm代码的方式来进行改
善。
经过优化的C+ASM混合编程方式,完全可以到达任何优化的ASM的效率。对于稍大一些的
系统,比如代码超过1w行,你很难去将这样规模的ASM代码优化的很好。据说的东西,
都不靠铺,得自己做了才知道深浅。
通常的做法使用C语言来做整体框架设计,在某些部分用嵌入ASM的方法处理。
这样程序总体上可以可以享受到高级语言的设计方便的好处,同时又可以保持高效率。
G*******n
发帖数: 2041
25
memcpy会不会快一点

【在 r******s 的大作中提到】
: 不错!
x****u
发帖数: 44466
26
在程序里面到处优化是大忌,找出哪里真正该优化,比怎么优化程序重要100倍。

【在 r******s 的大作中提到】
: 不错!
1 (共1页)
进入Programming版参与讨论
相关主题
看魏老师和好虫论战,总结一句话申请成立嵌入式技术版 (转载)
大家不要爱屋及乌问个double和long double的问题
c++这种语言注定了会越做越小请教一个boost::bind的问题
java在图像分析领域,就是一个扶不起的阿斗基于macro的meta programming真难懂
FIR IIR 能否降低算法复杂度?瓶颈在哪儿?
菜鸟请教什么类型的项目需要linux下面的编程C++多线程和硬件的关系
请问我应该学什么? (转载)你们写过的最长的main函数有多长?
公司高层要软件组接管我们的嵌入式软件震惊:java 的矩阵操作比 c++ 快?
相关话题的讨论汇总
话题: asm话题: cpu话题: 代码话题: 优化话题: dsp