• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

对51转到ARM的新人的一些建议

我以前一直用的是51,不过一直是C51,对C已经有10多年的经验,汇编用的很少。后来因为项目需要转到了arm.一开始对arm什么都不懂,看了本《arm体系结构与编程》也是云里雾里的。但是也许是因为无知者无畏吧,我直接就在mdk中建立一个工程,添加了自带的启动文件,然后做了个main函数,里面一个死循环没有操作任何硬件,居然跑起来了。然后以此为基础,慢慢的开始控制GPIO和串口通信,当时突然发现,我的项目不就是搞搞这些吗?其他的什么运行模式、什么链接寄存器、什么PC寄存器关我鸟事,我只要能控制外设就行了。至于它是怎么实现的,那是编译器和链接器的事情。

    现在回头想想开发arm还是很简单的,特别是使用mdk的话,会c也就能做一些简单的开发了。不要被那些稀奇古怪的东西给搞糊涂了。边开发边学习,项目做深了,那些东西自然就懂了。我们公司来了新人,我一般就叫他做个简单的东西,比如按键、串口等,做完也就差不多会了。

    罗嗦这么久说几点建议吧:

    1.arm的汇编没必要去精通的,能够大概看懂就行了。我一般在调试的时候才需要看看。如果一个速度要求苛刻到需要你使用汇编的话,我认为可能你更需要的是转变思路,修改算法。比如使用查表代替计算等。我做了5年arm开发,完成了n个项目,至今没写过一句汇编。

    2.工业控制方面因为有实时性和成本要求,我一般不使用操作系统,但我会自己实现一些内存管理,事件管理,邮箱之类的东西。这些需要时间积累,平时写程序注意尽量通用化,然后建立自己的库,以后再用就爽了。以前使用过一些操作系统,发现并没有提高我的开发速度,而且还造成了调试困难的问题,出了bug找都没法找。

    3.对于公司来说,如果项目很大需要用到操作系统、网络、gui、文件系统等,自己做还不如直接买个板子,人家都已经做好了,而且bug很少,自己只要做应用就行了。量大的话还可以定制,算上开发成本,可能更便宜。如果你是个人兴趣,那当我没说。

    4.现在对于外设一般都有现成的库,我建议能不用还是不要用吧。因为想要用好这些库,你必须对外设寄存器比较熟悉才行,这时候你自己写一个就行了,而且简单的一个寄存器赋值,函数库往往需要调用一个函数来实现,太奢侈了。但是对于运算库还是要用的,比如DSP库等,毕竟人家写的肯定效率要高点。

    5.用好中断,这对51和arm是一样的。能用中断的地方绝对不用轮询,中断是单片机的灵魂,你的所有程序都应该围绕中断展开。

    6.学好C语言,注意形成自己的编程风格,起好函数名和变量名,多写注释。不要怕麻烦,这些很重要,我一直认为最好的程序风格是使人不需要看注释就能立刻理解程序的意思也就是:程序即注释。我有时候会写出a=b-2-1之类的东西,不要认为这很傻,其实是因为2和1分别代表了两个东西,你直接写成3就给理解增加了难度,而且这也不会降低效率,编译器会把它翻译成a=b-3的。

    7.对于C语言多罗嗦一句,用好指针,如果说中断是单片机的灵魂,那么指针就是C的灵魂。

    总之一句话,做arm和做51差不多,关键还是各种外设的寄存器操作。

全部回复(20)
正序查看
倒序查看
971631040
LV.3
2
2013-09-29 16:48
mark
0
回复
dulai1985
LV.10
3
2013-09-30 13:59
@971631040
mark
LZ,看到你写的,现在才开始在学STM32~~对于ARM刚入门~~以后多提点~~
0
回复
2013-10-03 15:55

你好,请问如何动态改变CM3中断的时间,比如用IO按键做中断时间的加减。用51只要刷新定时器的高8位和低8位就可以了,但是CM3的定时器好像不好改。或者是我的方法不对。

0
回复
2013-11-05 23:54

说点不同意见吧

2、用操作系统对于arm类的处理器来说尽量用,大幅度的简化程序逻辑,加快开发进度,占用资源微乎其微的。

5、除了中断,arm大多数有dma,这个对于处理速度帮助很大,还有就是arm相比于51的片内硬件多了太多,选择合适的片内外设可以极大的提高效率的。

