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

 
 
> Чтение состояния порта в массив, inline assembler gcc stm32f4xx
artkam
сообщение Jun 27 2016, 11:20
Сообщение #1


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

Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479



Здравствуйте, уважаемые товарищи!
В си-коде, для проверки состояния порта используется вставка на ассемблере, приведенная ниже.
Но где-то что-то идет не так задумано, и в буфере, что передается в функцию по ссылке, ничего кроме нулей не обнаруживается.
Возможно, я что-то недопонимаю и делаю не так, как надо.
Хотелось бы услышать идеи, с помощью которых можно было бы починить код...

CODE

void f(unsigned int* peg)
{
__ASM volatile
(

".equ PERIPH_BASE, 0x40000000 \n \t"
".equ AHB1PERIPH_BASE, 0x00020000 \n \t"
".equ GPIOD_BASE, 0x0C00 \n \t"
".equ GPIOB_BASE, 0x0400 \n \t"
".equ GPIO_IDR, 0x10 \n \t"
".equ GPIO_BSRRL, 0x18 \n \t"
".equ GPIO_BSRRH, 0x1A \n \t"

".equ GPIO_BSRR_BS_5, 0x20 \n \t"


"LDR r0, =(GPIO_BSRR_BS_5) \n \t"
"LDR r1, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOB_BASE + GPIO_BSRRH) \n\t"
"LDR r2, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOB_BASE + GPIO_BSRRL) \n\t"
"LDR r3, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOD_BASE + GPIO_IDR) \n\t"

"LDR r4, [%[data_ptr], 0x00] \n \t"

//0
"STRH r0, [r2, 0x00] \n \t" // set clock
"LDR r5, [r3, 0x00] \n \t" // считываем GPIOD->IDR
"STRH r0, [r1, 0x00] \n \t" // reset clock
"STR r5, [r4, 0] \n \t" // записываем то, что было в GPIOD->IDR, в память со смещением

//1
"STRH r0, [r2, 0x00] \n \t"
"LDR r5, [r3, 0x00] \n \t"
"STRH r0, [r1, 0x00] \n \t"
"STR r5, [r4, 4] \n \t"

//2
"STRH r0, [r2, 0x00] \n \t"
"LDR r5, [r3, 0x00] \n \t"
"STRH r0, [r1, 0x00] \n \t"
"STR r5, [r4, 8] \n \t"

/* Множество раз повторяется. */

//681
"STRH r0, [r2, 0x00] \n \t"
"LDR r5, [r3, 0x00] \n \t"
"STRH r0, [r1, 0x00] \n \t"
"STR r5, [r4, #2724] \n \t"

:
: [data_ptr] "r" (peg)
:
);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
artkam
сообщение Jun 28 2016, 05:36
Сообщение #2


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

Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479



Поэтому и обратился на форум, чтоб направили в правильном направлении, разъяснили основные моменты...

В итоге, сделал вот так, в какой-то степени работает...

CODE

void ClockAsm(unsigned int *peg)
{
__ASM volatile
(

//"LDR r3, 0x4002041A \n \t"
//"LDR r1, 0x40020418 \n \t"

//"LDR r2, 0x40020C10 \n \t"

//"MOV r3, 0x00000020 \n \t"
".equ PERIPH_BASE, 0x40000000 \n \t"
".equ AHB1PERIPH_BASE, 0x00020000 \n \t"
".equ GPIOD_BASE, 0x0C00 \n \t"
".equ GPIOB_BASE, 0x0400 \n \t"
".equ GPIO_IDR, 0x10 \n \t"
".equ GPIO_BSRRL, 0x18 \n \t"
".equ GPIO_BSRRH, 0x1A \n \t"

".equ GPIO_BSRR_BS_5, 0x20 \n \t"

"LDR r3, [%[data_ptr], 0x00] \n \t"

"LDR v1, =(GPIO_BSRR_BS_5) \n \t"
"LDR v2, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOB_BASE + GPIO_BSRRH) \n \t"
"LDR v3, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOB_BASE + GPIO_BSRRL) \n\t"
"LDR v6, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOD_BASE + GPIO_IDR) \n\t"

//0
"STRH v1, [v3, 0x00] \n \t"
"LDR v5, [v6, 0x00] \n \t"
"STRH v1, [v2, 0x00] \n \t"
"STR v5, [r3, 0] \n \t"

//1
"STRH v1, [v3, 0x00] \n \t"
"LDR v5, [v6, 0x00] \n \t"
"STRH v1, [v2, 0x00] \n \t"
"STR v5, [r3, 4] \n \t"

...

//338
"STRH v1, [v3, 0x00] \n \t"
"LDR v5, [v6, 0x00] \n \t"
"STRH v1, [v2, 0x00] \n \t"
"STR v5, [r3, #1352] \n \t"
:
: [data_ptr] "r" (&peg)
: "r3", "v1", "v2", "v3", "v5", "v6", "memory"
);
}


Теперь, следующая проблема: мне необходима выборка длиной 600 семплов, а, при увеличении шагов до 339, например, компилятор ругается: "Error: offset out of range"...
Подскажите, возможно есть еще какая-то очевидная ошибка?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 28 2016, 06:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(artkam @ Jun 28 2016, 11:36) *
Поэтому и обратился на форум, чтоб направили в правильном направлении, разъяснили основные моменты...

Правильное направление: пишите на си.
Асм уместен только там, где реально нужен (очень редко!). И то - очень не советую использовать инлайн-асм. Лучше отдельный асм-файл.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:08
Рейтинг@Mail.ru


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