微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > EE对话第一期精彩问答汇总!

EE对话第一期精彩问答汇总!

时间:10-02 整理:3721RD 点击:

【EE对话第一期】精彩问答汇总帖



撰文、组稿:cindy(sunbo@elecfans.com)

                                                                                                           

                                                                                                  

Q:网友技术牛人小渣子:关于技术人员创业这个问题宋老师怎么看呢?我在一个公司做工程师也好多年了,一直给别人打工,最近有创业的念头。
A:kinst(宋老师)
:我已经自己做了几年,发表几点看法。要想考虑创业,需要至少3个积累。
1、是资金积累,跳槽穷1年,改行穷三年,这话一点都不假,创业也至少按照3年准备,即使是创业赚钱,但是由于是初期,所以必须边赚钱边投入,做好三年没钱花的准备。
2、技术积累。我们作为技术人员,靠的是吃技术饭,技术水平如果没积累好,那出来靠什么吃饭呢?尤其是创业初期,必须技术很全面过硬,因为初期阶段,技术越全面,机会越多,技术低的话,机会就少。
3、眼光积累。出来除非你有合适的项目,有正常的赚钱渠道了,否则你必须得考虑好了你出来做什么,你能做什么,3年后做什么,10年内做到什么规模,大概起码有个认识。
这几点考虑好了,就可以放开大胆的干,可能刚出来有很多不适应,很多困难,但是都是可以慢慢解决掉的,没有困难,没有风险,就不会有大的成功。


Q:网友kevinvind:现在谷歌有googleglass 售价1500美元,NIKE+ fuelbandSE售价149美元,小米手环售价69元,这个功能不同,售价相差也太大了。对于市场来说,像小米这样的智能手环用什么MCU呢?

A:kinst(宋老师):一个产品的成本,不仅仅在于他的器件上,而是有很多其他运营成本。苹果手机占世界的10%的份额,却抢走了手机市场上的70%的利润,所以苹果是大赢家,人家赢在哪里,理念,时尚,软件等等。


Q:网友一眼万年Mike:ARM7内核的CPU是否还有发展前景呢?用的是ADS编译器,相当不好用,怎么破?
A:kinst(宋老师):
ARM7的内核已经没有前景了,可以放弃了


A:zzq宁静致远(朱兆琪):ARM7的时代已经远去


Q:网友那年我十七:C语言的最大特点不在于量大,还是追求MCU产品的精细划分和极高性能,或者说您有其他看法呢?
A:xymbmcu(刘老师)
:其实C语言的提高是一个长期的过程,基本的语法、结构好掌握,但是如何提高,首先,肯定得多写。当然不是无为的重复。其次是借鉴一些优秀的代码,那么什么样的代码值得借鉴,例如ST的库、FatFs文件系统、uCOS-III这样的代码,绝对堪称经典。

Q:二霸:因为工作的需要,要在单片机上实现开根号的操作。据我所知目前工程师开平方的方法大部分是用牛顿迭代法,有没有更好更快捷的方式呢?

A:zzq宁静致远(朱兆琪):

1.牛顿迭代算法

  1. /* 精度控制 */
  2. #define precision  0.0000001
  3. float InvSqrt1(float x)
  4. {
  5.     float fDa =1;
  6.     float fPre =x;
  7.     if(x == 0){
  8.        return 0;
  9.     }else if(x< 0){
  10.        printf("Error\n");
  11.        return-1.0;
  12.     }
  13.     /* 求平方根过程 */
  14. while(fabs(fPre- fDa) > precision){   /*精度控制*/
  15.        fPre = fDa;
  16.        fDa = (fDa+x / fDa)/(2);      
  17.     }
  18.     /* 返回求平方根之后的数据 */
  19. returnfDa;
  20. }

复制代码



牛顿迭代算法求平方根的过程也是一个递归过程。

2.卡马克快速平方根算法

卡马克来源的说法:在3D图形编程中,经常要求平方根或平方根的倒数,例如:求向量的长度或将向量归一化。C数学函数库中的sqrt具有理想的精度,但对于3D游戏程式来说速度太慢。我们希望能够在保证足够的精度的同时,进一步提高速度。Carmack在QUAKE3(雷神之锤III )中使用的卡马克快速平方根算法,它第一次在公众场合出现的时候,几乎震住了所有的人。据说该算法其实并不是Carmack发明的,它真正的作者是Nvidia的Gary Tarolli。

  1. float InvSqrt2(float x)
  2. {
  3.     float xhalf =0.5f*x;
  4.     /* get bitsfor floating VALUE */
  5. inti = *(int*)&x;      
  6.     /* givesinitial guess y0 */
  7. i= 0x5f375a86 - (i >> 1);
  8.     /* convertbits BACK to float */
  9. x= *(float*)&i;        
  10.     /* Newtonstep, repeating increases accuracy */
  11. x= x*(1.5f - xhalf*x*x);
  12.    
  13. return1 / x;
  14. }

复制代码


据说这个算法多年来没人破解,特别是这行代码:i = 0x5f375a86 -(i>> 1)。

