|
我是老温,一名热爱学习的嵌入式工程师9 R! E3 X" g5 b( b1 ?: ~ _
关注我,一起变得更加优秀!
0 ^; S0 P* ?: C5 F3 ?3 e#1, ?4 \: C! ?: O7 I+ c; P
节约成本6 J% d. G5 x% m; G4 I0 K/ S' V0 U1 p- K
4 X& q, d6 o- A; c
现象一, M& M1 j- |8 N" f1 t, T2 X
程序只要稳定就可以了,代码长一点,效率低一点不是关键5 m, a/ K1 q4 j2 y8 w$ i( t, A5 _6 R
2 z+ f5 x# K6 j5 r; H& @' G
点评:CPU的速度和存储器的空间都是用钱买来的,如果写代码时多花几天时间提高一下程序效率,那么从降低CPU主频和减少存储器容量所节约的成本绝对是划算的。CPLD/FPGA设计也类似。
. d# d0 G/ ?/ s1 N+ R% c3 N现象二
5 X4 P7 }( k y6 p7 E面板上的指示灯选什么颜色呢?我觉得蓝色比较特别,就选它吧
1 m: U* {( o5 I' I9 U( Y# B/ U* y0 Z+ @% H; X4 ^4 v* g( j# F+ d
点评:其它红绿黄橙等颜色的不管大小(5mm以下)封装如何,都已成熟了几十年,价格一般都在5毛钱以下,而蓝色却是近三四年才发明的东西,技术成熟度和供货稳定度都较差,价格却要贵四五倍。目前蓝色指示灯只用在不能用其它颜色替代的场合,如显示视频信号等。) B8 ?: O# i7 h1 s) @4 P$ j) ^
现象三) J: v/ j5 f" A6 @$ s
这点逻辑用74XX的门电路搭也行,但太土,还是用CPLD吧,显得高档多了7 d' T5 ?" ?+ G( Y# O
6 N: B; ]: v0 S' F" w: g# E, T
点评:74XX的门电路只几毛钱,而CPLD至少也得几十块,(GAL/PAL虽然只几块钱,但公司不推荐使用)。成本提高了N倍不说,还给生产、文档等工作增添数倍的工作。7 x( W; w7 I+ G- z' e
现象四
- `% K0 p* M5 i- z2 j3 |; T我们的系统要求这么高,包括MEM、CPU、FPGA等所有的芯片都要选最快的5 W/ w7 B0 f' p* N; L
' z1 A! g) v; q- h! h; U点评:在一个高速系统中并不是每一部分都工作在高速状态,而器件速度每提高一个等级,价格差不多要翻倍,另外还给信号完整性问题带来极大的负面影响。
1 W s& C2 E0 c1 T3 v现象五& M- E# ^. ~6 M H+ j, z
这板子的pcb设计要求不高,就用细一点的线,自动布吧
: k( G* C9 }7 _) G7 J
% I# x f7 X |/ L4 j: V: C' q5 w点评:自动布线必然要占用更大的PCB面积,同时产生比手动布线多好多倍的过孔,在批量很大的产品中,PCB厂家降价所考虑的因素除了商务因素外,就是线宽和过孔数量,它们分别影响到PCB的成品率和钻头的消耗数量,节约了供应商的成本,也就给降价找到了理由。+ F5 K+ D( K$ G1 p9 W6 `
#2
: |5 F* f# v2 V$ X/ h: j' H9 v% s低功耗设计* v9 @1 c4 e6 e1 _( z
现象一( N# C2 R" C& U: d+ g6 p' K
我们这系统是220V供电,就不用在乎功耗问题了' W% J6 ^( C5 u J- B
. n. G7 H: c% K/ j l" F
点评:低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本。由于电流的减小也减少了电磁辐射和热噪声的干扰。随着设备温度的降低,器件寿命则相应延长(半导体器件的工作温度每提高10度,寿命则缩短一半)。+ k1 N- J) c+ R" u N
现象二) {- D. W/ m2 w5 V# G
这些总线信号都用电阻拉一下,感觉放心些5 F0 E0 H: S. S; J) V7 j5 u9 l
8 X1 ]* U$ _$ l点评:信号需要上下拉的原因很多,但也不是个个都要拉。上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下,但拉一个被驱动了的信号,其电流将达毫安级,现在的系统常常是地址数据各32位,可能还有244/245隔离后的总线及其它信号,都上拉的话,几瓦的功耗就耗在这些电阻上了(不要用8毛钱一度电的观念来对待这几瓦的功耗)关注公众号:芯片电子之家。
( ~0 D' X( {- { B. b, V/ O现象三
7 v- Q6 h0 k8 q! I l这款FPGA还剩这么多门用不完,可尽情发挥吧( P) W3 e, ]9 f* U
9 v$ v+ O' x# ~6 M' ]6 L点评:FGPA的功耗与被使用的触发器数量及其翻转次数成正比,所以同一型号的FPGA在不同电路不同时刻的功耗可能相差100倍。尽量减少高速翻转的触发器数量是降低FPGA功耗的根本方法。, j- {8 u: K$ g! u% \
现象四
8 F' P4 T% p Y* @8 ` Y) g这些小芯片的功耗都很低,不用考虑
9 u% V% V# {2 U2 a5 {- \5 [$ s$ Q8 ]3 E" X8 I
点评:对于内部不太复杂的芯片功耗是很难确定的,它主要由引脚上的电流确定,一个ABT16244,没有负载的话耗电大概不到1毫安,但它的指标是每个脚可驱动60毫安的负载(如匹配几十欧姆的电阻),即满负荷的功耗最大可达60*16=960mA,当然只是电源电流这么大,热量都落到负载身上了。
! O! `( k/ q4 \7 r; G) y3 z5 p$ j+ ]现象五* N+ ~1 H4 Y7 W* g8 \
$ J5 \2 d% K4 ~& K( K# }降低功耗都是硬件人员的事,与软件没关系) q# ~- `: N" m; Y& A+ G3 c0 d
. z* W" a$ T. r0 \- H! m
点评:硬件只是搭个舞台,唱戏的却是软件,总线上几乎每一个芯片的访问、每一个信号的翻转差不多都由软件控制的,如果软件能减少外存的访问次数(多使用寄存器变量、多使用内部CACHE等)、及时响应中断(中断往往是低电平有效并带有上拉电阻)及其它针对具体单板的特定措施都将对降低功耗作出很大的献。/ G1 B5 y$ M9 e
#3
) h& V$ ]0 ?$ f$ w' e# c系统效率
) C$ m F" d1 s现象一6 o) n& j/ C0 y* ~- ^
这主频100M的CPU只能处理70%,换200M主频的就没事了
* h x# l0 Z. K u
* C" {! Z# ]0 X3 @2 m点评:系统的处理能力牵涉到多种多样的因素,在通信业务中其瓶颈一般都在存储器上,CPU再快,外部访问快不起来也是徒劳。6 |0 `4 k9 e6 P' c
现象二# }$ O9 Z# d( `2 L
CPU用大一点的CACHE,就应该快了0 F1 T6 U/ }; n, e1 l$ |3 g2 r
3 v9 }. D6 Y& Z7 o
点评:CACHE的增大,并不一定就导致系统性能的提高,在某些情况下关闭CACHE反而比使用CACHE还快。原因是搬到CACHE中的数据必须得到多次重复使用才会提高系统效率。所以在通信系统中一般只打开指令CACHE,数据CACHE即使打开也只局限在部分存储空间,如堆栈部分。同时也要求程序设计要兼顾CACHE的容量及块大小,这涉及到关键代码循环体的长度及跳转范围,如果一个循环刚好比CACHE大那么一点点,又在反复循环的话,那就惨了。
# A# ?3 e8 ^1 g2 s. L- @3 b
6 p! h4 a. B2 G% b T' H现象三; v* H5 c8 a6 A$ P
这么多任务到底是用中断还是用查询呢?还是中断快些吧
: E5 f F: m$ _9 `7 i5 W1 C& a3 u* D6 q9 V, N: @' m3 W6 C! W, C4 m
点评:中断的实时性强,但不一定快。如果中断任务特别多的话,这个没退出来,后面又接踵而至,一会儿系统就将崩溃了。如果任务数量多但很频繁的话,CPU的很大精力都用在进出中断的开销上,系统效率极为低下,如果改用查询方式反而可极大提高效率,但查询有时不能满足实时性要求,所以最好的办法是在中断中查询,即进一次中断就把积累的所有任务都处理完再退出。
: ]% s3 w% _% Q+ G0 L现象四
! g+ a/ j: K' e4 v- z7 Y存储器接口的时序都是厂家默认的配置,不用修改的
' T% {4 S0 G# }7 y M& O: \2 x) y& S5 K" v# a9 E. y5 s& ~
点评:BSP对存储器接口设置的默认值都是按最保守的参数设置的,在实际应用中应结合总线工作频率和等待周期等参数进行合理调配。有时把频率降低反而可提高效率,如RAM的存取周期是70ns,总线频率为40M时,设3个周期的存取时间,即75ns即可;若总线频率为50M时,必须设为4个周期,实际存取时间却放慢到了 80ns。
3 u- M7 |$ t; I5 F现象五
6 ?0 ~, p' H0 F7 V, N/ A, R( c0 J: a) B3 j% L, m
一个CPU处理不过来,就用两个分布处理,处理能力可提高一倍5 \8 ]; \; c W! [2 e
2 @1 N& Z% f0 Z6 N7 n3 z
点评:对于搬砖头来说,两个人应该比一个人的效率高一倍;对于作画来说,多一个人只能帮倒忙。使用几个CPU需对业务有较多的了解后才能确定,尽量减少两个CPU间协调的代价,使1+1尽可能接近2,千万别小于1。9 \' `" E2 D$ n/ D4 W
#4
* A8 e% V! L/ \7 t+ \信号完整性
7 u& F8 A2 \# Y( Y; ?) J( ~& V现象一
# G4 @! s1 } D2 G- C这些信号都经过仿真了,绝对没问题! A) f* K U' @/ X% |
5 I% e$ q2 W9 `! W3 N6 N
点 评:仿真模型不可能与实物一模一样,连不同批次加工的实物都有差别,就更别说模型了。再说实际情况千差万别,仿真也不可能穷举所有可能,尤其是串扰。曾经 有一教训是某单板只有特定长度的包极易丢包,最后的原因是长度域的值是0xFF,当这个数据出现在总线上时,干扰了相邻的WE信号,导致写不进RAM。其 它数据也会对WE产生干扰,但干扰在可接受的范围内,可是当8位总线同时由0变1时,附近的信号就招架不住了。结论是仿真结果仅供参考,还应留有足够的余 量。
, _" T4 ?2 W* z2 e9 h$ \8 v/ E现象二
4 y; S5 i) h# [* p# h3 Y: p5 f100M的数据总线应该算高频信号,至于这个时钟信号频率才8K,问题不大
6 B) |) L; j' s. X* T2 v' q6 z b
点评:数据总线的值一般是由控制信号或时钟信号的某个边沿来采样的,只要对这个边沿保持足够的建立时间和保持时间即可,此范围之外有干扰也罢过冲也罢都不会有多大影响(当然过冲最好不要超过芯片 所能承受的最大电压值),但时钟信号不管频率多低(其实频谱范围是很宽的),它的边沿才是关键的,必须保证其单调性,并且跳变时间需在一定范围内。# F2 p0 V6 i- r% K2 P$ w
现象三! d' o9 X; n) n7 c
既然是数字信号,边沿当然是越陡越好
R% B* C$ i+ Y9 D/ t" X$ Z4 Y% Y" E
点评:边沿越陡,其频谱范围就越宽,高频部分的能量就越大;频率越高的信号就越容易辐射(如微波电台可做成手机,而长波电台很多国家都做不出来),也就越容易干扰别的信号,而自身在导线上的传输质量却变得越差,因此能用低速芯片的尽量使用低速芯片。
7 l; }+ G6 O O, v, \现象四' V; u* v+ j& L+ [
为保证干净的电源,去偶电容是多多益善: R9 o" F: y% x- p% {0 n$ K5 q
% k% y* b: i" f6 X点评:总的来说去偶电容越多电源当然会更平稳,但太多了也有不利因素:浪费成本、布线困难、上电冲击电流太大等。去偶电容的设计关键是要选对容量并且放对地方,一般的芯片手册都有对去偶电容的设计参考,最好按手册去做。
* T- x. z3 W5 v/ D3 C8 G5 j. G4 o$ R现象五
- z6 B4 e, Q/ T3 P# ?5 J0 _
, l4 Y# g" X% A' p- v信号匹配真麻烦,如何才能匹配好呢' P0 Y3 U2 p$ |! K1 M/ Y
. x4 {! j3 O, x9 o3 ? ?! @
点评:总的原则是当信号在导线上的传输时间超过其跳变时间时,信号的反射问题才显得重要。信号产生反射的原因是线路阻抗的不均匀造成的,匹配的目的就是为了 使驱动端、负载端及传输线的阻抗变得接近,但能否匹配得好,与信号线在PCB上的拓扑结构也有很大关系,传输线上的一条分支、一个过孔、一个拐角、一个接 插件、不同位置与地线距离的改变等都将使阻抗产生变化,而且这些因素将使反射波形变得异常复杂,很难匹配,因此高速信号仅使用点到点的方式,尽可能地减少 过孔、拐角等问题。
* s ?. h1 N6 v7 U* K5 f#5
: E: w5 _4 ^, W# b$ J# L可靠性设计* R# u+ n0 A; f2 C" {6 G, q
现象一
/ y& k& X8 \3 s5 V9 C2 {; Z这块单板已小批量生产了,经过长时间测试没发现任何问题2 w" b* T' m8 ?9 x
) E; W1 v7 g' g, X* i
点评:硬件设计和芯片应 用必须符合相关规范,尤其是芯片手册中提到的所有参数(耐压、I/O电平范围、电流、时序、温度PCB布线、电源质量等),不能光靠试验来验证。公司有不 少产品都有过惨痛的教训,产品卖了一两年,IC厂家换了个生产线,咱们的板子就不转了,原因就是人家的芯片参数发生了点变化,但并没有超出手册的范围。如 果你以手册为准,那他怎么变化都不怕,如果参数变得超出手册范围了还可找他索赔(假如这时你的板子还能转,那你的可靠性就更牛了)。
- h# \2 P( b. J/ ?( L( B' I现象二6 W9 J2 j( i- j' N: m
这部分电路只要要求软件这样设计就不会有问题# F" l( Q: m" `" s0 m& Q$ M7 k
1 b( X, S4 E, J点评:硬件上很多电气特性直接受软件控制,但软件是经常发生意外的,程序跑飞了之后无法预料会有什么操作。设计者应确保不论软件做什么样的操作硬件都不应在短时间内发生永久性损坏。
* k8 P% Z" F4 a3 S- Z- P" [& p$ V
2 ^0 p0 J: \. ~2 x, d" }现象三
& R; r1 y! K# T* b8 U9 M" ~: T用户操作错误发生问题就不能怪我了. x# p9 M$ k" q8 J% p3 W) u
+ c" k, ~: u6 K点评:要求用户严格按手册操作是没错的,但用户是人,就有犯错的时候,不能说碰错一个键就死机,插错一个插头就烧板子。所以对用户可能犯的各种错误必须加以保护。
9 E: Z+ x/ }1 v; G' P) j) G/ C: f" o8 t! z3 t
现象四
. {2 f# Y2 U: R& X0 B, t) C8 T+ A! S板子坏的原因是对端的板子出问题了,也不是我的责任
! O; r' j0 m! N* B6 f6 l
3 B0 m J/ _/ c |% `点评:对于各种对外的硬件接口应有足够的兼容性,不能因为对方信号不正常,你就歇着了。它不正常只应影响到与其有关的那部分功能,而其它功能应能正常工作,不应彻底罢工,甚至永久损坏,而且一旦接口恢复,你也应立即恢复正常。
+ T, R3 Z, e9 P8 h--- 来自牛逼工程师网友的分享
' H5 ?% u9 S7 c3 W1 f6 J! {
, N! O; K% q+ n; G, J% T$ w/ W
c331wf0qx3v64045623806.png
% j/ v' _' U3 d; u9 N) m
! s1 q& o2 p9 v% R8 S+ @
-END-5 D) A) d: |9 P2 ?- e- ~
往期推荐:点击图片即可跳转阅读
8 V- s) u. J+ y
3 o# s; l( \" i3 u- D, F3 i
5 S* u' G4 L4 ~4 E8 x8 k
) S) s" n2 M; C 3 L. D/ ~4 ^9 N4 o9 z) Y
8 q% r; s5 A" _
wnxh41dnnta64045623906.jpg
4 ^$ W8 h4 R9 d4 P9 _ 5 o# D9 U2 q" T, M
2025年,抽屉里的嵌入式开发板,早就已经写满了岁月的痕迹!4 S, P, r; S3 ^7 O, {
1 t9 `0 F9 x y( K6 I
7 N* a$ U7 f L: a# s
, ]& n$ A7 |* \/ W
; r7 O2 I6 F) t0 x* o. ? : q7 n! @$ D* s5 g: ^7 W$ }$ x
- X, Y) }% A8 t7 o- M: l, z
& _9 y, W- a* L2 t; Z1 r1 b* a
! b$ _! U& p% i/ s # y! e& |; S X# f8 x- G# J
) K) | z( b/ P8 Z% U' d
2ind43jnlv164045624006.jpg
& ~0 ]" } u0 A+ \; p- V4 c
' ~' d1 c I* h; y1 _4 q 当嵌入式软件出现bug的时候,可以按照这种思路进行排查!1 M3 j& H q' w7 _$ T) J- u
9 P: T7 w- w) I$ u# _
# T5 d/ H. B8 Z! G$ L , G Q% C+ C! [+ n/ [
{3 ^- W% v& j0 e0 d/ @
& I9 f) \7 w' E# u' p1 z) m2 X
3 @2 m, O6 ^: O
' o5 Z ^2 Q7 u+ E
, q! r* h& h! _0 ]" V( V8 j
2 s- E, c4 ~- G& y
kea2bbqbv5q64045624106.jpg
* r) e+ t" U# i3 x& k
( Y7 r1 Z: n& S! r, j 嵌入式软件,如果想变量不被初始化,通常有哪些方法?
: E% U8 a1 }, `( W% p9 z 7 o: }9 X& L0 Z0 B `2 f4 H
@! w* z O0 ]! `" l
7 J1 o( C( M/ y0 D Q
+ o% p7 v3 A Q$ E
H, a/ M% O! }# M# l2 p我是老温,一名热爱学习的嵌入式工程师* h- I! k. L/ Q* ]% S
关注我,一起变得更加优秀! |
|