This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/CCStudio:调用C代码中的汇编函数时出现问题

Guru**** 2550660 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/580796/ccs-ccstudio-trouble-calling-assembly-functions-in-c-code

部件号:CCStudio

工具/软件:Code Composer Studio

大家好

我是M430G2553 MCU MSP430启动板的完全新手。 我想执行以下任务,

1.从C程序调用汇编器函数,但不传递参数和返回值。

2.从C程序调用汇编器函数并传递参数和返回值

3.汇编器函数/或从主循环调用标准C库函数rand(),并调用用户制作的C函数mult(a,b)

4.更多

我得到了一个教程pdf:slaa140.pdf,它包含了以上所有示例的完整图示,但不幸的是,它是IAR的,只是复制和粘贴代码在CCS中不起作用

所以我决定自己尝试: 我尝试了第一个:从C程序调用汇编器函数,而不传递参数和返回值。

我在CCS项目中制作了两个文件

1. blink.c

#include <MSP4S.h>				

/*--------------------------- 外部函数原型----------------------- */
extern void set_port(void);/* ASM函数原型*/

int main(void){
	WDTCTL = WDTPW | WDTHOLD;		//停止看门狗计时器
	P1DIR |=0x01;					//将WFP 1.0 设置为输出方向

	(;){
		volatile unsigned int I;//	volatile防止优化

		set_port();				//

		= 1万 1.0 I 					// SW delay
		do I--;
		while (I !=0);
	}
	
	返回0;
}

和2. asmFile.asm

*******************
.cdecls C,list,"MSP430.h"

;===================================================================
;set_port
;===========================================================================
文本 ;代码可重定位
set_port:
_main
xoropr xor.b #01h,&P1OUT ; Toggle 0x01 bit Port 1 output
ret
.end

但是在建造这个项目时我遇到了错误

说明   资源   路径   位置   类型
#1.001万链接时出错;“callingASMinC.out”未构建   调用ASMinC          C/C++问题
<ahref="processors.wiki.ti.com/.../1.0234万"> 未解析的符号仍   在调用ASMinC          C/C++问题
gmake:***[All]错误2   调用ASMinC          C/C++问题
gmake [1]:***[callingASMinC.out错误1   调用ASMinC          C/C++问题
未解析的符号set_port,首先在./blink.obj   调用ASMinC中引用          C/C++问题

请帮助我,我非常需要帮助

提前感谢

无耐心等待您的回复,请尽快回复

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要将此语句添加到程序集文件...

    全局set_port 

    这会告诉汇编程序将其设置为全局符号。  

    要阅读有关接口C和组装的更多信息,请参阅  MSP430编译器手册中标题为“从C/C++访问汇编语言函数”的部分。  有关.global指令的详细信息,请参阅MSP430汇编工具手册

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,非常感谢您的回复

    我做了你所说的,但没有运气,

    //blink.c
    #include <MSP430.h>
    
    extern "C"{
    extern int asmfunc();/*声明外部ASM函数*/
    }
    
    int main(void){
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    P1DIR |= 0x01; //将WFP 1.0 设置为输出方向
    
    用于(;;){
    asmfunc(); //切换WFP 1.0
    Delay();
    }
    返回0;}
    
    
    void delay() //延迟例程
    {
    易失性无符号int I; //易失性,以防止优化
    I = 1万; //软件延迟
    我是否--;
    while (I !=0);
    }
    
    ;asmFile.asm
    ;*****************************************************************
    	.cdecls C,list,"MSP40.0.h"
    
    	.global asmfunc
    
    asmfunc:
    		XOR.b #0.0001万b,&P1OUT
    		ret
    

    错误是,

    说明	资源	路径	位置	类型
    [E0002]非法助记符指定	asmFile.asm	/callingASMinC2	line 7	C/C++ problem
    #41预期标识	符blink.c	/callingASMinC2	line 4	C/C++ problem
    #66预期为";"	blink.c	/callingASMinC2	line 4	C/C++
    obj gmake:*** MinasmFile 4 C/C++ problem				
    make:C++ ***[Blink.obj]错误1	调用ASMinC2			C/C++问题
    gmake:由于错误,目标'all'未重做。	调用ASMinC2			C/C++问题
    

    我还参考了slau132n.pdf 6.2 和6.3 中的第132页,但仍然存在相同的错误

    请帮帮我

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在标签asmfunc之前的行上不能有任何空格

    您编写的是C文件,而不是C++文件。 不要使用'extern "C"包装,只需使用'extern。 或者,您可以将该文件重命名为blink.cpp,并将其保留为C++文件,在这种情况下,将需要'extern "C"'。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我有一种奇怪的行为

    当我的ASM文件与以前一样出现错误时,但当我使用与ASM模板中使用的相同缩进时,它就会工作

    ----------------------------------
    ;用于TI Code Composer Studio的MSP430汇编器代码模板
    ----------------------------------
    .cdecls C,list,"MSP40.0.h" ;包含设备头文件
    
    ;------------------
    
    		.global asmfunc
    
    asmfunc:
    			XOR.b #0.0001万b,&P1OUT
    			ret 

    但是如果我将标签asmfunc移动到右边,它会显示指定了非法的助记符

    ----------------------------------
    ;用于TI Code Composer Studio的MSP430汇编器代码模板
    ----------------------------------
    .cdecls C,list,"MSP40.0.h" ;包含设备头文件
    
    ;------------------
    
    		全局asmfunc
    
    asmfunc:
    			XOR.b #0.0001万b,&P1OUT
    			RET 

    那么,就像python CCS使用缩进吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在汇编代码中,所有标签必须放在行的开头。  有关更多详细信息,请参阅  MSP430汇编工具手册中标题为“源代码声明格式”的部分。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,非常感谢您的指导,因为它不起作用

    但是我遇到了一个新问题,printf无法运行,请告诉我如何在程序中使用printf

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请尝试此页面上的提示:
    processors.wiki.ti.com/.../Tips_for_using_printf