7、能不用指针尽可能不用指针,风险偏大,差错困难,但是必须要用的时候也别客气。不要用递归或其他不确定执行时间的编程实现,控制风险是嵌入式开发的核心。

用arm开发绝大多数比用51更便利,用牛刀杀鸡肯定更简单。太多的时候开发的时间成本远远比芯片差价大,用资源丰富的芯片提高开发速度是划算的选择。

0
回复
wddzzj
LV.2
6
2014-03-14 16:49
@wangshujun
说点不同意见吧2、用操作系统对于arm类的处理器来说尽量用,大幅度的简化程序逻辑,加快开发进度,占用资源微乎其微的。5、除了中断,arm大多数有dma,这个对于处理速度帮助很大,还有就是arm相比于51的片内硬件多了太多,选择合适的片内外设可以极大的提高效率的。7、能不用指针尽可能不用指针,风险偏大,差错困难,但是必须要用的时候也别客气。不要用递归或其他不确定执行时间的编程实现,控制风险是嵌入式开发的核心。用arm开发绝大多数比用51更便利,用牛刀杀鸡肯定更简单。太多的时候开发的时间成本远远比芯片差价大,用资源丰富的芯片提高开发速度是划算的选择。
受教了
0
回复
2014-04-15 13:54
学好指针,推荐一本书吧,,
0
回复
2014-04-16 08:34
@sherlocked
学好指针,推荐一本书吧,,
指针要会用,但是尽量少用
0
回复
2014-04-16 12:28
@wangshujun
指针要会用,但是尽量少用
这又是怎么回事啊
0
回复
nyfddz
LV.1
10
2014-04-26 05:53
@sherlocked
[图片]这又是怎么回事啊

三人行必有我师

谢谢

0
回复
2014-04-26 10:24
读此文,有所获,感恩!
0
回复
土土豆
LV.1
12
2014-05-04 22:47
学习了,谢谢分享。
0
回复
2015-01-15 09:50
@wangshujun
指针要会用,但是尽量少用
我也想知道这个是为什么
0
回复
苑留记
LV.8
14
2015-01-15 11:42

我顶下吧,唉感觉貌似对我也没用

0
回复
尤小翠
LV.7
15
2015-01-15 12:27

对于常量 如果是有意义的最好给#define一下

比如 0x80 || 0x02 这种经过长时间就忘记是啥了

0
回复
wangshujun
LV.8
16
2015-01-15 17:25
@又一个暑假
我也想知道这个是为什么
指针能带给c程序极大的灵活性和效率,但是非常容易出现严重和隐蔽的错误
0
回复
a2895812
LV.2
17
2015-01-16 10:17
@又一个暑假
我也想知道这个是为什么

结构不复杂的时候指针必要性不大,只有在数据结构或程序结构到一定规模时指针才能体现他的必要性。举个不恰当的例子,比如我在看CM3权威指南,其中有第四章第一节第二小节:通用目的的寄存器R8-R12;可以比喻为一个叫“CM3权威指南”的大的数据(库),有一级指针“章”,二级指针“节”,三级指针“小节”,目的数据“通用目的的寄存器R8-R12”。这样我们是不是可以很方便的用“章”“节”小节“很方便的查找到我们需要的东西?这就是我理解的指针的意义。

     至于很多时候为什么不需要指针这个问题,就像你写个800字的作文,需要什么:”章“”节“吗?给一个变量定义一个指针还不如给他预定义一个别名来的实在。给一个一维数组定义一个指针还不如直接访问这个数组来的方便,反正他们实际操作的时候都是一样的,自己怎么顺手就怎么来。

0
回复
wfc0312
LV.5
18
2015-03-18 08:17
@尤小翠
对于常量如果是有意义的最好给#define一下比如0x80||0x02这种经过长时间就忘记是啥了
好吧, 我当年就这么写的。现在已经完全看不懂自己的代码了。
0
回复
dxsmail
LV.11
19
2015-03-18 08:37
很好的经验。。。有人带入门就比较容易了。。。
0
回复
duhanyu
LV.2
20
2015-03-20 10:17

之间用了一次STM32,学的一知半解,一般都是看使用手册和开别人例程

想系统的了解ARM开发,楼主有好的书推荐么?

0
回复
2016-03-01 11:26
真是对于新人非常宝贵的意见呢~本帖已经由小编整理成技术文章啦~感谢楼主和大家的积极讨论与贡献~
0
回复