0

私はいくつかの 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 ファイルを混在させる方法を見つけようとしていますが、この単純なプログラムを機能させることができなければ、絶望的です!

ありがとう、

4

2 に答える 2

1

ファイルに同じ名前を付けることはお勧めできません。ツールチェーンがファイルを混同する可能性がありmyq15.cます。myq15.smyq15.o

于 2016-01-29T17:53:38.320 に答える
0

ac ファイルでインライン アセンブリを使用できます。組み立てがあまりない場合は、これがおそらく最も簡単な方法です。

最適化による副作用を防ぐために、アセンブリを独自の関数呼び出し (インライン化できる) にカプセル化することをお勧めします。

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

int main (void) {
  SomeAssembly();
  while(1);
  return -1;
}
于 2016-11-30T19:08:36.823 に答える