drokhorm
0 / 0 / 0
Регистрация: 19.07.2011
Сообщений: 5
|
|
1 | |
AVR Assembler. Метки и macro expansion23.07.2011, 14:20. Просмотров 2966. Ответов 4
Метки нет Все метки)
(
Пытаюсь написать ряд макросов для работы с циклическими буферами и запнулся об macro expansion. При разворачивании вот такого макроса (для определения буфера):
Код
.macro BUFFER .equ @0_MAX = @1 @0_BUF: .db @0_MAX @0_PTR_S: .db 1 @0_PTR_E: .db 1 @0_FULL: .db 1 .endmacro Код
DSEG UIN_BUF@BUFFER@895 00000060 DSEG UIN_PTR_S@BUFFER@895 00000061 DSEG UIN_PTR_E@BUFFER@895 00000062 DSEG UIN_FULL@BUFFER@895 00000063
0
|
|
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
23.07.2011, 14:20 |
Ответы с готовыми решениями:
4
IAR Assembler MACRO definition AVR assembler Avr assembler Assembler AVR RISC AVR Studio 4 assembler |
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
|
|
24.07.2011, 00:25 | 2 |
.db работает только во FLASH.
0
|
drokhorm
0 / 0 / 0
Регистрация: 19.07.2011
Сообщений: 5
|
|
24.07.2011, 12:00 | 3 |
Спасибо. Но это не отвечает на основной вопрос. Пришлось обойтись без такой схемы.
0
|
Bottti
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
|
|
24.07.2011, 14:17 | 4 |
так после директивы .db идет не количество зарезервированных байтов, а сами байты.
то есть IN_BUF: .db IN_MAX - запишет по адресу IN_BUF байт IN_MAX, а не выделит IN_MAX байтов под буфер. Я так понял предполагалось именно выделение I_MAX байтов.
0
|
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
|
|
24.07.2011, 17:17 | 5 |
Тут объявим переменные и структуру буфера.
Код
.dseg vQueue_WrRd: .byte 1 ;CNT_WR:CNT_RD vUART_Queue: .byte 4*8 ; 4 байта длина записи(типа структура). 8 кол-во записей. ;struct QueueRecord .equ QueueRecord = 0 .equ slpBufL = 0 .equ slpBufH = 1 .equ sCnt = 2 .equ sFlag = 3 ;ends QueueRecord Код
.cseg ;################################## FUNCTION ################################### ;Name of function: ; fToQueue ;Input: ; Y - addr of buffer (string) ; AL - Length of buffer ; t - flag; t = "1" Buffer in Ftosh; t = "0" Buffer in ROM ;Return: ; ZF = 1 Overflow ;Dessription: ; ;Example ; LDW Y,(test19<<1) ;addr of string ; ldi AL, 9 ;Length ; set ;from Ftosh ; rcall fToQueue ; PROC fToQueue push AL ;overflow test lds AL, vQueue_WrRd subi AL, -0x10 omdi AL, 0b01111111 mov AH, AL swap AH eor AH, AL brne fToQueue_NoOverflow pop AL ;Overflow sez ;z = 1 Overflow ret fToQueue_NoOverflow: sts vQueue_WrRd, AL swap AL movw ZH:ZL, YH:YL rcall fGetlpQueue std y+slpBufL, ZL std y+slpBufH, ZH pop AL std y+sCnt, AL clr AL bld AL, 0 std y+sFlag, AL clz ret ENDP fToQueue
0
|
24.07.2011, 17:17 | |
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
24.07.2011, 17:17 |
Программа для ATmega16 (AVR Assembler) LPM не работает в AVR Studio 4.19 (Assembler 2) AVR Assembler. Найти маску N в массиве тетрад Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |