新唐单片机代码评审总结
昨晚上,我们一个同事组织了一个小会议,大家一起讨论了一个项目的单片机代码,这个单片机用的是新唐单片机,期间大家也讨论了一些问题,总结一下,希望对写单片机的同学们有帮助。
我这个同事写的代码非常优秀,具体代码怎么写,就不能秀出来了。
单片机的一些存储空间
data ---> 可寻址片内ram
bdata ---> 可位寻址的片内ram
idata ---> 可寻址片内ram,允许访问全部内部ram
pdata ---> 分页寻址片外ram (MOVX @R0) (256 BYTE/页)
xdata ---> 可寻址片外ram (64k 地址范围FFFFH)
code ---> 程序存储区 (64k 地址范围),对应 MOVC @DPTR
Program Size: data=12.0 xdata=120 code=3349
— —const 的使用
我们一般定义一个全局变量,这个变量会占用RAM的空间大小,如果我们把这个变量定义为const,就可以把这个变量空间从RAM定义到code空间,以此来节省内存空间大小。
我们实测后发现,const变量不仅占用RAM空间,也会增大code的大小,大家在使用的时候可以实测试试。
没有变到code空间的原因大概是ROM没有运行程序的能力
经常听到程序代码可在NOR Flash上运行,而不能在NAND Flash上运行的说法,关于这个说法容易给人造成误解,因为CPU执行代码分为取指、译码、执行三个步骤,所以真正运行代码的还是CPU,对于NOR Flash可以直接运行代码的说法,指的是CPU可以直接通过地址总线从NOR Flash上完成取指的操作。
— —尽量使用全局变量
函数的局部变量对占用栈空间,如果局部变量很多的话,以后出现问题都不好排查,使用全局变量可以使用code空间,确保栈空间足够让程序运行,确保不要在运行的时候出现栈空间不够。
——尽量开启看门狗
对于手机来说,看门狗不是很重要,但是对于单片机来说,看门狗非常重要,看门狗可以保证单片机死机后可以恢复运行。
——声明为char类型,实际上可能是unsigned char
这个是编译器的锅,大家如果发现程序不按自己想法运行,可以留意下这个。