Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3815420#p3815420"]Речь о том, что ЛЮБАЯ вставка на ассемблере в Си подчиняется правилам проекта в целом[/uquote]
еще раз вставки НЕТ - есть файлы (можно только ассемблерные), а сборка всего проекта проводится по предельно простым правилам:

Код: Выделить всё

1)# Assemble: create object files from assembler source files.
2)# Compile: create object files from C source files.
3)# Link: create ELF output file from object files.
гуглеперевод:

Код: Выделить всё

1) # Assemble: создание объектных файлов из исходных файлов на ассемблере.
2) # Компиляция: создание объектных файлов из исходных файлов Си.
3) # Link: создать выходной файл ELF из объектных файлов.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Запускаем полный комплект ассемблер - линкер - библиотекарь, да еще относительно компилятора СИ?
Он же будет планировку для Си делать.
Да и указанное в приведенном Вами выше файле не выходит за рамки типичной подпрограммы, которую можно разместить в рамках проекта ЛЮБОГО компилятора (хоть ассемблер хоть Си).
8)
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

полный комплект состоит всего из одного файлика avr-gcc.exe - он компилирует и си и асм файлы и линкует вдобавок, все просто:

Код: Выделить всё

asmfunc.S :
avr-gcc -c -mmcu=attiny85 -I. -x assembler-with-cpp -DF_CPU=16000000 -DMODE=2 -Wa,-gstabs,-gdwarf-2 asmfunc.S -o obj_hr/asmfunc.o

xitoa.S :
avr-gcc -c -mmcu=attiny85 -I. -x assembler-with-cpp -DF_CPU=16000000 -DMODE=2 -Wa,-gstabs,-gdwarf-2 xitoa.S -o obj_hr/xitoa.o

main.c :
avr-gcc -c -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/main.o,-MF,obj_hr/main.d main.c -o obj_hr/main.o

pff.c :
avr-gcc -c -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/pff.o,-MF,obj_hr/pff.d pff.c -o obj_hr/pff.o

mmc.c :
avr-gcc -c -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/mmc.o,-MF,obj_hr/mmc.d mmc.c -o obj_hr/mmc.o

Linking...
avr-gcc -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/sd8p_hr.o,-MF,obj_hr/sd8p_hr.d obj_hr/asmfunc.o obj_hr/xitoa.o obj_hr/main.o obj_hr/pff.o obj_hr/mmc.o --output obj_hr/sd8p_hr.elf
was ist das "планировку для Си"?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

oleg110592 писал(а):полный комплект состоит всего из одного файлика avr-gcc.exe - он компилирует и си и асм файлы и линкует вдобавок
ой ли? по-моему, он всего лишь вызывает соответствующие модули из папки bin тулчейна, передавая между ними параметры... или нет?

Добавлено after 7 minutes 58 seconds:
сам себе отвечаю: не прав был... действительно, один файл все делать может... во всяком случае для однофайлового проекта, на котором протестировал.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

скорее всего вызывает - из документа:
https://www.eit.lth.se/fileadmin/eit/co ... rview.html
GCC также известен как программа-драйвер, поскольку он знает о ней и легко управляет другими программами для создания конечного результата. Ассемблер и компоновщик являются частью другого проекта с открытым исходным кодом, называемого GNU Binutils. GCC знает, как заставить GNU-ассемблер (газ) собирать выходные данные компилятора. GCC знает, как управлять компоновщиком GNU (ld), чтобы связать все объектные модули в конечный исполняемый файл.
но вопрос странноватый был;
Запускаем полный комплект ассемблер - линкер - библиотекарь, да еще относительно компилятора СИ?
ответ (тоже странный) - запускаем один файлик.
з.ы. BOB51 бы ручками позапускал бы компилятор в командной строке и много вопросов отпало бы и ардуино оказалось не нужным бы :)
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Да запускал и запускаю.
Только ассемблер относительно 51-й и из батника.
8)
Можно было бы попробовать Ваш вариант подключения с готовой АВРкиной прожкой, но она у меня несколько на слэнге сделана - под "чистокровный ассемблер" придется перелопатить...
tnX5_2812.zip
(83.53 КБ) 189 скачиваний
Это всего-то тест светиков.
Попробуйте его вставкой в Сишный проект сделать. Допустим ... как исполнительный драйвер индикации для проекта какого-либо прикладного назначения (индикация при сработке будильника к примеру).
:roll:
Вернее даже не всю прожку, а только обработчик вывода - trd2812_m.txt....
С учетом его особенностей...
8)
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

