打印
[开发工具]

【STVD+COSMIC】编译超奇怪的问题

[复制链接]
3700|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stm_zy|  楼主 | 2009-11-25 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
来段代码先:

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


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

enableInterrupts();
while (1)
{
}


在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初始化之后出现的问题

使用特权

评论回复
5
yewuyi| | 2009-11-25 13:03 | 只看该作者
编译器怎么个忙法?

编译时间很长?!

使用特权

评论回复
6
stm_zy|  楼主 | 2009-11-25 14:31 | 只看该作者

Re:5楼

5# yewuyi

就是编译假死。

使用特权

评论回复
7
精益求精| | 2009-11-25 15:23 | 只看该作者
就是编译假死???
第一次听说。是不是优化 或者 死循环了?

使用特权

评论回复
8
stm_zy|  楼主 | 2009-11-27 07:59 | 只看该作者

//按上面的例子

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

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

有高人给出合理解释吗?

使用特权

评论回复
9
无涯| | 2009-12-4 21:14 | 只看该作者
俺不是高人,俺觉得 while(tempqq--); 这样的写法让人有点迷糊,究竟是先--再while还是先while再--,可能编译器也糊涂了吧。
如果这样写 while(tempqq) tempqq--; 会不会清晰一点。

使用特权

评论回复
10
xwj| | 2009-12-4 21:30 | 只看该作者
本帖最后由 xwj 于 2009-12-4 21:31 编辑

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

这样的写法再正常不过,编译器根本就不可能糊涂的。

使用特权

评论回复
11
zwll| | 2009-12-4 22:10 | 只看该作者
LS,C的语法规则就确定了不会产生歧义的,编译器的产生的语句必须是先执行判断,然后再减1

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


说的好

使用特权

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

本版积分规则

6

主题

60

帖子

0

粉丝