Импровизации не работают.
Ассемблер (ASM) для AVR в вопросах и ответах
Для прерывания нужен стек.
Импровизации не работают.
Импровизации не работают.
- Реклама
Мндя... опять "прокололся"... с R15...
Отсутствие заброски данных адреса возврата в "тест-стек"...
Возможно потому, что регистровый файл не совсем "полноценный" в отношении исполнения функций оперативной памяти.
Да и сами "половинки" не совсем подобны - неохота "полноценные" (r16-r31) на такие "извраты" использовать...
В отличии от той же mcs51 у АВРок это регистр-акумуляторы, завязанные на АЛУ...
Не исключены некоторые ограничения на работу указателя SP...
Может еще где прописанные в спецнастройках (тогда можно и "похоамить нестандартно"),а может - гораздо неприятнее - обусловленные аппаратно...
Тогда надежд на "фокусы" не предвидится...
Надо как-нить чиркнуть тест...

Отсутствие заброски данных адреса возврата в "тест-стек"...
Возможно потому, что регистровый файл не совсем "полноценный" в отношении исполнения функций оперативной памяти.
Да и сами "половинки" не совсем подобны - неохота "полноценные" (r16-r31) на такие "извраты" использовать...
В отличии от той же mcs51 у АВРок это регистр-акумуляторы, завязанные на АЛУ...
Не исключены некоторые ограничения на работу указателя SP...
Может еще где прописанные в спецнастройках (тогда можно и "похоамить нестандартно"),а может - гораздо неприятнее - обусловленные аппаратно...
Тогда надежд на "фокусы" не предвидится...
Надо как-нить чиркнуть тест...
Прямое указание в DS на mega48 хороший тормоз. Наверно, есть внутренние цепи защиты. Просто интересно попробовать, хотя я и не сторонник такого.The Stack Pointer must be set to point above 0x0100, preferably RAMEND.
Результаты натурных испытаний (в железе).
В качестве стека использовалась область ввода-вывода Timer/Counter1.
Стек настроен на адрес $8С.
Команды pop и push отрабатывает нормально,
rcall и ret - переходит на рестарт (похоже читает 0).
В качестве стека использовалась область ввода-вывода Timer/Counter1.
Стек настроен на адрес $8С.
Команды pop и push отрабатывает нормально,
rcall и ret - переходит на рестарт (похоже читает 0).
Спойлер
Код: Выделить всё
.INCLUDE "tn2313def.inc"
;.include "m48def.inc"
.cseg
.org 0
RJMP RESET
;.org INT0addr ; External Interrupt Request 0
.org 5
T1_OVER:
PUSH R0
IN R0,SREG
PUSH R0
LDI R16,0xCC
MOV R0,R16
NOP
POP R0
OUT SREG,R0
POP R0
OUT PINB,R0
RETI
;*********************************************
RESET:
LDI R16,0x6F
; LDI R16,15
OUT SPL,R16
CLR R0
DEC R0
OUT DDRB,R0
OUT PORTB,R0
LDI R16,1<<SE
OUT MCUCR,R16
; OUT SMCR,R16
LDI R16,1<<TOIE1
OUT TIMSK,R16
OUT TIFR,R16
LDI R16,2
OUT TCCR1B,R16
; LDI R16,1<<ISC01
; STS EICRA,R16
; LDI R22,1<<INT0
; OUT EIMSK,R22
; OUT EIFR,R22
SEI
WAIT:
SLEEP
NOP
RJMP WAIT
.EXIT- Реклама
Мндя...
Доступ к регистрам r0-r31 как к ОЗУ для LD/ST является нормой (как и для области портов ввода/вывода), а вот со стороны стековых операций там работы нету - видимо стоит какое-то аппаратное ограничение. Хотя... Изначально заявлено как "отображаемое на память" что не то же самое по сравнению что "полноценное ОЗУ"...
В каждом *def.inc файле есть дополнительная строчка с ограничением
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60 ( 0x60 или какой другой - в зависимости от МК)
причем оговорено, что ее значения "лучше не трогать".

