首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

MDK2.72a编译器有关问题

2013-09-26 
MDK2.72a编译器问题最近用MDK4.72a写ATMEL ARM9(SAM9G45)裸机程序出现BUG问题如下extern unsigned int tim

MDK2.72a编译器问题
最近用MDK4.72a写ATMEL ARM9(SAM9G45)裸机程序出现BUG
问题如下


extern unsigned int timeCnt;

//-----------------------------------------
//         Global Functions
//-----------------------------------------
extern void RTC_Tester(void);


void Tester_Init(void)
{
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic EMAC lwIP Project %s --\r\n", SOFTPACK_VERSION);
    printf("-- %s\r\n", BOARD_NAME);
    printf("-- Compiled: %s %s --\r\n", __DATE__, __TIME__);

    sys_init_timing();
}



/* The main() function. */
/*功能
定时器每隔10ms进一次中断,timeCnt值加1
主函数中判断每10秒读取一次RTC时钟并输出*/
int main(void)
{
#if 0
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic EMAC lwIP Project %s --\r\n", SOFTPACK_VERSION);
    printf("-- %s\r\n", BOARD_NAME);
    printf("-- Compiled: %s %s --\r\n", __DATE__, __TIME__);
    sys_init_timing();
/*用以上部分初始化程序运行正常*/

#else
volatile unsigned int i;
i = 0xFFFF;
while(i--);
/* 该初始化如果不加此部分程序运行到
RTC_Tester()之后跑飞到0x10(有时会在0x04,0x08或0x0C)地址死循环 */


Tester_Init();
/*用此方法初始化发现timeCnt<100时也会执行RTC_Tester函数
运行结果如下:
timeCnt=1
-I- RTC DateTime: 2007-01-01 00:01:33 Week:1

timeCnt=9
-I- RTC DateTime: 2007-01-01 00:01:33 Week:1

timeCnt=2
-I- RTC DateTime: 2007-01-01 00:01:34 Week:1

timeCnt=1
-I- RTC DateTime: 2007-01-01 00:01:34 Week:1

timeCnt=1
-I- RTC DateTime: 2007-01-01 00:01:34 Week:1

timeCnt=4
-I- RTC DateTime: 2007-01-01 00:01:34 Week:1
*/
/*试过将timeCnt定义为volatile变量效果一样*/
/*如果将>=改为==却能正常执行*/
/*如果不将timeCnt清零,程序运行到timeCnt==100后跑飞*/

#endif

while(1)
{

if(timeCnt >= 100)
{
printf("timeCnt=%d\r\n", timeCnt);
timeCnt = 0;
RTC_Tester();
}
}

    return 0;
}

arm9 MDK KEIL 编译器 c
[解决办法]
高深的问题啊,膜拜一下,心灵上的支持!!
[解决办法]
>=100
10ms一次所以只有1秒
难道
{
            printf("timeCnt=%d\r\n", timeCnt);
            timeCnt = 0;
            RTC_Tester();
}
执行时间超过1秒了?

另外检查下timeCnt的老家,看看数据类型是不是unsigned int,有时extern处和原处的类型不一样编译器还不给警告
[解决办法]
1. 楼主可以用仿真器设断点, 单步执行看看那部分出错了. 看看变量的变化情况. 
2. timeCnt 在别处是默认的 0 还是手动初始化的? 初始化值是多少? 是不是只在定时器中断里使用了? 
3. 调试, 反汇编看看 "0x10(有时会在0x04,0x08或0x0C)" 是什么意思?
4. printf() 用了串口中断? 注释掉试试? 
只能猜这么多了. 解决了分享一下哈. MDK2.72a编译器有关问题
楼主能把 RTC_Tester() 函数的代码贴上来吗? 
[解决办法]
楼主用全局变量timeCnt来在主函数和RTC_Tester()之间传递参数,
not a good idea;
[解决办法]
试一试调整你KEIL的编译优化等级 调低一点

热点排行