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.

[参考译文] 编译器/TMS320F2.8035万:定义汇编中的变量并访问C中的变量

Guru**** 2611705 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/639830/compiler-tms320f28035-define-variable-in-assembly-and-access-the-variable-in-c

部件号:TMS320F2.8035万

工具/软件:TI C/C++编译器

大家好,我正在测试ILPFC项目,它写在汇编和C中

以下代码位于"ADCDRV_1CH.ASM"中

ADCDRV_1CH_INIT .MACRO n
===================================================
_ADCDRV_1CH_RLT:n:.USect "ADCDRV_1CH_Section",2,1,1;2表示2个单词,32位

;发布终端指针以便从C环境进行访问
.def _ADCDRV_1CH_RLT:n:

MOVL XAR2,#ZeroNet;“ZeroNet”在ISR中初始化为0
MOVW DP,#_ADCDRV_1CH_RLT:n:
MOVL @_ADCDRV_1CH_RLT:n:,XAR2;零输出终端指针
{\f2 .endm}

与下面的代码一起,我们定义了11个变量 ADCDRV_1CH_Rlt1-ADCDRV_1CH_Rlt11,这些变量的大小为2个字。

ADCDRV_1CH_INIT 1;IPFC//这些代码位于ILPFC-DPL-ISR.ASM中
ADCDRV_1CH_INIT 2;IPFC
ADCDRV_1CH_INIT 3;IPFC
ADCDRV_1CH_INIT 4;IPFC
ADCDRV_1CH_INIT 5;IPFC
ADCDRV_1CH_INIT 6;IPFC
ADCDRV_1CH_INIT 7;IPFC
ADCDRV_1CH_INIT 8;IPFC
ADCDRV_1CH_INIT 9;Vpfc
ADCDRV_1CH_INIT 10;VL_fb
ADCDRV_1CH_INIT 11;VN_fb

在ILPFC-main.c中,有以下代码。

// ADC驱动器宏。 IPFC采样过采样8次。
extern volatile long *ADCDRV_1CH_Rlt1;//实例#1,IPFC
extern volatile long *ADCDRV_1CH_Rlt2;//实例#2,IPFC
extern volatile long *ADCDRV_1CH_Rlt3;//实例#3, IPFC
extern volatile long *ADCDRV_1CH_Rlt4;//实例#4, IPFC
extern volatile long *ADCDRV_1CH_Rlt5;//实例#5, IPFC
extern volatile long *ADCDRV_1CH_Rlt6;//实例#6, IPFC
extern volatile long *ADCDRV_1CH_Rlt7;//实例#7, IPFC
extern volatile long *ADCDRV_1CH_Rlt8;//实例#4, IPFC
extern volatile long *ADCDRV_1CH_Rlt9;//实例#5, Vbus
extern volatile long *ADCDRR_1CH_Rlt10;//实例#6, VL_fb.
extern volatile long *ADCDRV_1CH_Rlt11;//实例#7, VN_fb

我的问题是:

代码"extern volatile long *ADCDRV_1CH_Rlt1"是否使变量"ADCDRV_1CH_Rlt1"成为指针?

我还可以写 "extern volatile long ADCDRV_1CH_Rlt1"来使变量 "ADCDRV_1CH_Rlt1"成为一个长数字,对吗?

但是我不能写"extern volatile int ADCDRV_1CH_Rlt1"来使变量 "ADCDRV_1CH_Rlt1"成为短数字,因为短数字是16位,而在程序集中"ADCDRV_1CH_Rlt1"被分配为32位,对吗?

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

    唯一有意义的C声明是"extern volatile long ADCDRV_1CH_Rlt1"。  它不是一个指针。  这是一个长值。

    谢谢,此致,

    -George

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

    从C代码访问手动编码的汇编字段非常困难。  最好在C代码中定义对象并从程序集访问它,原因有两个:

    1. 您可以先创建一个伪C函数来执行您希望汇编代码执行的操作,然后根据编译器生成的内容来创建自己的手动编码汇编的模式。  这将向您展示在手动编码程序集中使用的最佳寻址模式。
    2. 编译器符号表示对象;当使用编译器符号时,实际上会得到该对象的内容。  但是,汇编器符号表示地址;当使用汇编器符号时,实际上会得到该符号的地址。  “假”汇编程序读取C对象比“假”编译器读取汇编程序符号更容易。

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

    extern volatile long *ADCDRV_1CH_Rlt1;//实例#1,IPFC

    此外。
    唯一有意义的C声明是"extern volatile long ADCDRV_1CH_Rlt1",是因为它是32位数吗? 任何32位数据类型都是有意义的,对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ADCDRV_1CH_Rlt1是包含整数还是包含指针? 鉴于声明是指针,而宏谈论的是“终端指针”,这向我建议ADCDRV_1CH_Rlt1中的是一个大模型数据指针。 大模型数据指针为32位,因此大小是合理的。

    您遇到了什么问题,使您怀疑代码是否正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我毫不怀疑,George的回答说:
    唯一有意义的C声明是"extern volatile long ADCDRV_1CH_Rlt1"。 它不是一个指针。 这是一个长值。

    我怀疑的是,对于在汇编中定义的变量,我们不能在汇编代码中指定数据类型,我们只能指定长度,而只有在C中,我们才能将数据类型指定为int或long或float或pointer,对吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确,不能为装配体符号指定C类型。 装配体符号没有任何特定类型。