关于单片机程序设计的几点

时间:2021-08-04 19:52:12
需要的一些:
  1. 对于单片机程序,首先要对于要使用的单片机比较了解,对于硬件设计比较了解,对C编程比较熟悉;
  2. 了解单片机是因为当需要设置某些寄存器的时候,会知道相应的设置方式,避免出现因为寄存器设置造成的不必要的调试时间。
  3. 对硬件比较了解,因为硬件电路是程序运行的前提,如果硬件电路出现了问题,软件无论如何也跑不起来;
  4. 对C比较熟悉,因为过了初始化以后主要工作就是由C来承担了;
  5. 对于需要操作模块的了解与设置,知道相应的设置或操作引发的结果。
遗忘的死角:
最近在查看一段代码的时候,发现里边有一个潜在的递归操作,而且没有限制递归的次数。
对于在PC上运行的程序,很多时候是不用担心的,毕竟内存还是够用的。当然对于数据量比较大的时候,还是需要注意。
但是对于在单片机上运行的只有512字节栈空间的uC/OS系统的一个任务而言,如果发生了,很容易造成内存溢出。

确实,有时候使用递归会使问题更容易解决,但是它所带来的资源消耗也是很可观的。由于不知道何时终止,对于内存受限的系统而言,更像是一个定时炸弹。
对于递归的使用,在很多时候还是不建议使用的。
虽然,它是我们C基础教材上经常出现的一种方法,但是它确实在很多时候都不适合使用。


关于Flash初始化及Fatfs初始化:
  1. 如果遇到FR_NOT_ENABLED,则是没有正常挂载需要f_mount,挂载成功Flash;
  2. 如果遇到FR_NO_FILESYSTEM,则需要f_mkfs初始化文件系统,创建Fat文件系统;
  3. 但是如果遇到了f_mkfs成功了,这时调用f_open时,又出现了FR_NO_FILESYSTEM,该如何是好呢?f_mkfs的哪一点漏洞,会造成没有正确的返回?
  4. 关于(3)的疑问,找到了是硬件焊接不牢固的问题。
  5. 虽然(3)的问题解决了,但是在f_open的时候,却依旧返回FR_NO_FILE,即使创建文件,也返回同样的错误,为何?
  6. (5)的问题在代码上定位到ff.c的1029行,发现注释是Initialize the SFN entry失败。 分析发现既然Flash可创建文件系统,即可写入,这一步通不过应该不是硬件的原因,可能是软件上的某个操作,导致了不正常的文件,于是重新初始化了文件系统,发现可以。应该是因为初始化完成后,没有关闭文件,导致再一次操作时,一直失败。这个时候需要先关闭文件,再次打开。当然,重新f_mkfs也是可以的。