LINUX.ORG.RU

[AVR-Asm] Как использовать статическую либу в avr-gcc?


0

0

Привет всем=) Пишу(изучаю) один электронный проект на МК Atmega168. Мучает вопрос. Задача:

  • Создать статическую библиотеку для драйвера лампочки (led) на ассемблере.
  • Использовать её в avr-gcc'шном проекте.

Вроде всё компилиться, но лампочка не загорается.

Код файла led_driver.S:

#include <avr/io.h>
.global light_init
light_init:
	in r16,DDRC
	sbr r16,(1<<DDC1)
	out DDRC,r16
	ret

.global light_on
light_on:
	in r16,PORTC
	sbr r16,(1<<PC1)
	out PORTC,r16
	ret

Ещё создал файл led_driver.h:

void light_init();
void light_on();

Компилирую статич. либу так:

avr-gcc -Wall -x assembler-with-cpp -mmcu=atmega168 -o .led_driver.o -c led_driver.S
avr-ar rcs libled_driver.a .led_driver.o

А это файл main.c моего основного проекта:

#define __AVR_ATmega168__ 1
#include "libled_driver/led_driver.h"
int main(void)
{
  light_init();
  light_on();	
  for (;;)
    ;
}

Компилирую проект:

avr-gcc -g -Wall -O2 -mmcu=atmega168 -o .main.o -c main.c          
avr-gcc -g -Wall -O2 -mmcu=atmega168  -o .main.elf .main.o -static -Llibled_driver/ -lled_driver                                                  
avr-objcopy -j .text -j .data -O ihex .main.elf main.hex

полученный main.hex прошиваю.. Ну и лампочка не загорается вообщем.

А если попробовать без либы:

#include <avr/io.h>
int main(void)
{
  DDRC |= (1<<DDC1);
  PORTC |= (1<<PC1);	
  for (;;)
    ;
}

то всё работает. В чём подвох?

Проблема решена. Надо было приписать _SFR_IO_ADDR() к каждому DDRC, и PORTC.

Ох уж этот gcc...=)

anterior
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.