файл main.c
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <string.h>

void bob51_func();	/* Defined in trd2812_m.S*/

int main (void)
{
	bob51_func();
	while (1)
	{
		/* code */
	}
}
файл trd2812_m.S
Спойлер

Код: Выделить всё

#include <avr/io.h>	// Include device specific definitions.

#define	port_out	_SFR_IO_ADDR(PORTB)
#define out_line  0 

.section .bss
.global bufout	; xfunc_out must be initialized before using this module.
bufout:	.ds.w	5
.section .text       

.global bob51_func	
.func bob51_func
	bob51_func:
	rjmp mass_trm
	slot0:
	; 6/14 (6-4=2 посему роль остатка выполняет CBI)
	cbi port_out, out_line ; 2 цикла
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	ret ; 4 цикла
	slot1:
	nop ; 13/7 (13-4=9)
	nop
	nop
	nop
	nop
	nop
	nop
	cbi port_out,out_line ; 2 цикла
	nop
	nop
	ret ; 4 цикла
	xslot0:
	; 6/14 (6-5=1 посему роль остатка выполняет CBI с избытком в 1 nop)
	cbi port_out,out_line ; 2 цикла
	cbr zl,(1<<6) ; модификация указателя 1 цикл
	nop
	nop
	nop
	nop
	nop
	nop ; -2 цикла на ld R16,x+
	dec R17 ; 1 цикл
	brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
	rjmp trasstt ; 2 цикла
	xslot1:
	nop ; 13/7 (13-5=8)
	cbr zl,(1<<6) ; модификация указателя 1 цикл
	nop
	nop
	nop
	nop
	nop
	cbi port_out,out_line ; 2 цикла
	; -2 цикла на ld R16,x+
	dec R17 ; 1 цикл
	brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
	rjmp trasstt ; 2 цикла
	;
	ends_trd:
	pop R16
	pop R17
	pop xl
	pop xh
	pop zl
	pop zh ; восстановить рабочую область из стека
	ret
	;-----------------------------------------
	;
	; предварительно:
	; линия out_line настроена на вывод
	; исходный уровень out_line =0
	; указатель стека усатновлен на RAMEND
	; массив данных (bufout:bufout_size) предварительно загружен
	; флаг готовности массива данных установлен
	;
	mass_trm:
	push zh
	push zl
	push xh
	push xl
	push R17
	push R16 ; храним рабочую область в стеке
	res_line:
	ldi R16, 4
	ser R17
	cbi port_out,out_line
	res_time:
	dec R17
	brne res_time
	dec R16
	brne res_time ; =>50uS time out
	ldi XH,hi8(bufout)
	ldi XL,lo8(bufout) ; загрузка начального адреса массива
	; в указатель
	ldi R17, 5 ;bufout_size
	ldi ZL, lo8(slot0) ; адрес начала таблицы в указателе
	ldi ZH, hi8(slot0)
	;-----------------------------------------
	trasstt:
	ld R16,x+ ; 2 цикла
	slot_0:
	sbi port_out,out_line ; 2 цикла реально до установки 3 цикла
	bst R16,7 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла = 4 цикла от out_line=1
	;----------------
	slot_1:
	sbi port_out,out_line
	bst R16,6 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла
	;----------------
	slot_2:
	sbi port_out,out_line
	bst R16,5 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла
	;----------------
	slot_3:
	sbi port_out,out_line
	bst R16,4 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла
	;----------------
	slot_4:
	sbi port_out,out_line
	bst R16,3 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла
	;----------------
	slot_5:
	sbi port_out,out_line
	bst R16,2 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла
	;----------------
	slot_6:
	sbi port_out,out_line
	bst R16,1 ; 1 цикл
	bld zl,4 ; 1 цикл
	icall ; 3 цикла
	;----------------
	slot_7:
	sbi port_out,out_line
	sbr zl,(1<<6) ; модификация указателя под завершающий фрагмент
	; 1 цикл
	bst R16,0 ; 1 цикл
	bld zl,4 ; 1 цикл
	ijmp ; 3 цикла
	;----------------                  
