[开发工具] 【STVD+COSMIC】编译超奇怪的问题

[复制链接]
 楼主| stm_zy 发表于 2009-11-25 09:36 | 显示全部楼层 |阅读模式
来段代码先:


  1. u16 tempqq;
  2. //初始化USRT (9600,8,n,1)
  3. void UARTInit(void)
  4. {
  5. u8 dummy = 0;//初始化串口使用的临时变量
  6.     dummy = UART1->SR;
  7.     dummy = UART1->DR;
  8. //使用内部高速时钟HSI 16MHz 波特率9600 UART_DIV = 16000000/9600 = 0683H
  9.     UART1->BRR2 = 0x03;  
  10.     UART1->BRR1 = 0x68;      /*< Set Baud rate = 9600 @16MHz */
  11.     UART1->CR1 = UART1_CR1_RESET_VALUE; /*< Set UART1_CR1 to reset value 0x00  */
  12.     UART1->CR2 = 0x0c;      /*< Set UART1 T/R enable      */
  13.     UART1->CR3 = UART1_CR3_RESET_VALUE; /*< Set UART1_CR3 to reset value 0x00  */
  14.     UART1->CR4 = UART1_CR4_RESET_VALUE; /*< Set UART1_CR4 to reset value 0x00  */
  15.     UART1->CR5 = UART1_CR5_RESET_VALUE; /*< Set UART1_CR5 to reset value 0x00  */
  16.     UART1->GTR = UART1_GTR_RESET_VALUE;
  17.     UART1->PSCR = UART1_PSCR_RESET_VALUE;
  18. }


  19. void main(void)
  20. {
  21. CLKInit();//时钟初始化
  22. GPIOInit();//端口初始化
  23. UARTInit();//UART1初始化
  24. tempqq = 10000;
  25. while(tempqq--);//<--------------注意这里,这时,编译器那个忙啊.....

  26. enableInterrupts();
  27. while (1)
  28. {
  29. }


在main中,
while(tempqq--);//<--------------注意这里,这时,编译器那个忙啊.....
然而,把这个循环放到UART1初始化代码中或UART1初始化代码前面就可以顺利编译.
yewuyi 发表于 2009-11-25 09:55 | 显示全部楼层
测试了一下,没见你说的什么忙!!!

char a=1;
char b=2;
char c=3;
char d @0xfe ;
main()
{
while(1){
                                d=0x55;
                          while(d--){
                                                                        a=0xaa;
                                                                        }
        }
}
精益求精 发表于 2009-11-25 10:39 | 显示全部楼层
编译器我用的感觉很别扭。
可能是还不太熟悉。
一会好用一会不好用。
编译出错后,再就恢复不到以前的状态。
 楼主| stm_zy 发表于 2009-11-25 12:08 | 显示全部楼层

RE: 2楼

To
2# yewuyi

你没有看清我说的内容, 我的代码是在UART初始化之后出现的问题
yewuyi 发表于 2009-11-25 13:03 | 显示全部楼层
编译器怎么个忙法?

编译时间很长?!
 楼主| stm_zy 发表于 2009-11-25 14:31 | 显示全部楼层

Re:5楼

5# yewuyi

就是编译假死。
精益求精 发表于 2009-11-25 15:23 | 显示全部楼层
就是编译假死???
第一次听说。是不是优化 或者 死循环了?
 楼主| stm_zy 发表于 2009-11-27 07:59 | 显示全部楼层

  1. //按上面的例子

  2. //u8定义的tempqq,
  3. while(tempqq--); //也能通过

  4. u16定义的tempqq,
  5. while(tempqq--); //未必能通过
  6. while(--tempqq);//就能通过

有高人给出合理解释吗?
无涯 发表于 2009-12-4 21:14 | 显示全部楼层
俺不是高人,俺觉得 while(tempqq--); 这样的写法让人有点迷糊,究竟是先--再while还是先while再--,可能编译器也糊涂了吧。
如果这样写 while(tempqq) tempqq--; 会不会清晰一点。
xwj 发表于 2009-12-4 21:30 | 显示全部楼层
本帖最后由 xwj 于 2009-12-4 21:31 编辑

LS,C的语法规则就确定了不会产生歧义的,编译器的产生的语句必须是先执行判断,然后再减1

这样的写法再正常不过,编译器根本就不可能糊涂的。
zwll 发表于 2009-12-4 22:10 | 显示全部楼层
LS,C的语法规则就确定了不会产生歧义的,编译器的产生的语句必须是先执行判断,然后再减1

这样的写法再正常不过,编译器根本就不可能糊涂的。
xwj 发表于 2009-12-4 21:30


说的好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部