С трудом вспоминал AVR ассемблер, но в итоге:
Несложное задание для STM8:
Исходные условия: Три восьмиразрядные переменные A, B и C разместить в SRAM.
Задание: Как можно быстрее:
1. Установить весь PORTA на выход;
2. Установить бит 0 в PORTA;
3. Проинициализировать переменную A = 1;
4. Проинициализировать переменную B = 2;
5. Уйти в подпрограмму;
В подпрограмме:
6. Сложить переменные A и B, результат поместить в C;
7. Вернуться из подпрограммы.
8. Если установлен бит 0 в PORTA, сбросить его.
Исходный код для AVR:
Код:
|
************************************************** *************************
.include "m16def.inc"
.equ A= $70 ;Адрес переменной A в SRAM.
.equ B= $71 ;Адрес переменной B в SRAM.
.equ C= $72 ;Адрес переменной C в SRAM.
.def rA= r16 ;РОН для переменной A.
.def rB= r17 ;РОН для переменной B.
.def rC= r18 ;РОН для переменной C.
;_________________________________________________ ____________________________
.org 0 ;Вектор сброса
rjmp reset
;_________________________________________________ ____________________________
reset: ;Инициализация програмного стека.
ldi RA,low(ramend)
out spl,rA
ldi RA,high(ramend)
out sph,rA
ldi rA,$ff ;НАЧАЛО ОТСЧЁТА ЦИКЛОВ
out ddra,rA ;PortA на выход.
sbi porta,0 ;Установить PortA.0
ldi rA,$01
sts A,rA ;Переменная A=1;
ldi rA,$02
sts B,rA ;Переменная B=2;
rcall SubRoutine ;Уход в подпрограмму.
sbic pina,0 ;Пропустить следующую команду, если PortA.0 сброшен.
cbi porta,0 ;Сбросить PortA.0 - КОНЕЦ ОТСЧЁТА ЦИКЛОВ
SubRoutine: lds rA,A ;Загрузить переменную A в РОН rA.
lds rB,B ;Загрузить переменную B в РОН rB.
add rA,rB ;Сложить rB+rA, результат в rA.
sts C,rA ;Сохранить результат сложения в переменную С в SRAM.
ret ;Возврат из подпрограммы. |
ATmega16 справился за 26 тактов.
Начало замера - PortA физически установился на выход (сброс счётчика циклов в ноль перед командой out ddra,rA).
Окончание - PortA.0 сбросился в единицу.
Применены инструкции непосредственного сброcа, установки и проверки бита в порту, которых у STM8 возможно нет. Тогда это будет не очень честно. Просьба повторить для STM8.
Можно тоже самое или что-то посложнее написать на Си для IAR