реклама на сайте
подробности

 
 
> С и asm-вставки, Локальные переменные
Xeon
сообщение Mar 30 2012, 06:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Всем доброго времени суток!!! Использую AVR Stidio 5. Написал программу и теперь надо её оптимизировать... некоторые расчёты уж компилятор сделал больно длинные (в смысле по количеству команд), хотя можно намного проще... Как мне известно локальные переменные обычно хранятся либо в стеке либо в регистрах... Вопрос следующий: как назначить переменной конкретный регистр или как узнать в каком регистре находится переменная, чтоб в дальнейшем иметь к ней доступ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xeon
сообщение Apr 6 2012, 08:46
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Возник следующий вопрос - как в на асме прочитать байтик из памяти программ? Покопавшись в просторах интернета нашёл следующее:
CODE

ldi ZH, hi8(pm(F64_cos))
ldi ZL, lo8(pm(F64_cos))
lpm r18, Z


F64_cos - таблица значений косинуса. Но чёт это не работает. Код в AVR stidio 4 помнется выглядит примерно так:
CODE

ldi ZH, high(F64_cos*2)
ldi ZL, low(F64_cos*2)
lpm r18, Z

Т.е. в AVR stidio 4 нужно делать сдвиг в лево, что равно умножению на 2. Почитав доки на avr-gcc нашёл что макрос pm надо использовать если нужен доступ к памяти программ, но он равносилен деления на 2 или, что тоже самое, сдвигу на 1 в право. На этом моменте у меня сразу возникло не понимание принципа доступа к памяти программ на ассемблере в avr-gcc.
Может кто в курсе как делается правильно?

Вот весь код на асме, который написал:
CODE

#include "../Headers/asm_ftransform.h"
#include <avr/io.h>

.extern FsummRe // == r9, r8, r7, r6
.extern FsummIM // == r13, r12, r11, r10
.extern CurVal // == r5
.extern Flags
.extern FsinTable
.extern FcosTable
.extern F64_cos

.global DMA_CH0_vect
DMA_CH0_vect:

push r0
push r1
push ZL
push ZH
push r17
push r18
push r19

/* load Sin and Cos */
// calc offset
ldi r17, 0x35
//mul r5, r17 // r1:r0 - offset

// sin addres
ldi ZH, hi8(pm(F64_cos))
ldi ZL, lo8(pm(F64_cos))
//add r16, r0
//adc r17, r1
lpm r18, Z
sts _SFR_IO_ADDR(USARTE0_DATA), r18

// DMA.CH0.CTRLB |= 48; // clear interrupt flags
ldi r26, 0x30
sts _SFR_IO_ADDR(DMA_CH0_CTRLB), r26
// stop ADC
clr r17
sts _SFR_IO_ADDR(ADCA_CTRLA), r17

ldi r17, 2
sts Flags, r17

pop r19
pop r18
pop r17
pop ZH
pop ZL
pop r1
pop r0

reti


Нашел в чём проблема, мой косяк, F64_cos была в ОЗУ. И собственно чтоб прочитать из памяти программ нужно:
ldi ZH, hi8(F64_cos)
ldi ZL, lo8(F64_cos)
lpm r18, Z
без всяких макросов pm().
И новый вопрос: я правильно понимаю, макрос pm() используется для вызова подпрограмм, например:
ldi ZH, hi8(pm(s_func))
ldi ZL, lo8(pm(s_func))
call Z
так?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Xeon   С и asm-вставки   Mar 30 2012, 06:05
- - Dog Pawlowa   Цитата(Xeon @ Mar 30 2012, 09:05) Всем до...   Mar 30 2012, 06:23
- - Сергей Борщ   QUOTE (Xeon @ Mar 30 2012, 09:05) Вопрос ...   Mar 30 2012, 06:32
|- - Xeon   Нашел немного инфы по asm-вставкам здесь (может ко...   Mar 30 2012, 08:13
- - Xeon   Использую оптимизацию -Оs...   Mar 30 2012, 06:35
- - MaxiMuz   Чем отличается обьявление: Кодregister uint16_t Tm...   Mar 30 2012, 07:24
- - XVR   Судя по листигну компилятор не в курсе, что сущест...   Mar 30 2012, 08:35
- - Xeon   Тип процессора правильный, точно... Использую XMeg...   Mar 30 2012, 09:02
- - XVR   Вообще код странный. Там ни одного перехода нет, и...   Mar 30 2012, 09:16
- - Сергей Борщ   QUOTE (MaxiMuz @ Mar 30 2012, 10:24) Чем ...   Mar 30 2012, 09:22
- - MaxiMuz   если всеже будет обьявлять регистровые переменные ...   Mar 30 2012, 12:17
|- - Сергей Борщ   QUOTE (MaxiMuz @ Mar 30 2012, 15:17) пиши...   Mar 30 2012, 14:17
|- - MaxiMuz   Цитата(Сергей Борщ @ Mar 30 2012, 17:17) ...   Mar 31 2012, 07:12
- - Xeon   Привожу исходники: Немного опишу: первоночальная ...   Apr 1 2012, 05:59
- - XVR   А вы все таки откомпилируйте реальный код и посмот...   Apr 1 2012, 08:46
- - Xeon   Попробую... Да одна такая таблица получается) это ...   Apr 1 2012, 17:58
- - alexeyv   Перед тем как оптимизировать на асме, разберитесь ...   Apr 2 2012, 04:56
|- - Xeon   Цитата(alexeyv @ Apr 2 2012, 07:56) Спа...   Apr 2 2012, 07:46
|- - XVR   Цитата(Xeon @ Apr 2 2012, 11:46) Спасибо...   Apr 2 2012, 08:30
|- - alexeyv   Цитата(XVR @ Apr 2 2012, 14:30) На достат...   Apr 2 2012, 09:04
|- - =GM=   Цитата(XVR @ Apr 2 2012, 07:30) ... у вас...   Apr 2 2012, 09:19
- - alexeyv   1. pm не используется для вызова подпрограм. Для в...   Apr 9 2012, 03:56
- - fox2trot   Вообще то, при постановке вопроса следовало бы уто...   Apr 12 2012, 16:40


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 20:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016