【问题标题】:MPLAB XC16: Mixing C and AssemblyMPLAB XC16:混合 C 和汇编
【发布时间】:2016-01-29 17:46:12
【问题描述】:

我正在尝试将一些 C 语言和汇编语言混合在一起,但我有点难受。我对 C 有一定的经验,对汇编有一些经验,但我以前没有在同一个项目中使用过它们。

目前,我正在尝试编译最简单的项目,即 Q1.15 定点乘法。我实际上并不关心代码输出,我只需要编译一些东西以便我可以构建它。

myq15.h:

#ifndef _Q15_MATH
#define _Q15_MATH

#include <stdint.h>

typedef int16_t q15_t;

extern q15_t q15_mul(q15_t multiplicand, q15_t multiplier);
q15_t q15_add(q15_t addend, q15_t adder);

#endif

myq15.c

#include "myq15.h"

q15_t q15_add(q15_t addend, q15_t adder){
    int32_t result = (uint32_t)addend + (uint32_t)adder;

    if(result > 32767)          result = 32767;
    else if(result < -32768)    result = -32768;

    return (q15_t)result;
}

myq15.s:

    .include "xc.inc"

    .text
    .global _q15_mul

_q15_mul:
    ; w3:w2 = w1 * w0
    mul.ss  w0, w1, w2

    ; w0 = (w3:w2) >> 15
    rlc     w2, w2
    rlc     w3, w3

    ; w0 = w3
    mov     w3, w0

    return

    .end

我的“主”文件只调用了一个 q15_add() 和 q15_mul() 实例。

在编译时,链接器状态:

build/default/production/_ext/608098890/myq15.o(.text+0x0): In function `_q15_mul':
: multiple definition of `_q15_mul'

再次,我试图弄清楚如何将程序集和 C 文件混合用于其他目的,但如果我不能让这个简单的程序工作,我就绝望了!

谢谢,

【问题讨论】:

  • 当我发布时,我错过了包括汇编源代码。它在那里声明。
  • 将文件命名为相同是个坏主意,工具链可能会混淆它们。你也忘了展示你是如何编译和链接的。
  • 这是问题所在,我将文件命名为相同。将其发布为答案,我会投票,谢谢!

标签: c assembly microchip mplab xc16


【解决方案1】:

将文件命名为相同是个坏主意,因为myq15.cmyq15.s 默认编译为myq15.o,工具链可能会混淆它们。

【讨论】:

【解决方案2】:

您可以在 c 文件中使用内联汇编。如果你没有大量的组装,这可能是最简单的方法。

建议将任何程序集封装到自己的函数调用中(可以内联),以防止优化产生任何副作用。

inline void SomeAssembly(void) {
  asm volatile(“pwrsav #”);
  asm volatile(“reset”);
} 

int main (void) {
  SomeAssembly();
  while(1);
  return -1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多