杂谈

来源:互联网 发布:虫草活骨肽胶囊淘宝网 编辑:程序博客网 时间:2024/06/05 20:30

最近看mini2440,读了一些高手的文章,来写写自己的感受

首先是关于 nand flash, nor flash,ram  sram   cache cpu

           nand flash 只有数据线和地址线是一样的, nor flash是分开的,所以 arm板中可以从nor flash中启动,从nand flash中启动的时候必须要将代码拷到ram中去,然后从ram中启动。分开好操作,速度快嘛。nand flash 价格比nor flash便宜,这个是优点。在将代码拷到ram中去的时候,会有一个将ram的地址重新映射的过程,而程序从 nor flash启动的时候是不需要重新映射的,因为程序就是在nor flash中执行了,这个时候和ram没关系。

          ram 就是内存了,执行速度快。sram是执行速度最快的一种了,所以cache就是用sram来做的。程序在运行的时候,ram中的地址映射到cpu,cpu在执行的的时候,会把当前执行的那段代码数据地址,代码地址拷贝在cache中,这是因为cache的运行速度更快,比内存快多了(三者的速度 cpu>cache>ram)。由于cache的存在,这又会产生一个问题(个人理解),程序优化问题:当程序运行的时候,cpu发出一个地址指令,如果在cache捕捉到这个已经保存的地址的时候,就会在cache中操作已经保存的数据的备份啊之类的。。这个时候如果其它的线程改变了某个变量,cpu是不会知道的,所有c语言中有一个volatile关键字---每次读取都从内存中读数据。比如说,在中断中被改变的量 最好就加上这个关键字,好多例子就不举了。

        c程序编译后 分为 代码段,只读数据段,已初始化读写数据段 未初始化读写数据段, 堆 和栈,这里面好多学问啊。。

       C语言程序在内存中的运行情况 - huanghl97 - huanghl97

          这张图是别人的, 其中 char s[] = ''abcdef"和 char *p2=“123456”这里面有个细节问题,比如说在一个函数

        funa()

     char s[] = "abcdef";

    return s;

 }

           funb()

{

      char*p2 = "123456";

      return p2;

}

如果你在主函数中调用这两个函数打印出字符串的话,p2可以打印出来,s却不能打印出来。这里面需要知道,字符串是在常量区里面的,当以建立一个数组的时候是在栈中开辟了一个区域,存储的是这个字符串常量的一个备份,记住是备份。当函数执行完之后,会返回一个指向这个数组的指针,但是整个数组已经被编译器给释放了。而p2却可以,虽然p2也是在栈中开辟的,但是p2存储的是这个字符串常量的在静态区的指针,调用完该函数之后,p2的值返回被接收,p2被释放掉。

另一个问题是关于指针的问题, char**p;

                                                   char a[3][3];

                                                    p=a;

这个语句在c++中会编译出错,在c中编译会出现警告,正确的应该是 char (*p)[3];  p=a;

  这个括号应该不能丢(我看到百度文库一个ppt中没有写这个括号),丢了之后表示的是一个指针数组,由于括号的优先级高,所以这里面p指向的是一个数组,该数组包含三个元素,p[0]就是a[0]   p[1]就是a[1]。因为a在这个二维数组中表示的包含3个元素的数组的地址。直接写p=a是不行的,p是一个指向字符指针的指针,a是指向数组的指针,关于这部分内容 在c和指针这本书8.2.4中有讲到。



0 0
原创粉丝点击