5417|10

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【请大侠出手相助】混合编程C子程序:全局变量+除法运算问题 [复制链接]

见下帖

[ 本帖最后由 jhw3378 于 2012-2-11 09:54 编辑 ]

最新回复

楼主是如何解决的?我也遇到了这个问题?  详情 回复 发表于 2016-6-23 18:40
 
点赞 关注

回复
举报

12

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

//====================================================主程序
#include "msp430x44x.h"  
extern chu
//------------------------------------
             NAME  main
             ORG   0FFFEh
             DW    RESET
//------------------------------------
             RSEG  CSTACK
             RSEG  CODE
//------------------------------------
RESET mov.w #SFE(CSTACK),SP
main     mov.w #WDTPW+WDTHOLD,&WDTCTL
//-------------------------------------
             mov.w #40,R12;
             mov.w #20,R13;
             call #chu
//-------------------------------------
main1
             jmp main1 
//-------------------------------------    
             END


//======================================================子程序
#include "msp430x44x.h"
unsigned int kk;
unsigned int chu(unsigned int i,unsigned int j)
{
        kk=kk+1;//完成一次全局变量计数
        return(i/j);//主程序中进行调用
}

 

//=======================================================报错:
Error[e46]: Undefined external "?cstart_init_zero" referred in quanjuyuchu ( G:\
Error[e46]: Undefined external "?DivMod16u" referred in quanjuyuchu ( G:\ 

 

//=======================================================备注

我用的5.2版本的IAR 不知道是哪里设置出的问题?请各位大侠帮助解决

[ 本帖最后由 jhw3378 于 2012-2-10 10:17 编辑 ]
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
上面问题中得全局变量kk必须在C程序中(实际需要)
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

4
 
再顶一下
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

5
 
是完整的代码不?
报错的DivMod16u好像没看到哦
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

6
 
是完整的代码
DivMod16u应是系统生成的除运算汇编程序
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

7
 
cstart_init_zero
这个是初始化的代码,如果用的是C,一般ide会自动替你做好。
汇编的话是不是需要自己做这个,汇编不熟悉,只能发表下我自己的看法,让你参考下
 
 
 

回复

547

帖子

0

TA的资源

纯净的硅(初级)

8
 
哇!个个都好厉害啊
 
个人签名嵌入式培训www.51great.org
 
 

回复

6040

帖子

195

TA的资源

版主

9
 
您好,根据您的问题,提供以下解决方案,仅供参考。
第一个,为了不让C运行环境对变量进行初始化,可以用__no_init关键字进行修饰__no_init unsigned int kk;
第二个,因为C语言的支持需要C运行时库,而您建立的汇编工程并不包括这个库,可以手工把你需要的库加入到工程中,以提供C运行时库中的函数。而这个库的选择却是个麻烦的事情,由于C运行时库的选择涉及到CPU的架构,数据模式,double的字长等等诸多因素库分成了30余个。具体库文件存放在\430\lib\dlib\目录下。

我想用汇编去调用C库,可能会带来很多不确定的因素,因为你的C代码未在C运行环境中运行,以上两点可以解决问题,但是我却觉得它存在着潜在的危险(当然也可能没有任何问题,有能力的话可以反汇编它的代码,就能得到结果了)。这个在汇编工程中调用C还是头一次接触,以前只知道C工程中调用汇编以及相互调用,是不是软件架构设计的不太合理呢?这样实在是有些冒险。

由于在这方面未曾深入研究,只是提供一些皮毛信息作为提示。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

10
 

谢谢

突发奇想,想写一个双任务的调度程序,主程序用汇编,两个任务程序同样用汇编写时没有问题。
想着任务程序一般用C开发,结果就遇到了上述问题。
根据您的建议,变量声明使用__no_init应该没有问题,从汇编代码看也正常,只是必须在C任务中进行变量的初始化。
但是在C子程序中作整除运算不好解决(整乘可以,但3.42版本也不行),原来理解单独编译这段C代码通过,说明是把库函数正常调用了,但link报错,简单以为是IAR的设置问题。这个问题也可以替代解决:自己写一些除函数汇编代码,在C任务中去调用,但感觉C中的加减乘除代码不好看。
最后再次感谢各位朋友的帮助!
最后小结一下:
1.主程序和子程序都用C时正常
2.主程序和子程序都用汇编也正常
3.主程序用C,子程序用汇编正常
4.主程序用汇编,子程序用C,汇编中可声明函数和变量,也可被C使用,C中也可声明函数,不能直接声明全局变量(除非使用__no_init关键字),并且C函数中不能使用(/%,3.42甚至不能使用*)运算。
再次表示感谢!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
jhw3378 发表于 2012-2-12 18:12
突发奇想,想写一个双任务的调度程序,主程序用汇编,两个任务程序同样用汇编写时没有问题。
想着任务程序 ...

楼主是如何解决的?我也遇到了这个问题?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表