打印

__low_level_init函数的执行

[复制链接]
4350|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
herowa|  楼主 | 2009-3-29 00:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟用IAR5.2的开发环境调试一个程序,发现系统默认的启动时间太长,导致外部看门狗溢出复位,仿真器调试发现,花了很长的时间是在执行默认的__low_level_init函数,请教各位这个函数在哪里实现的,因为我根本找不到代码,另外,如果我不想执行这个函数,该如何操作,对系统运行会不会有什么影响?

相关帖子

沙发
hotpower| | 2009-3-29 00:48 | 只看该作者

__low_level_init()

/*------------------------------------------
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

使用特权

评论回复
板凳
herowa|  楼主 | 2009-3-29 01:27 | 只看该作者

谢谢二楼的大侠

但是至少我要知道__low_level_init()在哪个文件里面,我的程序里没有写这个函数啊,另外,最耗时间是__low_level_init()接下来的__iar_data_init2这个函数,可恨的是同样找不到出处。
急啊!

使用特权

评论回复
地板
Swd21ic| | 2009-3-29 10:15 | 只看该作者

__iar_data_init2

这是用来启动的时候给你的全局变量、静态变量拷贝赋值的库函数.
是必须要执行的.否则你的芯片复位了后,变量值就不为0了

启动太慢应该是由于你的CPU启动后用的是内部时钟,如32768这种..比较慢,你可以把时钟初始化提前放到lowlevelinit中

使用特权

评论回复
5
herowa|  楼主 | 2009-3-30 13:18 | 只看该作者

现在决定更改方案

将整个代码分为两部分:Boot + Application。Boot写的尽量简单,迅速搞定看门狗,然后跳转到应用程序部分。

使用特权

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

本版积分规则

24

主题

52

帖子

0

粉丝