因为在连接时,全局变量和局部静态变量都是在data区,所以在这里给放一起讨论了。在原文中自己的表述犯了一个错误,是初始化的全局变量或者局部静态变量,是占用生成的可执行文件大小。而未初始化的全局变量和局部静态变量,不占实际文件大小,但是在执行时是分配RAM空间的。这一点,是原来写博文的时候,弄混淆的一点。所以对于RAM而言,局部静态变量和全局变量消耗是一样的。所以,像你在回复中说的,预约了全局变量可能会导致“设计效率低下”。但是对于ROMDATA而言,初始化和未初始化是不一样的,差异很大。
  尽管现在MCU的RAM size大了很多,Flash也多了很多,但由于现在产品功能越来越强,也要求更多的代码,需要跟多的ROM和RAM。内存受限,可能是个永远存在的问题。但是,也会导致初入的programer,对于内存的问题不会那么敏感。当出现问题的时候,感受到内存限制的时候,可能已经code了很多。
  关于禁用全局变量一说,一开始确实感觉很矛盾。有些数据需要以后的函数中用或者在其他的.c中用,如果不用全局怎样进行数据传递。后来看了一些代码,慢慢感觉到用全局变量,与其说是数据的传递,更准确的不如说是怎么将数据保存下来。至于如何将数据传递过去是另一件事情。所以,整个代码中,全局变量存在的意义在于保存数据。如果是这样,我们完全可以使用局部静态变量来保存。然后,通过函数调用将保存的数据,传递给需要的地方(因为函数调用,难免影响效率。对于效率比较高的地方可以用宏定义来实现)。在这个过程中,也感觉到,这样做更好的是,可以减少对于使用变量的关心,减少需要理解的代码(好的函数名是前提),提高程序的可读性,方便以后的修改。
  所以,这里我很赞同“全局变量与局部变量的本质差异,也是生命周期的差异”。既然,静态局部变量和全局变量有相同的生命周期(对于外部来说,可见程度是不一样的),那么我们应该可以大程度的使用静态局部变量,取代全局变量,通过函数或者宏定义来获取。当然,完全的取代,应该不容易做到。
  操作系统的使用在以前的一篇博文里列了自己的看法,操作系统提供一个虚拟的并行,可以让我们将更多的精力focus on我们需要实现的功能上。当然,有些时候为了达到我们需要的效果,对于操作系统的调度算法要有一定了解(虚拟并行毕竟不是真正的并行)。
  现在操作系统越来越稳定,在操作系统上的工作量也会越来越少,而应用程序的复杂度却越来越高,如何应用操作系统,实现我们需要的功能。
  应用程序构建的三种方法(摘自《UNIX网络编程——进程间通信》):
  (1)用一个庞大的程序完成全部工作。程序的各个部分可以实现为函数,函数之间通过参数,返回值和全局变量来交换信息。
  (2)使用多个程序,程序之间使用某种形式的IPC进行通信。(因为彼此间运行地址空间独立,可以理解为多个MCU协同工作)
  (3)使用一个包含多个线程的程序,线程之间使用某种IPC。(因为彼此间运行地址空间共享,可以理解为一个MCU执行多个任务)