.endfunc 
Makefile
Спойлер

Код: Выделить всё

### Project name (also used for output file name)
PROJECT = BOB51_test

### Source files and search directory
CSRC    = main.c
ASRC    = trd2812_m.S
VPATH   =

### Target device
DEVICE  = attiny85

### Optimization level (0, 1, 2, 3, 4 or s)
OPTIMIZE = s

### C Standard level (c89, gnu89, c99 or gnu99)
CSTD = gnu89

### Include dirs, library dirs and definitions
LIBS	=
LIBDIRS	=
INCDIRS	=
DEFS	= F_CPU=16000000 MODE=1
ADEFS	= $(DEFS)

### Warning contorls
WARNINGS = all extra

### Output directory
OBJDIR = obj_bob51

### Output file format (hex, bin or both) and debugger type
OUTPUT	= hex
HEXFMT  = ihex
DEBUG	= dwarf-2


### Programs to build porject
CC      = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE    = avr-size
NM      = avr-nm


# Define all object files
COBJ      = $(CSRC:.c=.o) 
AOBJ      = $(ASRC:.S=.o)
COBJ      := $(addprefix $(OBJDIR)/,$(COBJ))
AOBJ      := $(addprefix $(OBJDIR)/,$(AOBJ))
PROJECT   := $(OBJDIR)/$(PROJECT)


# Flags for C files
CFLAGS += -std=$(CSTD)
CFLAGS += -g$(DEBUG)
CFLAGS += -mmcu=$(DEVICE)
CFLAGS += -O$(OPTIMIZE) -mcall-prologues
CFLAGS += $(addprefix -W,$(WARNINGS))
CFLAGS += $(addprefix -I,$(INCDIRS))
CFLAGS += $(addprefix -D,$(DEFS))
CFLAGS += -Wp,-M,-MP,-MT,$(OBJDIR)/$(*F).o,-MF,$(OBJDIR)/$(*F).d


# Assembler flags
ASFLAGS += $(addprefix -D,$(ADEFS)) -Wa,-gstabs,-g$(DEBUG)
ALL_ASFLAGS = -mmcu=$(DEVICE) -I. -x assembler-with-cpp $(ASFLAGS)


# Linker flags
LDFLAGS += -Wl,-Map,$(PROJECT).map


# Default target.
all: version build size

ifeq ($(OUTPUT),hex)
build: elf hex lst sym
hex: $(PROJECT).hex
else
ifeq ($(OUTPUT),bin)
build: elf bin lst sym
bin: $(PROJECT).bin
else
ifeq ($(OUTPUT),both)
build: elf hex bin lst sym
hex: $(PROJECT).hex
bin: $(PROJECT).bin
else
$(error "Invalid format: $(OUTPUT)")
endif
endif
endif

elf: $(PROJECT).elf
lst: $(PROJECT).lst 
sym: $(PROJECT).sym


# Display compiler version information.
version :
	@$(CC) --version

# Create final output file from ELF output file.
%.hex: %.elf
	@echo
	$(OBJCOPY) -j .text -j .data -j .eeprom -j .fuse -O $(HEXFMT) $< $@

%.bin: %.elf
	@echo
	$(OBJCOPY) -j .text -j .data -O binary $< $@

# Create extended listing file from ELF output file.
%.lst: %.elf
	@echo
	$(OBJDUMP) -h -S -C $< > $@

# Create a symbol table from ELF output file.
%.sym: %.elf
	@echo
	$(NM) -n $< > $@

# Display size of file.
size:
	@echo
	$(SIZE) -C --mcu=$(DEVICE) $(PROJECT).elf


# Link: create ELF output file from object files.
%.elf:  $(AOBJ) $(COBJ)
	@echo
	@echo Linking...
	$(CC) $(CFLAGS) $(AOBJ) $(COBJ) --output $@

# Compile: create object files from C source files. ARM or Thumb(-2)
$(COBJ) : $(OBJDIR)/%.o : %.c
	@echo
	@echo $< :
	$(CC) -c $(CFLAGS) $< -o $@

