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:调用 a ##39;c'从汇编代码中调用函数

Guru**** 2464580 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1471656/msp432e401y-calling-a-c-function-from-assembly-code

器件型号:MSP432E401Y

工具与软件:

您好!

我的一个应用程序首先在"c"程序中初始化大多数函数、然后进入汇编代码以实现大多数功能。   该应用程序在远程站点运行、并定期通过 LTE 调制解调器与中央办公室通信。  调制解调器大部分时间都处于关闭状态、以节省能源、应用程序按照预设的计划为调制解调器加电、以便与局端通信。

我的客户最近开始使用新的 NETGEAR LM 1300 LTE 调制解调器、事实证明、该调制解调器每次通电时都需要重新初始化 DHCP 连接。

使用以下指令在'c'程序中初始化 DHCP 连接:

  lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);

因此、我需要在 LTE 调制解调器上电后从我的汇编代码内部调用此函数。

有人能告诉我如何从我的汇编代码内部调用这个函数吗? 我尝试了许多不同的事情,到目前为止没有任何工作。

谢谢!
Brad McMillan

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

    尊敬的 Brad:

     我会将您的问题转发给我们的编译器专家以征求意见。 我自己不知道从汇编语言调用 C 函数的最佳方法、特别是传递到函数的六个参数。  

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

    假设您使用 tiarmclang 编译器。

    请参阅 tiarmclang 在线手册的函数结构和调用惯例部分

    下一部分不是绝对必要的,但它使事情更容易。  编写一个简单的 C 函数,使这个调用...

    lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);[/QUOT]

    使用选项构建该文件 -S .  编译器将汇编代码生成到与源文件同名的文本文件中、文件扩展名更改为 .S. .  检查该文件。

    谢谢。此致、

    -George.

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

    我使用 Code Composer Studio、我不确定它 是否使用 tiarmclang 编译器、但我想我可以使用 CCS 中的反汇编器来完成您所提出的同样的操作。  

    会调用 lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);在主 C 程序中、我放置一个断点、用于反汇编程序查看汇编指令、然后单步执行这些指令、以准确显示它们所做的操作。 以下是汇编代码:

    MOVs R1、#1;R1 <- 1
    MOVs r0、#0;r0 <- 0
    STR r0、[R13];R13:2000D3B0 <- 0
    LDR r0、[PC、#0x278];PC:00012312、r0:2000CBBC g_ui32SysClock: 00 0E 27 07
    STR R1、[R13、#4];2000D3B4 <- 1 \@ 0001258A
    LDR r0、[r0];r0 <- 07270e00
    MOVS R2 #0;R2 <-0
    MOVs R3、#0;R3 <- 0
    加 R1、R13、#0x28;R1 <- 2000D3D8

    BL lwIPInit

    这里是寄存器 r0至 R4的内容、以及调用 lwIPInit 之前几个相关存储器位置的内容

    ; r0: 0727 0E00 g_ui32SysClock 120,000,000
    ;R1: 2000 D3D8 pui8MACArray
    ;R2: 0000 0000
    ;R3: 0000 0000
    ;R4: 0000 0000

    ; 2000 D3B0: 00 00 00假设 IPADDR_USE_IP
    ;2000 D3B4:01 00 00 00假设 IPADDR_USE_DHCP

    我试图在我的主汇编代码中放入类似的指令、我希望有人可以为我澄清以下几个问题:

    1.我不知道如何告诉汇编器 lwIPInit 函数所在的位置。 我尝试了使用.extern 和.include、但这两个都抛出汇编器错误。

    2.我认为  pui8MACArray、 IPADDR_USE_IP 和 IPADDR_USE_DHCP 的存储器位置将在我的程序的未来版本中发生变化。  是否有办法确定每个版本的内存位置在哪里?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用 Code Composer Studio、但我不确定它 是否使用 tiarmclang 编译器

    构建时、CCS 在 Output 视图中显示构建命令和系统响应。  你会看到类似的东西...

    Building file: "../file.c"
    Invoking: Arm Compiler
    "C:/ti/ccs2000/ccs/tools/compiler/ti-cgt-armllvm_4.0.1.LTS/bin/tiarmclang"

    本例中使用的是 tiarmclang 编译器。  我继续假定您使用 tiarmclang。

    使用反汇编程序查看汇编指令

    您需要查看编译器生成的汇编代码。  它包括指令和其他重要详细信息。  如上所述、使用 -S 并检查编译器生成的汇编文件。  我想在那个时候、大部分内容都是合理的。  如果不是、请随时在此处发布问题。

    谢谢。此致、

    -George.

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

    当我使用锤子图标进行构建时、我得到:

    构建文件:"../enet_Modbus.c"
    调用:ARM 编译器
    "C:/TI/ccs1120/ccs/tools/compiler/ti-cgt-arm_20.2.5.LTS/bin/armcl -mv7M4 --code_state=16 --float_support=FPv4SPD16 -me --

    它看起来与您提到的 tiarmclang 编译器类似、但不完全是您提到的。

    无论如何、我构建项目唯一要做的就是单击锤子图标、所以我不知道如何按照您的建议调用-s 选项。

    如果我想知道如何告诉我的.asm 文件在哪里查找 lwIPInit 函数、我会取得很大的进展。  它位于项目中的另一个文件"lwiplib.c"中。  

    正如我之前提到的、我尝试了使用.extern 和.include、但这两个都引发了汇编器错误。  您是否熟悉我应该使用的命令、或者我应该提出新问题以找出答案。  请告诉我。

    谢谢你。

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

    不使用 tiarmclang 编译器。  您可以使用名为 armcl 的旧版 TI Arm 编译器。  所以我之前所说的所有手册参考都是错误的。  尽管调用约定相同、这意味着文档的这一部分是正确的。

    请考虑此建议。   添加 一个 C 文件、该文件包含一个不接受参数且不返回结果的函数。  该函数所做的一切就是调用  lwIPInit  可选输出参数。  现在、为该函数命名  Calls_lwIPInit .  将呼叫添加到会更容易  Calls_lwIPInit  添加到汇编代码中。

    谢谢。此致、

    -George.

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

    这种方法给我带来了一些问题:

    1.如何在我的项目中包括 C 文件? 我的主 C 文件中似乎只有与 C 文件关联的#include "***.h"语句。

    2.我应该在汇编程序中使用什么语句来调用"calls_lwIPInit"?

    3.我是否不需要在汇编程序中使用指令来指示在哪里可以找到 "calls_lwIPInit"函数?

    4. 请告诉我该指令应该是什么。

    谢谢你。

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

    在 CCS 之外创建它。  然后拖放它。  我相信还有其他方法可以实现它。  这是较简单的选项之一。

    [报价 userid="470468" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1471656/msp432e401y-calling-a-c-function-from-assembly-code/5658294 #5658294"]

    2.我应该在汇编程序中使用什么语句来调用"calls_lwIPInit"?

    3.我是否不需要在汇编程序中使用指令来指示在哪里可以找到 "calls_lwIPInit"函数?

    4. 请告诉我该指令应该是什么。

    [报价]

    使用这两行...

            .global calls_lwIPInit
            BL        calls_lwIPInit        

    第1行是指令。  第2行是指令。  在 TI ARM 汇编工具手册中搜索指令。  TI 不发布任何有关 Arm 汇编指令的文档。  我想您应该有自己的参考资料。

    谢谢。此致、

    -George.

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

    我尝试按照您的建议使用 calls_lwipinit 函数创建 C 文件、当我尝试对主 C 程序中使用的 lwIPInit 函数中的变量使用相同的定义(在下面重复)时、遇到了很多编译器错误。 例如、语句"uint8_t pui8MACArray[8];"会向我显示错误"uint8_t is undefined"。

    lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);

    然后、我尝试使用正确的值填充寄存器、然后使用、从而直接调用函数

    .global lwIPInit、and

    BL lwIPInit。  

    这似乎从函数 ok 调用并返回、但当我使用 suspend 函数以查看代码执行的位置时、代码卡在了循环中、AutoIP_tmr (void)(在 AutoIP.c 中)。并带有注释"必须每 AUTOIP_TMR_INTERVAL 毫秒在循环中调用"。

    感谢您提供的任何帮助、帮助我克服这些问题。

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

    您好!

    请注意,由于周末延长(2月17日假期),客人可能会在下周的星期二之前收到回复。

    谢谢

    Ki

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

    我建议你坚持这个方法...

    我尝试使用 calls_lwipinit 函数创建 C 文件

    ...并通过你所经历的问题工作。  这比尝试 从汇编代码直接调用 lwIPInit 更简单。  因为,无论这些问题是什么,已经有很多的帮助。  有许多 C 语言编程课程,教程,书籍等,你可以使用,以制作的东西,如...

    语句"uint8_t pui8MACArray[8] ;"为我提供了错误"uint8_t is undefined"。

    如果有一位同事熟悉 C 语言编程、那就更好了。

    谢谢。此致、

    -George.

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

    我让它开始工作。  您的信息非常有用、我从中学到了很多。

    谢谢!
    Brad McMillan