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.

[参考译文] MSP432E401Y:将 CCS 变量的地址传递到内联汇编代码

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1364682/msp432e401y-passing-the-address-of-a-ccs-variable-to-inline-assembly-code

器件型号:MSP432E401Y

您好!

我想使用一些内联汇编代码来设置几个 CCS 变量(IP 地址等)的值、因此我可以设置为 EEPROM 中的值。

是否可以通过某种方式将 CCS 变量的地址(例如 uint32_t ui32IPAddr)获取到寄存器中、以便我可以执行此操作?

谢谢你。

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

    您好、Brad、

     我不是汇编层面的专家。 不清楚为什么要使用汇编语言来处理 C 变量。 我将建议您参阅 《TI Arm 编译器用户指南》中的第6.6.2和6.6.3节 、从而从 C/C++访问汇编函数/变量。 有关寄存器变量和参数、另请参阅第5.8节。 Register 是一个标准 C 关键字、它允许您在未启用优化的情况下强制将变量分配给寄存器。  

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

    您好 Charles、

    我使用汇编语言是因为这是我所知道的从板上的 EEPROM 中获取数据的唯一方法、并且正如我在上一个项目中意识到的、当我初始化板以使用静态 IP 地址时、我需要设置 IP 地址 ui32IPAddr 和网关地址 ui32GWAddr。  

    我看看示例6.3和6.4、运气不好。 我能够如示例6.3中所示定义变量 var、并且可以如示例6.4中所示将其声明为外部变量、但我看不到在 assm 命令中使用它以便使用它来获取所需数据的任何方法。  例如、如果我尝试在以下命令中使用它:

      MOV  R1、var

    我收到编译错误"无效操作数"。  第5.8节只让我更困惑。

    你看到我做错了什么吗?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用汇编语言是因为这是我所知道的从电路板上的 EEPROM 中获取数据的唯一方法,而且正如我从上个项目中获悉的,[/报价]

    您是如何对 EEPROM 进行编程的? 要读取 EEPROM ,只需调用 EEPROMRead ()即可,数据保存在变量中。  请参阅外设驱动程序库用户指南中记录的以下示例。  

    uint32_t ui32EEPROMInit;
    uint32_t pui32Data[2];
    uint32_t pui32Read[2];
    //
    // Enable the EEPROM module.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0);
    //
    // Wait for the EEPROM module to be ready.
    //
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_EEPROM0))
    {
    }
    //
    // Wait for the EEPROM Initialization to complete
    //
    ui32EEPROMInit = EEPROMInit();
    //
    // Check if the EEPROM Initialization returned an error
    // and inform the application
    //
    if(ui32EEPROMInit != EEPROM_INIT_OK)
    {
    while(1)
    {
    }
    }
    //
    // Program some data into the EEPROM at address 0x400.
    //
    pui32Data[0] = 0x12345678;
    pui32Data[1] = 0x56789abc;
    EEPROMProgram(pui32Data, 0x400, sizeof(pui32Data));
    //
    // Read it back.
    //
    EEPROMRead(pui32Read, 0x400, sizeof(pui32Read));
    130

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

    您好 Charles、

    我解决了一个小问题。 我在 pu32Read 中获得的 IP 地址(192.168.1.101)为0x6501A8C0、但我需要将反转字节设为0xC0A80165。  我知道我可以使用大量指令来执行此操作、但我想知道是否有简单的 C/C++命令可以执行此操作。

    我仍然对我所能获得的有关如何在 C/C++代码和汇编代码之间来回传递变量的任何信息感兴趣、因为我确信我会在某个时候再次遇到这个问题。

    谢谢!

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

    您好、Brad、

     我认为您需要使用 htonl 和 ntohl 函数在主机字节顺序和网络字节顺序之间进行转换。 请访问 https://linux.die.net/man/3/htonl

     如果您引用 C:\ti\TivaWare_C_Series-2.2.0.295\utils\lwiplib.c 文件、它会使用 htonl  将 unsigned long 整数(主机字节地址)转换为网络字节顺序。 在将添加到应用程序之前、您可以先创建一个简单的程序并尝试使用这些函数。

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

    您好 Charles、

    htonl()函数运行,现在 你上面发布的 EEPROMRead ()函数运行的很好。

    我真的很感谢所有的帮助。

    非常感谢。