打印

2440裸机的一个问题

[复制链接]
1701|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
啥是arm|  楼主 | 2013-8-17 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【...】今天写程序的时候出现了一个问题,部分代码如下
#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(1);
                                  }
就是把Count-1定义为一个常数,编译也通过。
我真的没招了,我想把Spwm_Code_H 这个数组定义为全局数组,但是就是会出错,请大家帮我解决下,谢谢。

相关帖子

沙发
啥是arm|  楼主 | 2013-8-17 19:11 | 只看该作者
【...】今天写程序的时候出现了一个问题,部分代码如下
#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 这个数组定义为全局数组,但是就是会出错,请大家帮我解决下,谢谢。

使用特权

评论回复
板凳
啥是arm|  楼主 | 2013-8-17 20:07 | 只看该作者
有新发现 当这句话Spwm_Code_H[Count-1] = SPWM_CALCULATEF_H(Count);
变成 a =  SPWM_CALCULATEF_H(Count);就是把宏的结果赋值给一个变量而不是数组,编译就会通过;

使用特权

评论回复
地板
啥是arm|  楼主 | 2013-8-18 09:24 | 只看该作者
问题解决了一些了,2440在计算除法的时候会以来一个libgcc.a这个库,连接进来就行了,现在只剩下main.c:(.text+0x17c): undefined reference to `cos'这个问题 ,谁知道怎么解决呀?谢谢了!!

使用特权

评论回复
5
阿南| | 2013-8-19 07:36 | 只看该作者
没有定义,说明库里没有找到这个函数,需要加进来,或者去掉

使用特权

评论回复
6
啥是arm|  楼主 | 2013-8-19 16:13 | 只看该作者
阿南 发表于 2013-8-19 07:36
没有定义,说明库里没有找到这个函数,需要加进来,或者去掉

阿南哥  我就是想使用cos这个余弦函数呀 但是我包含了math.h为什么会出错 我是在虚拟机上编译的,4.3.2 和3.4.5版本的编译器都试过了 就是不行 麻烦指条明路

使用特权

评论回复
7
啥是arm|  楼主 | 2013-8-19 17:02 | 只看该作者
解决了 解决了 需要在连接的时候把数学库连接进来 谢谢南哥

使用特权

评论回复
8
阿南| | 2013-8-20 21:04 | 只看该作者
不错,**就是胜利

使用特权

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

本版积分规则

46

主题

181

帖子

0

粉丝