Доступ к регистрам r0-r31 как к ОЗУ для LD/ST является нормой (как и для области портов ввода/вывода), а вот со стороны стековых операций там работы нету - видимо стоит какое-то аппаратное ограничение. Хотя... Изначально заявлено как "отображаемое на память" что не то же самое по сравнению что "полноценное ОЗУ"...
В каждом *def.inc файле есть дополнительная строчка с ограничением
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60 ( 0x60 или какой другой - в зависимости от МК)
причем оговорено, что ее значения "лучше не трогать".
Как показала практика, ничего из этого невозможно.
А "#pragma AVRPART MEMORY INT_SRAM START_ADDR" не знаю на что влияет.
А "#pragma AVRPART MEMORY INT_SRAM START_ADDR" не знаю на что влияет.
В каком смысле НИЧЕГО?trofim2 писал(а):Как показала практика, ничего из этого невозможно.
...
косвенное обращение по адресу регистра в указателях Z,X и Y выполняться будет также, как и обращение к ячейке ОЗУ
LD Rn,Ri/ST Ri,Rn ; Rn=r0-r31, Ri=Z,X,Y.
А вот установка указателя стека на область ниже, чем указано в #pragma AVRPART MEMORY INT_SRAM START_ADDR
вероятнее всего приведет к потере функционала POP/PUSH, CALL/RET и аппаратных прерываний - тех команд/операций, что завязаны на указатель стека (SPH:SPL).
Кстати... Дебаггер у 4.19 при установке SPH:SPL (тинька 13) на область РОН команды CALL/RET отрабатывает но без наличия данных в регистрах (нет индикации соответствующих изменений - адрес возврата "где-то в дебрях" дебаггера).
Самое интересное, что Push/Pop тоже работает, (правда проверял с одной парой Push/Pop), но не нашел, куда складывает.
Указатель стека настраивал выборочно в диапазоне от 15 до $AF, даже на адреса, не занятые I/O.
Указатель стека настраивал выборочно в диапазоне от 15 до $AF, даже на адреса, не занятые I/O.
Это скорее "ошибка среды" прикрывающая от "синего экрана" сам ПК.
Там же явно выбрасывается предупреждение:


Там же явно выбрасывается предупреждение:
господа, а вот оно вам нужно - ковыряние в неприличном? ну для какой цели эти "исследования"? неужели вы всерьез собираетесь использовать недокументированные возможности, которые по определению противоречат здравому смыслу, а именно использование области РОН под стек?! лучше посоветовать пожелавшему такое сделать лизнуть провода, торчащие из розетки, чем так писать программы...
очевидно же, что решение на 100500% не в нескольких байтах ОЗУ под стек кроется! проблема ведь, скорее всего, в неправильном алгоритме, ошибках в программе, на худой конец, в неправильно выбранном МК... но никак не в увеличении стека за счет РОН!trofim2 писал(а):Памяти не хватает
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну праздное любопытство никто не отменял.ARV писал(а):ну для какой цели эти "исследования"?
Я думаю никто тут и не собирался, кроме trofim2.ARV писал(а):неужели вы всерьез собираетесь использовать недокументированные возможности
Мне тоже не понятно. Даже если предположить, что если действительно не хватает нескольких байт, то почему нельзя оставить SP указывать туда куда следует, а в РОН хранить данные не влезшие в ОЗУ?ARV писал(а):очевидно же, что решение на 100500% не в нескольких байтах ОЗУ под стек кроется!
Пытливый расейский ум...
"Пробьет он крышку люка или нет? " ©
Пробьет! Без прерываний работает.
Недокументированного ничего не использую.
Недокументированного ничего не использую.
вы хоть расскажите, что за задачу решаете и на каком МК, что таким способом боретесь с нехваткой стека... а то догадостности не хватает додуматься самому, зачем это нужно...trofim2 писал(а):Без прерываний работает.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Вообще-то надо...ARV писал(а):господа, а вот оно вам нужно - ковыряние в неприличном? ну для какой цели эти "исследования"? неужели вы всерьез собираетесь использовать недокументированные возможности, которые по определению противоречат здравому смыслу, а именно использование области РОН под стек?! лучше посоветовать пожелавшему такое сделать лизнуть провода, торчащие из розетки, чем так писать программы...
...
Ибо
1. чтоб не было в дальнейшем попыток использовать некорректные комбинации команд/адресного пространства
2. несмотря на имеющиеся в системе команд MOV rd,rr и MOVW rd,rr при преимущественной обработке массивов с размещением данных в ОЗУ имеется также интерес к обработке коротких массивов с размещением данных в регистрах РОН (до 16 байт) при косвенном указателе в Z/X/Y.
Это при компиляции, а мой скрин касается работы дебаггераtrofim2 писал(а):У меня ошибок не выдает
вот это ваше "ибо" очень напоминает вырезание аденоидов через задний проход...BOB51 писал(а):Вообще-то надо...
Ибо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну уж "когда КОТУ делать нечего..." можно и такими вопросами поинтересоваться.
Мало ли чего и когда потребуется...

Мало ли чего и когда потребуется...
Действительно работает в железе только при однократном PUSH/POP!!!trofim2 писал(а):Самое интересное, что Push/Pop тоже работает, (правда проверял с одной парой Push/Pop), но не нашел, куда складывает.
Спойлер
Код: Выделить всё
.INCLUDE "tn2313def.inc"
.cseg
.org 0
RESET:
LDI R16,0x05
OUT SPL,R16
CLR R0
DEC R0
IN R14,SREG
MOV R4,R14
PUSH R14
; LDI R17,0x44
; MOV R7,R17
; PUSH R17
CLR R14
; CLR R17
OUT DDRB,R0
OUT PORTB,R0
LDI R16,1
OUT TCCR1B,R16
TST R16
; POP R17
POP R14
OUT SREG,R14
CP R14,R4
; CP R17,R7
BREQ WAIT
RJMP PC
WAIT:
IN R16,TIFR
SBRS R16,TOV1
RJMP WAIT
OUT TIFR,R16
OUT PINB,R0
RJMP WAIT
.EXIT




