OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3275|回复: 2

移植伺服驱动器源码IAR到KEIL环境,出现错误和警告,求解决。

[复制链接]

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2015-9-14
在线时间
29 小时
发表于 2016-8-25 14:46:02 | 显示全部楼层 |阅读模式
1金钱
源文件是这样的:
#include "mul_mod64.h"


add64(add_sub64 *v)
{
        u32 y1;
         y1 = abs(y);
        
        if( (v->xs == 1) && (y>=0) )
        {
               v->zl = v->xl + y;
               if(v->zl < v->xl)
               {
                    v->zh = v->xh + 1;
               }
               else
               {
                    v->zh = v->xh;               
               }
               v->zs = 1;   
        }
        else if( (v->xs == 1) && (y<0) )
        {
               if(v->xl >= y1)
               {
                    v->zh = v->xh;
                    v->zl = v->xl - y1;
                    v->zs = 0;
               }
               else
               {
                    if(v->xh >= 1)
                    {
                         v->zl = v->xl - y1;
                         v->zh = v->xh - 1;
                         v->zs = 1;
                    }
                    else
                    {
                         v->zl =  y1 - v->xl ;
                         v->zh = 1;
                         v->zs = 0;
                    }         
               }
        }
        else if( (v->xs == 0) && (y>=0) )
        {
               if(v->xl >= y)
               {
                    v->zh = v->xh;
                    v->zl = v->xl - y;
                    v->zs = 0;
               }
               else
               {
                    if(v->xh >= 1)
                    {
                         v->zl = v->xl - y;
                         v->zh = v->xh - 1;
                         v->zs = 0;
                    }
                    else
                    {
                         v->zl =  y - v->xl ;
                         v->zh = 0;
                         v->zs = 1;
                    }         
               }
        }
        else if( (v->xs == 0) && (y<0) )
        {
               v->zl = v->xl + y1;
               if(v->zl < v->xl)
               {
                    v->zh = v->xh + 1;
               }
               else
               {
                    v->zh = v->xh;               
               }
               v->zs = 0;   
        }
        
}


sub64(add_sub64 *v)
{
        u32   y1;
        y1 = abs(y);
        
        if( (v->xs == 1) && (y>=0) )
        {
               v->zl = v->xl + y;
               if(v->zl < v->xl)
               {
                    v->zh = v->xh + 1;
               }
               else
               {
                    v->zh = v->xh;               
               }
               v->zs = 1;   
        }
        else if( (v->xs == 1) && (y<0) )
        {
               if(v->xl >= y1)
               {
                    v->zh = v->xh;
                    v->zl = v->xl - y1;
                    v->zs = 0;
               }
               else
               {
                    if(v->xh >= 1)
                    {
                         v->zl = v->xl - y1;
                         v->zh = v->xh - 1;
                         v->zs = 1;
                    }
                    else
                    {
                         v->zl =  y1 - v->xl ;
                         v->zh = 1;
                         v->zs = 0;
                    }         
               }
        }
        else if( (v->xs == 0) && (y>=0) )
        {
               if(v->xl >= y)
               {
                    v->zh = v->xh;
                    v->zl = v->xl - y;
                    v->zs = 0;
               }
               else
               {
                    if(v->xh >= 1)
                    {
                         v->zl = v->xl - y;
                         v->zh = v->xh - 1;
                         v->zs = 0;
                    }
                    else
                    {
                         v->zl =  y - v->xl ;
                         v->zh = 0;
                         v->zs = 1;
                    }         
               }
        }
        else if( (v->xs == 0) && (y<0) )
        {
               v->zl = v->xl + y1;
               if(v->zl < v->xl)
               {
                    v->zh = v->xh + 1;
               }
               else
               {
                    v->zh = v->xh;               
               }
               v->zs = 0;   
        }
        
}


mul64(mul_mod64 *v)
{
        u32 u0,v0,w0;
        u32 u1,v1,w1,w2,t;
  
        u0 = v->xl & 0xFFFF; u1 = v->xl >> 16;
        v0 = v->y & 0xFFFF; v1 = 0;
        w0 = u0*v0;
        t = u1*v0 + (w0 >> 16);
        w1 = t & 0xFFFF;
        w2 = t >> 16;


        v->zh = w2 + (w1 >> 16) + v->xh*v->y;
        v->zl = u*v;


        v->zs = v->xs;
}


mod64(mul_mod64 *v)
{
        u32 u0,v0,w0;
        u32 u1,v1,w1,u2;


        v->zh = v->xh/v->y;
        
        u0 = v->xh%y;
        
        v0 = (v->xl>>10) & 0x3fffff;
        
        w0 = (u0<<22) + v0;
        
        u1 = w0/v->y;
        
        v1 = w0%v->y;
        
        w1 = v1<<10 + v->xl & 0x3ff  ;
        
        u2 = w1/v->y;
        
        v->zl = u1<<22 + u2;
        
        v->zs = v->xs;
}


头文件:
#ifndef __MUL_MOD64_H
#define __MUL_MOD64_H

#include "stm32f10x.h"

typedef struct
{
     u32 xh;
     u32 xl;
     u32 xs;
     u32 y;
     u32 zh;
     u32 zl;
     u32 zs;
       
}mul_mod64;

typedef struct
{
     u32 xh;
     u32 xl;
     u32 xs;
     u32 yh;
     u32 yl;
     u32 ys;
     u32 y;
     u32 zh;
     u32 zl;
     u32 zs;
       
}add_sub64;

#endif
在IAR环境下完全正常,移植到keil下编译就出现如下提示:
Build target 'SFQD88'
compiling mul_mod64.c...
..\HARDWARE\mul_mod64.c(8): warning:  #223-D: function "abs" declared implicitly
          y1 = abs(y);
..\HARDWARE\mul_mod64.c(8): error:  #20: identifier "y" is undefined
          y1 = abs(y);
..\HARDWARE\mul_mod64.c(93): warning:  #223-D: function "abs" declared implicitly
          y1 = abs(y);
..\HARDWARE\mul_mod64.c(93): error:  #20: identifier "y" is undefined
          y1 = abs(y);
..\HARDWARE\mul_mod64.c(192): error:  #20: identifier "u" is undefined
          v->zl = u*v;
..\HARDWARE\mul_mod64.c(192): error:  #32: expression must have arithmetic type
          v->zl = u*v;
..\HARDWARE\mul_mod64.c(178): warning:  #550-D: variable "v1" was set but never used
          u32 u1,v1,w1,w2,t;
..\HARDWARE\mul_mod64.c(207): error:  #20: identifier "y" is undefined
          u0 = v->xh%y;
..\HARDWARE\mul_mod64.c: 3 warnings, 5 errors
"..\OBJ\Template.axf" - 5 Error(s), 3 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02




最佳答案

查看完整内容[请看2#楼]

头文件没有移植完整造成的,仔细看一下吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-8-25 14:46:03 | 显示全部楼层
头文件没有移植完整造成的,仔细看一下吧。
活到老,学到老。
回复

使用道具 举报

2

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-8-22
在线时间
91 小时
发表于 2017-2-6 18:06:33 | 显示全部楼层
楼主你这是哪里的驱动器源码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 19:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表