对比下牛顿迭代算法、卡马克快速平方根算法和库函数平方根:

  1. int main(int argc, char *argv[])
  2. {
  3.         float fa= 101;
  4.         structtimeval tv;
  5.         while(scanf("%f",&fa)){
  6.                 /*①,第一次获取时间 */
  7. gettimeofday(&tv,NULL);
  8.                printf("time %u:%u\n", tv.tv_sec, tv.tv_usec);
  9.                
  10. printf("牛顿迭代        %f\n", InvSqrt1(fa));
  11.                
  12. /*②,第二次获取时间 */
  13. gettimeofday(&tv,NULL);
  14.                printf("time %u:%u\n", tv.tv_sec, tv.tv_usec);
  15.                 printf("卡马克快速平方根 %f\n", InvSqrt2(fa));
  16.                
  17.                 /*③,第三次获取时间 */
  18. gettimeofday(&tv,NULL);
  19.                printf("time %u:%u\n", tv.tv_sec, tv.tv_usec);
  20. printf("标准库           %f\n", sqrt(fa));
  21.                
  22. /*④,第四次获取时间*/
  23. gettimeofday(&tv,NULL);
  24.                printf("time %u:%u\n", tv.tv_sec, tv.tv_usec);
  25.         }
  26.         return0;
  27. }

复制代码


②-①得到的时间为牛顿迭代算法使用的时间,③-②得到的时间为卡马克快速平方根使用的时间,④-③得到的时间为标准库使用的时间。我们采用两组数据进行测试:

第一组:输入36。

zzq@ubuntu:~/Cprimer/sqrt$ ./sqrt

36

time 1398343935:571032……①

牛顿迭代        6.000000……42

time 1398343935:571074……②

卡马克快速平方根 6.006858……5

time 1398343935:571079……③

标准库          6.000000……5

time 1398343935:571084……④

从这组数据,时间:卡马克快速平方根 = 标准库 < 牛顿迭代;精确度:牛顿迭代 = 标准库 > 卡马克快速平方根。

第二组:输入123456789.987654321

zzq@ubuntu:~/Cprimer/sqrt$ ./sqrt

123456789.987654321

time 1398344737:769933……①

牛顿迭代        11111.111328……1719

time 1398344737:771652……②

卡马克快速平方根 11122.324219……854

time 1398344737:772506……③

标准库          11111.111196……629

time 1398344737:773135……④

笔者加:

微软科学计算器结果:11111.111104999999998874999999381

从这组数据,时间:标准库 < 卡马克快速平方根 < 牛顿迭代;精确度:标准库 > 牛顿迭代 > 卡马克快速平方根;


Q:网友jackhui:现在产品都要求可靠性,那么对于单片机系统,我们如何测试单片机系统的可靠性
A:kinst(宋老师):
其实产品的可靠性,并非主要在单片机身上,主要在产品本身硬件稳定性和软件的严谨性上。
对于单片机本身的可靠性,没法一下测试出来,还是得在应用中积累


Q:网友哼小曲:工控类MCU的最大特点不在于量大,还是追求MCU产品的精细划分和极高性能,或者说您有其他看法呢?
A:xymbmcu(刘老师)
:是的,行业不同,对MCU的要求不同,在工控这类行业,肯定是对性能要求高,一台设备,上百万,不可能为了节省几毛钱去用性能不好的MCU。相反,例如在消费类行业,肯定是价格由于性能了,当初我做过一个项目,价格要求就是不能超过2元,所以,8位的MCU就是最好的选择了。


Q:网友小麦地:C语言和汇编语言在开发单片机时各有哪些优缺点?
A:kinst(宋老师):
大多情况下,个人写的汇编代码效率高于C语言的代码,占的程序空间低于C语言的代码,每一句代码都是有固定的执行时间,这就是汇编的优势。至于C,那就是无法比较的优势,逻辑性强,可维护性强等等。除非是非常小的程序,对于单片机资源要求高的地方,用到汇编,否则C是毫无疑问的主流


Q:网友A670521546:两位能分享下,你们如何在coding时减少bug呢?

A:zzq宁静致远(朱兆琪):

1.bug是肯定会出现的。

2.写程序前,其实框架已经在脑海,只需要填充代码,就如高楼已经搭好框架,只需填充砖。

3.良好的代码规范。建议查看:http://pan.baidu.com/share/link? ... C%E5%BC%80%E8%AF%BE中的《C语言》,有代码规范。当然,每个人有自己的风格。

kinst(宋老师):

1、逻辑复杂就要先画流程图,从源头减少bug出现的可能性。
2、程序编写规范,不要按照自己的风格做事,最好能够走正规军的路线,和主流工程师一样的风格。
3、调试代码的时候,多考虑可能发生的可能性。
4、测试的时候,严格一些。


Q:网友番茄番茄:你们好,问女生是否适合单片机编程这个行业,工作一段时间后发现很多行业大牛几乎都是男性,对未来的职业规划有些迷茫,希望各位老师可以帮忙解答一下!
A:xymbmcu(刘老师):
至于这个,就看你能否吃下这个苦,我曾看过一个报道,美国船舶公司,有一项技术,只有一个65的老太婆能搞定,所以与性别无关,但是出于女孩爱美的天性,说什么电脑有辐射、对身体不好,等等,就慢慢转行做管理、销售等了。

kinst(宋老师):实话实说,女生从事技术,两个方向,一个是逻辑思维比较好,技术确实也可以做很好,女生一点也不弱于男生。如果逻辑思维一般,这个必须得承认,大多数女生的逻辑思维能力弱于男生,在技术领域,从事外围的比如当老师,或者研究所做测试等,做研发,有女生很牛的,但是数量很少,自己先评估自己的情况。


往期回顾

———————————————————————————————————————————————————————

EE对话第二期:EE对话第二期:FPGA代替一切芯片的可能性有多高?

EE对话第一期:替代8位MCU 谁会是最强杀手锏?

都是一下犀利的人物啊

学习了,积分到手~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top