p24t 发表于 2008-7-10 20:16:45

刚买了傻孩子的书,第一个范例有两个小疑问,谢谢

傻孩子的书是使用ICCAVR的,我将它移入到GCC里了,运行通过。

#include <avr/io.h>

void Delay_mS(unsigned int Time)
{
    unsigned char n;
    while(Time>0)
    {
      for (n=1;n<187;n++)
      {
            asm("nop");
      }
      Time--;
    }
}

int main (void)
{
    DDRC=0xFF;
    PORTC=0xAA;

    DDRB=0xFF;
    PORTB=0xAA;

    DDRD=0xFF;
    PORTD=0xAA;

    while(1)
    {
      Delay_mS(500);
      PORTC^=0xFF;
      PORTD^=0xFF;
      PORTB^=0xFF;
    }
}

疑问一: unsigned char n;   
n是作为数值运算的,所以,为何不是 unsigned int n ?

疑问二:
原来的代码是: void main (void), 用GCC编译发现有一个警告。改成: int main (void) 就没有了。
这是ICCAVR与GCC的特性不同导致的吗? 什么时候该用int,什么时候void?

aozima 发表于 2008-7-10 20:47:27

对于"疑问一":任何一本讲单片机C语言的书里都会有讲数据类型的,这里的CHAR不等于数据库里的CHAR(字符) 如果有过汇编基础的很好理解的

疑问二:PC上的C程序都是int main(void)并以return 0;结尾
而GCC主要在LINUX上的C编译器,不知所以....我没用过,不知道到底是怎么回事
以下CFREE里新建的一个DOS程序里的例程:
#include <stdio.h>

int main(int argc, char *argv[])
{
        printf("Hello C-Free!\n");
        return 0;
}

Gorgon_Meducer 发表于 2008-7-10 22:42:29

to 【楼主位】 p24t
    对于疑问一:进行单片机编程,往往要考虑单片机的资源是有限的。因为计数器n的最大值不超过
256,而且对于AVR 这种8位单片机来说,操作单个字节是最快的,因此使用unsigned char n,而不是
大家习惯的unsigned int n。如果使用unsigned int n,那么能表达的数值范围就更大了,从0~65535

    对于疑问二:GCC最初是工作在Linux下的,它认为所有的程序都是建立在操作系统的基础之上,
因而,在main结束的时候,必须要返回操作系统“return 0”;而这个返回值是int型的。在AVR单片机
上,通常我们跑的是裸机,也就是没有操作系统,主程序中必须要用一个死循环来防止程序在执行完
main函数后跑飞(这个循环成为超级循环),因此,主程序不可能也不必要返回任何值。这是时候,我
们简单的用一个void来说明。你在移植到gcc的时候,应该根据gcc的要求,进行修改。

    谢谢您的疑问。
页: [1]
查看完整版本: 刚买了傻孩子的书,第一个范例有两个小疑问,谢谢