繁体   English   中英

MPLAB XC16:混合C和汇编语言

[英]MPLAB XC16: Mixing C and Assembly

我正在尝试混合使用某些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文件混合用于其他目的,但是,如果无法使这个简单的程序正常工作,我将无可救药!

谢谢,

给您的文件起同样的名字是一个坏主意,考虑到myq15.cmyq15.s都默认编译为myq15.o ,因此工具链可能会混淆它们。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM