打印
[复制链接]
678|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NUC, ui, TE, PLL
最近使用NUC505板子,发现在系统时钟初始化中有这样一个函数,却不明白是什么意思,请各位大神指教下
static uint32_t PLL_calculate(uint32_t u32Target)
{
        uint32_t u32M, u32N, u32P;
        uint32_t u32Fpll_clko;
        uint32_t u32Fvco;
        uint32_t u32Register, u32Fin=__HXT/1000;
       
        do
        {
                #if 0 /* Much jitter */
                for(u32M =1 ; u32M<=64; u32M=u32M+1){
                        for(u32N=1 ; u32N<=128; u32N=u32N+1){                               
                                for(u32P =1 ; u32P<=8; u32P=u32P+1){                                                       
                #else /* Less jitter */
                for(u32P =8 ; u32P>=1; u32P=u32P-1){
                        for(u32N=1 ; u32N<=128; u32N=u32N+1){                               
                                for(u32M =1 ; u32M<=64; u32M=u32M+1){
                #endif                               
                                        u32Fvco = u32Fin/u32M*u32N;       
                                        if((u32Fvco<300000))
                                                continue;
                                        if((u32Fvco>1000000))
                                                continue;
                                        if(pllfreq_pdf_check(u32N, u32M, u32Fin)<0)
                                                continue;       
                                        u32Fpll_clko = (u32Fin/u32M)*u32N/u32P;               
                                        if( (u32Fpll_clko==u32Target) ){
                                                u32Register = ((u32P-1)<<13) | ((u32M-1)<<7) | ((u32N-1));
                                                return u32Register;                                       
                                        }
                                }       
                        }
                }
        }while(0);
        return 0;
}
沙发
zhuotuzi| | 2017-3-4 13:37 | 只看该作者
“#if 0/#if 1 ... #endif”的作用,我们知道,C标准不提供C++里的“//”这样的单行风格注释而只提供“/* */”这样的块注释功能,我们通常使用它写代码中说明性的注释文字(注释作用)以及在调试时关闭某段代码对编译器的可见性(屏蔽作用),当然,这里所谓的“注释作用”和“屏蔽作用”是我们从功能上下的主观定义,对预处理器而言,两者并无任何区别。对于前者,因为“注释”中不会再出现“注释”和“需要屏蔽的代码段”,所以不会有嵌套的需求,所以通常不会有问题;而对于后者,当我们在调试程序时需要“屏蔽”某段代码时,该段代码中可能包含着前述的“注释”和/或“已被屏蔽的代码段”,这时就产生了“/* */”嵌套使用的需求,但C标准恰恰不允许我们这么干。当你试图使用嵌套的块注释功能时,会发现预处理器把最外层注释的开始和最内层注释的结尾这两者之间的内容处理成了注释,而其后一直到最外层注释结尾的内容被当作了“有效代码”——这显然会引起若干语法错误而导致编译中止。高手们开动脑筋想到了“#if 0 ... #endif”,它同样由预处理器进行处理,同样可以“屏蔽”一段代码,你想把说明文字写在里面也可以,这些和“/* */”都一样,但不一样的是:第一它允许嵌套(层数上限由预处理器决定)、第二你随时可以把“#if 0”改成“#if 1”来取消对某段代码的“屏蔽”——很卓越的特性,快抛弃笨拙的“/* */”吧!它唯一的缺点就是在编辑器中没有“注释”该有的文本显示样式。

使用特权

评论回复
板凳
zhuotuzi| | 2017-3-4 13:37 | 只看该作者
本帖最后由 zhuotuzi 于 2017-3-4 13:49 编辑

2.


#if
   code
#endif
(1)code中定义的是一些调试版本的代码,此时code完全被编译器忽略。如果想让code生效,只需把#if 0改成#if 1
(2)#if 0还有一个重要的用途就是用来当成注释,如果你想要注释的程序很长,这个时候#if 0是最好的,保证不会犯错误。(但是林锐的书上说千万不要把#if 0 来当作块注释使用) #if 1可以让其间的变量成为局部变量。
(3)这个结构表示你先前写好的code,现在用不上了,又不想删除,就用这个方法,比注释方便。


使用特权

评论回复
地板
zhuotuzi| | 2017-3-4 13:49 | 只看该作者
当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围, 当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。
       在这里顺便对条件编译(#ifdef, #else, #endif, #if等)进行说明。以下分3种情况:
  1. 情况1:
  #ifdef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
  这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
  例:
  #define NUM
  .............
  .............
  .............
  #ifdef NUM
   printf("之前NUM有过定义啦!:) \n");
  #else
   printf("之前NUM没有过定义!:( \n");
  #endif
  }
  如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
  我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
  2:情况2:
  #ifndef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
  这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。
  3:情况3:
  #if 常量
  ...程序段1...
  #else
  ...程序段2...
  #endif
  这里表示,如果常量为真(非0,随便什么数字,只要不是0),
就执行程序段1,否则执行程序段2。
如果有#if需要顶格写

使用特权

评论回复
5
玛尼玛尼哄| | 2017-3-8 20:44 | 只看该作者
没想到可以这样注视掉程序段。

使用特权

评论回复
6
玛尼玛尼哄| | 2017-3-8 20:45 | 只看该作者
不过还是没懂那个操作是干啥用。

使用特权

评论回复
7
玛尼玛尼哄| | 2017-3-8 20:49 | 只看该作者
楼主这个函数是在哪个文件里看到的?

使用特权

评论回复
8
玛尼玛尼哄| | 2017-3-8 20:58 | 只看该作者

仔细看,每一次的循环元素都是进行了测试的,你贴的代码看着不方便,在Notepad里看,很容易看出来、

使用特权

评论回复
9
玛尼玛尼哄| | 2017-3-8 20:59 | 只看该作者
continue;这样的关键词看到了吧,现在懂这一堆条件循环是干啥了吧,就是匹配目标呢。

使用特权

评论回复
10
mintspring| | 2017-3-9 00:01 | 只看该作者
学习了,原来可以这样写代码。

使用特权

评论回复
11
dongnanxibei| | 2017-3-11 23:07 | 只看该作者
内部的实现函数,通常不用深究的,能用就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

0

粉丝