Привет всем=) Пишу(изучаю) один электронный проект на МК 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 (;;)
;
}
то всё работает. В чём подвох?