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.

[参考译文] TMS320F280037:尝试了解 ctrlfuncs memcpy 语法

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1526833/tms320f280037-trying-to-understand-ctrlfuncs-memcpy-syntax

器件型号:TMS320F280037

工具/软件:

在 TI 代码中、  loadSize_ctrlfuncs  在外部声明为现有项并定义为 uint32_t 定义为“用户所在“。  它在 memcpy () 中使用,如下所示。  运行静态分析时、参数 3 出现错误、因为它试图将 unint32_t*转换为无符号长整型。  表面上、这似乎是错误/不正确的 C 语言语法、但我假设编译器/链接器正在执行特殊的转换操作  (size_t )&loadSize_ctrlfuncs 复制区域的实际大小、或者我无法理解在这种情况下 C 语法的工作原理。  我只是想了解它是如何工作的、因为如果该线路真正按设计工作、我需要抑制该线路的 MISRA 违例。  对于存储器复制的其他段、也会重复相同的模式、因此我假设这些模式是特意完成的。  


extern uint32_t loadSize_ctrlfuncs;
memcpy (&runStart_ctrlfuncs、&loadStart_ctrlfuncs、(size_t)&loadSize_ctrlfuncs);

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

    尊敬的 Jeremy:

    size_t 数据类型用于表示数据类型的大小(以字节为单位)。 通常、它将在如下语句中使用:

    size_t int32bytes = sizeof(uint32_t);

    然后、您可以将此变量传递到 memcpy 函数的第三个参数。 在您的情况下、听起来您可以直接使用  loadSize_ctrlfuncs 如果此变量的值已经表示要复制的字节数、则直接返回。

    memcpy(&runStart_ctrlfuncs, &loadStart_ctrlfuncs, loadSize_ctrlfuncs);
    如果我有误解、请告诉我。
    此致、
    Delaney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Delaney — 我相信我可以在  TMS320C28x 汇编语言工具 v22.6.0.LTS 用户指南中找到答案:


    8.6.2 链接器定义的整数值

    要访问表示整数值的链接器符号、请使用_symval 内置运算符、这本质上是一个强制转换操作。 例如、链接器符号_TI_STACK_SIZE 表示普通整数。 要在 C/C++代码中获取符号的值作为整数、请使用以下语法:

    extern void _TI_STACK_SIZE;

    size_t get_stack_size (){ return _symval (&__TI_stack_size );}

    此类外部声明中的类型无关紧要、因为只需要符号的地址。 在严格的 ANSI 模式下、无法使用 void 类型来声明此变量、因此请改用 unsigned char。