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
我的 'main' 文件只是调用 q15_add() 和 q15_mul() 实例。
编译时,链接器声明:
build/default/production/_ext/608098890/myq15.o(.text+0x0): In function `_q15_mul':
: multiple definition of `_q15_mul'
同样,我正在尝试弄清楚如何将程序集和 C 文件混合用于其他目的,但如果我不能让这个简单的程序运行,我就没有希望了!
谢谢,
给你的文件命名是个坏主意,工具链可能会混淆它们,因为 myq15.c
和 myq15.s
默认编译为 myq15.o
。
您可以在c 文件中使用内联汇编。如果您没有大量的组装,这可能是最简单的方法。
建议将任何程序集封装到它自己的函数调用中(可以内联),以防止优化产生任何副作用。
inline void SomeAssembly(void) {
asm volatile(“pwrsav #”);
asm volatile(“reset”);
}
int main (void) {
SomeAssembly();
while(1);
return -1;
}
我正在尝试混合使用一些 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
我的 'main' 文件只是调用 q15_add() 和 q15_mul() 实例。
编译时,链接器声明:
build/default/production/_ext/608098890/myq15.o(.text+0x0): In function `_q15_mul':
: multiple definition of `_q15_mul'
同样,我正在尝试弄清楚如何将程序集和 C 文件混合用于其他目的,但如果我不能让这个简单的程序运行,我就没有希望了!
谢谢,
给你的文件命名是个坏主意,工具链可能会混淆它们,因为 myq15.c
和 myq15.s
默认编译为 myq15.o
。
您可以在c 文件中使用内联汇编。如果您没有大量的组装,这可能是最简单的方法。
建议将任何程序集封装到它自己的函数调用中(可以内联),以防止优化产生任何副作用。
inline void SomeAssembly(void) {
asm volatile(“pwrsav #”);
asm volatile(“reset”);
}
int main (void) {
SomeAssembly();
while(1);
return -1;
}