# Assemble: create object files from assembler source files. ARM or Thumb(-2)
$(AOBJ) : $(OBJDIR)/%.o : %.S
	@echo
	@echo $< :
	$(CC) -c $(ALL_ASFLAGS) $< -o $@


# Target: clean project.
clean:
	@echo
	rm -f -r $(OBJDIR) | exit 0


# Include the dependency files.
-include $(shell mkdir $(OBJDIR) 2>/dev/null) $(wildcard $(OBJDIR)/*.d)
все собирается
Спойлер
avr-gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
trd2812_m.S :
avr-gcc -c -mmcu=attiny85 -I. -x assembler-with-cpp -DF_CPU=16000000 -DMODE=1 -Wa,-gstabs,-gdwarf-2 trd2812_m.S -o obj_bob51/trd2812_m.o
Linking...
avr-gcc -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra -DF_CPU=16000000 -DMODE=1 -Wp,-M,-MP,-MT,obj_bob51/BOB51_test.o,-MF,obj_bob51/BOB51_test.d obj_bob51/trd2812_m.o obj_bob51/main.o --output obj_bob51/BOB51_test.elf
avr-objcopy -j .text -j .data -j .eeprom -j .fuse -O ihex obj_bob51/BOB51_test.elf obj_bob51/BOB51_test.hex
avr-objdump -h -S -C obj_bob51/BOB51_test.elf > obj_bob51/BOB51_test.lst
avr-nm -n obj_bob51/BOB51_test.elf > obj_bob51/BOB51_test.sym
avr-size -C --mcu=attiny85 obj_bob51/BOB51_test.elf
AVR Memory Usage
----------------
Device: attiny85
Program: 264 bytes (3.2% Full)
(.text + .data + .bootloader)
Data: 10 bytes (2.0% Full)
(.data + .bss + .noinit)
Сборка прошла успешно.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

ЖУТЬ...
:facepalm:
И для простенького фрагмента выписывать тот Makefile?...
Легче уж под чистым ассемблером несколько файликов настрочить.
8)
Надеюсь обратили внимание, что там точки входа с жестко заданными адресами (или с определенным пропуском)
даже если использовать вариант перемещаемого кода
slot1=slot0+16
А не линейное продолжение как в Вашем примере.
:wink:
на всякий случай оригинал, чтоб понятнее было в чем ловушка:
Спойлер

Код: Выделить всё

;
;
;         trd2812_m.txt
;
;         файл обработчика передачи массива
; из буфера вывода в линейку на основе WS2812B
; базовый МК из линейки АТМЕЛ при тактовой частоте
; от 16 Мегагерц ( 0,000000062 S)
;
; требуемые интервалы по даташиту WS2812B
;
;Data transfer time( TH+TL=1.25µs±600ns) 
;  T0H  0 code ,high voltage time  0.4us   ±150ns 
;  T1H  1 code ,high voltage time  0.8us   ±150ns 
;  T0L  0 code ,low voltage time   0.85us  ±150ns 
;  T1L  1 code ,low voltage time   0.45us  ±150ns 
;  RES  low voltage time  Above 50µs
; исходный уровень линии связи = 0
; данные передаются пакетами из трех байт на точку
; старшими битами вперед в последовательности
; соответствующей G - R - B цветам точки
; количество блоков должно соответствовать
; количеству точек в ленте
;
; реальные данные согласно тест - отладки дебаггером (версия1!)
; авр-студио 4.19 
;
; Data transfer time( TH+TL=1.38µs -10ns)
;  T0H  0 code ,high voltage time  0.44us  ±10ns 
;  T1H  1 code ,high voltage time  0.88us  ±10ns 
;  T0L  0 code ,low voltage time   0.94us  ±10ns 
;  T1L  1 code ,low voltage time   0.50us  ±10ns
;  RES  low voltage time  192,88uS (Above 50µs)
;
; длина прерывания с пакетом загрузки (x60*3) = 2175uS (0.002175)
; интервал между прерываниями (irq t/c0) = 0.004S (4000uS)
;
;             define datas
; .equ port_out = PORTB ; порт вывода (по усмотрению)
; .equ out_line = 0 ; линия вывода данных
; .equ bufout = SRAM_START ; начальный адрес буфера вывода
; .equ pixel = 60 ; количество точек в линейке/ленте
; .equ bufout_size = (pixel * 3) ; не может быть более объема ОЗУ - стек!!!


;таблица обьявленных имен - переназначение регистров РОН
;
; .def name = r31 ; ZH регистр (полный)
; .def name = r30 ; ZL регистр (полный)
; .def name = r29 ; YH регистр (полный)
; .def name = r28 ; YL регистр (полный)
; .def name = r27 ; XH регистр (полный) указатель текущей ячейки массива bufout
; .def name = r26 ; XL регистр (полный) указатель текущей ячейки массива bufout
; .def name = r25 ; регистр (полный) BH
; .def name = r24 ; регистр (полный) BL
; .def name = r23 ; регистр (полный)
; .def name = r22 ; регистр (полный)
; .def name = r21 ; регистр (полный)
; .def name = r20 ; регистр (полный)
; .def name = r19 ; регистр (полный)
; .def name = r18 ; регистр (полный)
; .def tmp1 = r17 ; регистр (полный) счетчик байт вывода
; .def tmp0 = r16 ; регистр (полный) буфер выводимого байта
; .def regn = r15 ; регистр (урезан)
; .def regn = r14 ; регистр (урезан)
; .def regn = r11 ; регистр (урезан)
; .def regn = r10 ; регистр (урезан)
; .def regn = r9 ; регистр (урезан)
; .def regn = r8 ; регистр (урезан)
; .def regn = r7 ; регистр (урезан)
; .def regn = r6 ; регистр (урезан)
; .def regn = r5 ; регистр (урезан)
; .def regn = r4 ; регистр (урезан)
; .def regn = r3 ; регистр (урезан)
; .def regn = r2 ; регистр (урезан)
; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!!
; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!!
;
;-----------------------------------------
;  .macro   ;; ввод и предобработка данных
;     
;     
;    .endmacro
; 
;-----------------------------------------
;
; определение буфера вывода в области данных
;  .dseg
;  .org bufout
;point0: .byte 3 ; g:r:b
;point1: .byte 3 ; g:r:b
;point2: .byte 3 ; g:r:b
;point3: .byte 3 ; g:r:b
;point4: .byte 3 ; g:r:b
;point5: .byte 3 ; g:r:b
;point6: .byte 3 ; g:r:b
;point7: .byte 3 ; g:r:b
;point8: .byte 3 ; g:r:b
;point9: .byte 3 ; g:r:b
;point10: .byte 3 ; g:r:b
;point11: .byte 3 ; g:r:b
;point12: .byte 3 ; g:r:b
;point13: .byte 3 ; g:r:b
;point14: .byte 3 ; g:r:b
;point15: .byte 3 ; g:r:b
;point16: .byte 3 ; g:r:b
;point17: .byte 3 ; g:r:b
;point18: .byte 3 ; g:r:b
;point19: .byte 3 ; g:r:b
;point20: .byte 3 ; g:r:b
;point21: .byte 3 ; g:r:b
;point22: .byte 3 ; g:r:b
;point23: .byte 3 ; g:r:b
;point24: .byte 3 ; g:r:b
;point25: .byte 3 ; g:r:b
;point26: .byte 3 ; g:r:b
;point27: .byte 3 ; g:r:b
;point28: .byte 3 ; g:r:b
;point29: .byte 3 ; g:r:b
;point30: .byte 3 ; g:r:b
;point31: .byte 3 ; g:r:b
;point32: .byte 3 ; g:r:b
;point33: .byte 3 ; g:r:b
;point34: .byte 3 ; g:r:b
;point35: .byte 3 ; g:r:b
;point36: .byte 3 ; g:r:b
;point37: .byte 3 ; g:r:b
;point38: .byte 3 ; g:r:b
;point39: .byte 3 ; g:r:b
;point40: .byte 3 ; g:r:b
;point41: .byte 3 ; g:r:b
;point42: .byte 3 ; g:r:b
;point43: .byte 3 ; g:r:b
;point44: .byte 3 ; g:r:b
;point45: .byte 3 ; g:r:b
;point46: .byte 3 ; g:r:b
;point47: .byte 3 ; g:r:b
;point48: .byte 3 ; g:r:b
;point49: .byte 3 ; g:r:b
;point50: .byte 3 ; g:r:b
;point51: .byte 3 ; g:r:b
;point52: .byte 3 ; g:r:b
;point53: .byte 3 ; g:r:b
;point54: .byte 3 ; g:r:b
;point55: .byte 3 ; g:r:b
;point56: .byte 3 ; g:r:b
;point57: .byte 3 ; g:r:b
;point58: .byte 3 ; g:r:b
;point59: .byte 3 ; g:r:b
;
;-----------------------------------------

  .cseg
		.org 0x0020 ; старовая позиция 0х0020 !!!
slot0:
     ; 6/14 (6-4=2 посему роль остатка выполняет CBI)
    cbi port_out,out_line ; 2 цикла
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    ret ; 4 цикла
    .org (slot0+16)
slot1:
    nop ; 13/7 (13-4=9)
    nop
    nop
    nop
    nop
    nop
    nop
    cbi port_out,out_line ; 2 цикла
    nop
    nop
    ret ; 4 цикла
    .org 0x0060
xslot0:
    ; 6/14 (6-5=1 посему роль остатка выполняет CBI с избытком в 1 nop)
    cbi port_out,out_line ; 2 цикла
    cbr zl,(1<<6) ; модификация указателя 1 цикл
    nop
    nop
    nop
    nop
    nop
    nop ; -2 цикла на ld tmp0,x+
    dec tmp1 ; 1 цикл
    brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
    rjmp trasstt ; 2 цикла
    .org (xslot0+16)
xslot1:
    nop ; 13/7 (13-5=8)
    cbr zl,(1<<6) ; модификация указателя 1 цикл
    nop
    nop
    nop
    nop
    nop
    cbi port_out,out_line ; 2 цикла
           ; -2 цикла на ld tmp0,x+
		dec tmp1 ; 1 цикл
    brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
    rjmp trasstt ; 2 цикла
;
ends_trd:
      pop tmp0
      pop tmp1
      pop xl
      pop xh
			pop zl
			pop zh ; восстановить рабочую область из стека
   ret
;-----------------------------------------
;
; предварительно:
; линия out_line настроена на вывод
; исходный уровень out_line =0
; указатель стека усатновлен на RAMEND
; массив данных (bufout:bufout_size) предварительно загружен
; флаг готовности массива данных установлен
;
mass_trm:
     push zh
     push zl
     push xh
     push xl
     push tmp1
     push tmp0 ; храним рабочую область в стеке
res_line:
     ldi tmp0,4
     ser tmp1
     cbi port_out,out_line
res_time:
     dec tmp1
     brne res_time
     dec tmp0
     brne res_time ; =>50uS time out
     ldi xh,high (bufout)
     ldi xl,low (bufout) ; загрузка начального адреса массива
        ; в указатель
     ldi tmp1,bufout_size
     ldiw z,slot0 ; адрес начала таблицы в указателе
;-----------------------------------------
trasstt:
    ld tmp0,x+ ; 2 цикла
slot_0:
      sbi port_out,out_line ; 2 цикла реально до установки 3 цикла
			bst tmp0,7 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла = 4 цикла от out_line=1
;----------------
slot_1:
      sbi port_out,out_line
      bst tmp0,6 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла
;----------------
slot_2:
      sbi port_out,out_line
      bst tmp0,5 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла
;----------------
slot_3:
      sbi port_out,out_line
      bst tmp0,4 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла
;----------------
slot_4:
      sbi port_out,out_line
      bst tmp0,3 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла
;----------------
slot_5:
      sbi port_out,out_line
      bst tmp0,2 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла
;----------------
slot_6:
      sbi port_out,out_line
      bst tmp0,1 ; 1 цикл
			bld zl,4 ; 1 цикл
			icall ; 3 цикла
;----------------
slot_7:
      sbi port_out,out_line
      sbr zl,(1<<6) ; модификация указателя под завершающий фрагмент
                  ; 1 цикл
      bst tmp0,0 ; 1 цикл
			bld zl,4 ; 1 цикл
			ijmp ; 3 цикла
;----------------
механизм обработки тайм-слотов основан на фиксированных адресах начала блоков формирования тайм-слотов.
slot0 = 0x0020
slot1 = slot0+16
xslot0 = 0x0060
xslot1 = xslot0+16
Можно конечно то и препроцессору поручить - но тогда переписываем определенные участки обработчика trasstt.
Иначе хоть и соберется - но работать не будет.
:beer:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

makefile скопирован из проекта Чена, легким движением настраивается - тип микроконтроллера и перечень исходников. Теперь он НАВСЕГДА - легко идет в другие проекты и даже под армы подправить можно.
Насчет жестких адресов (никогда не приходилось) - легко решаемо другими способами (имхо), даже любимыми вставками обходятся
https://github.com/lpodkalicki/blog/blo ... t_ws2812.c
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

BOB51 писал(а):на всякий случай оригинал, чтоб понятнее было в чем ловушка
я бегло посмотрел... и понял, в чем ловушка... или догадался. ваш код абсолютно непортируемый. вот это большое количество NOP-ов - это же задержки? чуть поменялась тактовая частота, и надо пересчитывать неизвестно как новое их количество...
жестко привязанные точки входа - это не достоинство, а недостаток: чуть изменился тип МК (например, взяли МК с более чем 64К памяти, чтобы Jmp/call стал четырехбайтным - все, сливай воду... и так далее.

ваш пример как раз хорош в качестве "страшилки" для начинающих программистов: будете дети вот так писать - никто вас на работу не возьмет, так и будете всю жизнь вручную pop-push по 30 раз писать... :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Ну так.. на то и ассемблер, чтоб подобные вопросы решать.
Насчет четырехбайтового вызова - то только при вызове самой программы - в теле используется косвенная адресация (IJMP)- а она НЕИЗМЕННА по времени.
Использование высчитываемых вручную задержек в принципе вполне обосновано в данном случае (фазовая манипуляция с помощью ногодрыга под протокол WS2812 при обеспечении долговременной стабильности комплектов слотов).
Вопрос же был в том - все ли варианты приемов "чистого ассемблера" легко переносятся в Си.
8)
Кроме прочего - алгоритм не только для АВРок... Мне надо иметь возможность однотипные приемы на разных семействах отрабатывать.
Посему и предпочитаю правило - не мешать чистый ассемблер с ЯВУ в варианте разнообразных ассемблерных вставок.
Другое дело приемы работы и алгоритмические решения, если таковое возможно (и за шо меня периодически поцарапывают).
:beer:
Последний раз редактировалось BOB51 Пт мар 20, 2020 21:13:20, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

BOB51 писал(а):все ли варианты приемов "чистого ассемблера" легко переносятся в Си
ну знаете... вопрос из разряда "где взять упряжь для кошки?" - зачем ВСЕ ВАРИАНТЫ переносить? в Си следует переносить лишь то, без чего принципиально невозможно решить задачу!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3815773#p3815773"]Ну так.. на то и ассемблер, чтоб подобные вопросы решать[/uquote]
Подобные вопросы в современном мире теперь принято аппаратно решать - см. AN1606:
Using the Configurable Logic Cell (CLC) to Interface a PIC16F1509 and WS2811 LED Driver
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

ARV
Вот и я про то же - не следует пихать в ЯВУ примитивы.
Для того соответствующие средства имеются.
В адуринке следует следовать концепту применения референса, а не пытаться "гибриды" лепить (по крайней мере на уровне "продвинутого пользователя").
А мне рекомендуют скрещивать адуринку с ассемблерными файлами.
Говорю же уже какой раз - в рамках IDE руководствуемся возможностями, предлагаемыми референсом.
А ежли хотим повыделываться - берем нашу DIP микросборку (ту же нанку) и программируем в рамках соответствующего компилятора (хоть Си, хоть ассемблер) - но то уже не ардуино, а конструкция на базе соответствующего МК.
8)

Насчет аппаратных...
Там где много аппаратных модулей понатыкано есть побочный эфект - надо детально изучать начинку на предмет начального состояния МК.
Дабы изолировать неиспользуемые узлы.
А это ужшшш...
Весьма муторное занятие (да и накладно).
Обычно ограничиваемся определенным набором проработанных кристаллов в каждом семействе.
8)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

"ту же нанку" - там аппаратный SPI и UART, их народ уже давно приспособил для управления WS-ами. Теория:
http://www.getchip.net/posts/119-umnye- ... neopixels/
И не надо никаких ассемблеров с жесткими адресами
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Снова мимо!
8)
А я то думал, найдется таки умная усато-полосатая сущность и покажет решение средствами препроцессора.
Я - то ведь всего лишь "продвинутый пользователь-любитель".
:wink:
В прожке позиционно-программный селектор (аналогия табличного дешифратора для скоростного двоично-десятичного преобразования в диапазоне 0-99 - классического приема при работе под ассемблером).
Это касательно АВРок более актуально - анализ и выдача значения с одинаковым интервалом (оптимизация по скорости и равным интервалам для определения как 0 так и 1).
Для получения ограниченно перемещаемого кода там всего-то надо жестко обусловить начальный адрес подпрограммы.
У стартового адреса допустимы любые из нижеприведенных значений:
0хnn00
0xnn20
0xnn40
0xnn60
:tea:

УПСЬ...!!
Вот это симпатяшки!!!
NCD2100.pdf
(342.02 КБ) 147 скачиваний
NCD2400M.pdf
(404.27 КБ) 147 скачиваний
:hunger: :hunger: :hunger:
жаль только снова "вне досягаемости"...
:(
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3815928#p3815928"]покажет решение средствами препроцессора[/uquote]
тут скорее надо дописать "свои" фиксированые секции в линкер скрипте:

Код: Выделить всё

MEMORY
{
  text      (rx)   : ORIGIN = 0, LENGTH = 128K
  data      (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0
  eeprom    (rw!x) : ORIGIN = 0x810000, LENGTH = 64K
  fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K
  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K
  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K
} 
лично я экспериментировать не буду - ибо писал эта и подобные задачи легко решаются другим путем или програмным или аппаратным. Нет такой задачи, где понадобились бы фиксированые адреса (имхо) - а если есть просьба, описать словами такую задачу с обоснованием необходимости. По исходнику трудно понять что требовалось - если зажигать светодиоды, то была ссылка как это делать без фиксированых адресов.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

А при помощи препроцессора компилятора ассемблера никак?
:roll:
Печалька однако...
Ибо писать скрипты линкера под каждый файл, коих в многофайловом проекте может быть энное количество, весьма муторно...
А в варианте моего "слэнга" практически от такой заморочки я избавлен.
8)
Касательно "других решений" - естественно оные имеются, однако вопрос о некорректности применения "чисто ассемблерных файлов", не учитывающих специфику работы компилятора Си, в проектах заточенных под Си похоже закрыт.
:wink:
Пример, который я привёл выше - всего лишь одна из разновидностей классического решения при работе под " чистым ассемблером". И таких приёмов, некорректных по отношению к "чистому Си" достаточно много встречается.
Просто не стоит "впадать в крайности" - у каждого из компиляторов свои особенности, которые надо учитывать при работе.
:beer:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3815964#p3815964"]Ибо писать скрипты линкера под каждый файл, коих в многофайловом проекте может быть энное количество, весьма муторно...[/uquote]
ОДИН там скрипт на весь проект, хоть 100500-файловый. И все совсем не муторно, если почитать, тут метод тыка не проходит
https://www.opennet.ru/docs/RUS/gnu_ld/gnuld-3.html
Скрипт может содержать максимум одну команду MEMORY, тем не менее Вы можете определить любое необходимое Вам число блоков памяти внутри этой команды.
хотелось бы увидеть
одна из разновидностей классического решения при работе под " чистым ассемблером"
других авторов. Как-то минула меня чаша сия.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Да любых авторов - зависит от самого проекта и рациональности применения.
Просто Вы, почуствовав сложности работы с "чистым ассемблером", пораньше на Си соскочили.
8)
Писанина скриптов и маке-файлов должна быть осознанно - самостоятельной.
А коль такового уровня нету - стараемся в дебри не лазить без особой необходимости.
Существует достаточно много методов, позволяющих обойти подобные осложнения.
:sleep:
Ответить

Вернуться в «Разные вопросы по МК»