标题:【求助】2440的裸机程序,其实就是个单片机程序
只看楼主
啥是arm
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-17
结帖率:100%
已结贴  问题点数:20 回复次数:4 
【求助】2440的裸机程序,其实就是个单片机程序
【...】今天写程序的时候出现了一个问题,部分代码如下
#define     N          (64)             //半个基波周期内的载波数量
#define    M          (0.8)             //调制度
#define    FUNDAMENTAL_CYCLE     (0.02)            //基波周期
#define    TIMER_CLOCK     (25000000)               //设置定时器时钟为25M
#define    SPWM_CALCULATEF_H(i)       (TIMER_CLOCK*( ( M*(cos( ((i)-1)*3.14/N )-cos((i)*3.14/N) ) )*(FUNDAMENTAL_CYCLE/2)/3.14))
unsigned int Spwm_Code_H[N]={0};
/*-------------------------------------主函数-------------------------------------*/
int main(void)
{   
unsigned char Count = 0,Run_Mode = 0;

init_led();
init_pwm();
init_irq();
while(1){
switch(Run_Mode){
/*计算模式,此模式下将计算的SPWM脉冲宽度对应的定时器初值放入数组里面,需要关闭SPWM输出*/
case  CALCULATION_MODE:
  TCON &= (~(1<<8));     //首先关闭定时器1;
 /*将计算的结果放入数组中*/
  for(Count=1;Count<=N;Count++){
Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(Count);
  }

  GPBDATA &= (~(1<<5));    //LED1亮代表计算完成
break;
}   
}
return 0;
}

【】以上代码直接编译的话,会出现以下错误
main.c:(.text+0x134): undefined reference to `__aeabi_dsub'
main.c:(.text+0x140): undefined reference to `__aeabi_dmul'
main.c:(.text+0x144): undefined reference to `__aeabi_d2uiz'
main.c:(.text+0x160): undefined reference to `__aeabi_i2d'
main.c:(.text+0x16c): undefined reference to `__aeabi_dmul'
main.c:(.text+0x178): undefined reference to `__aeabi_dmul'
main.c:(.text+0x17c): undefined reference to `cos'
main.c:(.text+0x18c): undefined reference to `__aeabi_i2d'
main.c:(.text+0x198): undefined reference to `__aeabi_dmul'
main.c:(.text+0x1a4): undefined reference to `__aeabi_dmul'
main.c:(.text+0x1a8): undefined reference to `cos'
【】主要问题出在main函数里面的那段红色代码, 就是这句话Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(Count);
现在是我的调试步奏:方法1:如果我把 Spwm_Code_H 这个数组定义在main函数里(上面的代码是定义在main函数外的),编译通过。
                                   方法2:如果我把 Spwm_Code_H 这个数组定义在main函数外(就是上面那段代码),然后把这段代码      for(Count=1;Count<=N;Count++){
Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(Count);
  }
改为
                                  for(Count=1;Count<=N;Count++){
Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(1);
  }
就是把Count定义为一个常数,编译也通过。
                                   方法3:如果我把 Spwm_Code_H 这个数组定义在main函数外(就是上面那段代码),然后把这段代码      for(Count=1;Count<=N;Count++){
Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(Count);
  }
改为
                                  for(Count=1;Count<=N;Count++){
Spwm_Code_H[1] = SPWM_CALCULATEF_H(Count);
  }
就是把Count-1定义为一个常数,编译也通过。
我真的没招了,我想把 Spwm_Code_H 这个数组定义为全局数组,但是就是会出错,请大家帮我解决下,谢谢。
搜索更多相关主题的帖子: 单片机程序 定时器 
2013-08-17 19:31
啥是arm
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-17
得分:0 
有新发现 当这句话Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(Count);
变成 a =  SPWM_CALCULATEF_H(Count);就是把宏的结果赋值给一个变量而不是数组,编译就会通过;
2013-08-17 20:04
啥是arm
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-17
得分:0 
问题解决了一些了,2440在计算除法的时候会以来一个libgcc.a这个库,连接进来就行了,现在只剩下main.c:(.text+0x17c): undefined reference to `cos'这个问题 ,谁知道怎么解决呀?谢谢了!!
2013-08-18 09:23
啥是arm
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-17
得分:0 
还得自己来呀 连接各数学库OK
2013-08-19 17:02
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:20 
哈哈  解决就好  结贴吧

DO IT YOURSELF !
2013-08-19 17:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-419283-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.505467 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved