/*------------------------------------------ IAR AVR C++程序运行顺序(以本程序为例) 1. __low_level_init() System.Init() 2. Timer.Init() Led.Init() Uart.Init() Twi.Init() 3. main() -------------------------------------------*/ extern "C" __root char __low_level_init (void) { /*----------------------------------------------------- 上电或复位后最好再关总中断(防止软件复位) ------------------------------------------------------*/ __disable_interrupt ();//关闭总中断 /*----------------------------------------------------- 上电或复位后最好再关看门狗(防止软件复位) ------------------------------------------------------*/ __watchdog_disable ();//关闭内部看门狗 /*----------------------------------------------------- 上电或复位后最好把所有IO设置为输入方式 ------------------------------------------------------*/ DDRB = 0x00; DDRC = 0x00; DDRD = 0x00; /*----------------------------------------------------- 上电或复位后最好延时等待系统稳定 ------------------------------------------------------*/ __delay_cycles(500000);//等待系统稳定 /*--------------------------------------------- 郁闷地IAR的看门狗函数竟然只有__watchdog_reset() 没有__watchdog_enable()还玩什么??? ----------------------------------------------*/ // __watchdog_enable (WDTO_2S); /*--------------------------------------------- 郁闷地IAR的休眠函数竟然只有__sleep() 没有__set_sleep_mode()还玩什么??? ----------------------------------------------*/ __set_sleep_mode (SLEEP_MODE_IDLE); /*------------------------------------------------- 由于SystemObj声明了__no_init,故构造函数不能自动执行 这是IAR和GCC的一个不同之处,且记!!! --------------------------------------------------*/ System.Init (); /*----------------------------------------------------- __low_level_init()返回0将不初始化所有全局变量即类。 更可恨地是很多函数将不能正确地执行!!! 例: void a(const char *str);//或void a(const char str[]); 若: const str[]="123"; a(str);//正确 若: a("123");//不能识别"123"!!! 所以最好让__low_level_init()返回1,并将原本需要自动执行 构造函数的类前声明为__no_init,并将其构造函数的实体函数 Init()移入到__low_level_init()函数体内部显式调用!!! ------------------------------------------------------*/ return 1;//0-不初始化,1-初始化 }
相关链接:http://www.21icbbs.com/club/bbs/showEssence.asp?id=9556&page=3
|