2016-01-29 4 views
0

Я пытаюсь смешать некоторые языки C и ассемблера, и у меня есть медведь времени. Я имею опыт работы с C, несколько с сборкой, но раньше я не использовал их в одном проекте.MPLAB XC16: Смешивание 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-файл для других целей, но если я не могу получить эту простую программу для работы , Я безнадежен!

Спасибо,

+0

Когда я отправил сообщение, я пропустил, включая источник сборки. Там объявлено. – slightlynybbled

+1

Плохая идея назвать ваши файлы одинаковыми, их можно смутить. Вы также забыли показать, как вы компилируете и связываете. – Jester

+0

В этом была проблема, я назвал файлы одинаковыми. Опубликуйте его как ответ, и я буду поддерживать, спасибо! – slightlynybbled

ответ

1

Это плохая идея назвать ваши файлы же, может запутать набора инструментов их, учитывая, что оба myq15.c и myq15.s компилировать myq15.o по умолчанию.

+0

Еще раз спасибо за помощь. Поскольку у меня было несколько небольших проблем с этой задачей, я создал быстрый учебник по адресу https://github.com/slightlynybbled/xc16_mixed – slightlynybbled

0

Вы можете использовать встроенную сборку в c-файле. Если у вас нет большой сборки, это, вероятно, самый простой способ.

Рекомендуется инкапсулировать любую сборку в свой собственный вызов функции (который может быть встроен), чтобы предотвратить любые побочные эффекты при оптимизации.

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

int main (void) { 
    SomeAssembly(); 
    while(1); 
    return -1; 
} 
Смежные вопросы