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

 
 
> Вопросы по STM32f10x на Keil, Ошибка с PUSH, загрузка массивов, теневые регистры.
Omnicake
сообщение Apr 30 2014, 02:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002



Здравствуйте, хотелось узнать несколько подробностей по поводу работы с микропроцессором STM32f10x в Keil uVision 5:

1) На процессорах C55x на ассемблере командами:

AMOV #Label, xar0
MOV dbl(*ar0), xar0
MOV dbl(*ar0), xar0
MOV *ar0, ac0


Метка Label была указателем на массив, заданный во внешнем файле C, первые две команды mov выгружали каким-то образом сначала адрес массива, потом его структуру, а потом отдельный элемент.
Хотелось сделать аналог такой же выгрузки на STM32F10x но не нашел в Instruction Set аналога обозначения *ar0 – то есть выгрузки значения из адреса r0 (заменять на LDR?), а также что такое dbl и как зовется его аналог в Cortex-M3 командах.

2) Знаю, что в Cortex-M3 существуют так называемые "теневые регистры", которые, как я понял, включаются на момент прерывания. Как обозначаются эти регистры при работе с ними, и сохраняется ли их значения после выхода из прерывания?

Заранее спасибо.

Сообщение отредактировал Omnicake - Apr 30 2014, 04:22
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Omnicake
сообщение May 1 2014, 03:03
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002



В дизассемблере происходят странные вещи:
SUB sp,sp,#0x18
MOVS r2,#0x14
LDR r1,|L0.24|
ADD r0,sp,#4
BL __aeabi_memcpy4
LDR r1,|L0.28|
LDR r0,[sp,#0xc]
STR r0,[r1,#0] ; x
По метке |L0.28| находится DCD x
По метке |L0.24| находится DCD ||.constdata||

__aeabi_memcpy4:
PUSH {r4,lr}
SUBS r2,r2,#0x20
BCC.W 0x080001FA
LDM r1!,{r3-r4,r12,lr}
SUBS r2,r2,#0x20
STM r0!,{r3-r4,r12,lr}
LDM r1!,{r3-r4,r12,lr}
STM r0!,{r3-r4,r12,lr}
BCS.W 0x080001E4
LSLS r12,r2,#28
ITT CS
LDM r1!,{r3-r4,r12,lr}
STM r0!,{r3-r4,r12,lr}
ITT MI
LDM r1!,{r3-r4}
STM r0!,{r3-r4}
POP {r4,lr}
LSLS r12,r2,#30
ITT CS
LDR r3,[r1],#0x04
STR r3,[r0],#0x04
IT EQ
BX lr

Это реакция на команду:
int32_t array[5]={1,2,3,4,5};
x=array[2];
Я вообще не понимаю логику того, что там происходит и что такое __aeabi_memcpy4.

Я опишу еще раз подробнее то, что мне нужно сделать, возможно я просто неправильно задал вопрос:
У меня есть файл task1.c содержащий простейшую команду и описание des1 ddd1={1,2,3}; где des1 ddd1 берется из header файла descriptors.h и выглядит так:
typedef struct {
int Status;
int CurrentTic;
int NumberTic;
int Command;
long CurrentPC;
long StartPC;
long CurrentSP;
long StartSP;
long CurrentSSP;
long StartSSP;
long temp;
} des1;
При импорте ddd1 в ассемблерную подпрограмму структура корректно грузится и задает значения Status=1, CurrentTic=2 и NumberTic=3, мне нужно там же в ассемблерной вставке вытащить из структуры в регистр значение, например Status и сравнить с 1. В микропроцессоре C55x это делалось последовательностью команд:

amov #TaskPointer, xar0
mov dbl(*ar0), xar0
mov dbl(*ar0), xar0
mov *ar0, ac0 ; getting Status

TaskPointer:
.long TaskTableStart
TaskTableStart:
.long _ddd1
.long _ddd2
.long _ddd3
.long _ddd4
TaskTableEnd:

Как можно сделать то же самое, но на Cortex-M3?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 1 2014, 06:33
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Omnicake, используйте, пожалуйста, кнопочку когда выкладываете код.
Цитата(Omnicake @ May 1 2014, 06:03) *
В дизассемблере происходят странные вещи:
...
Это реакция на команду:
int32_t array[5]={1,2,3,4,5};
x=array[2];
Я вообще не понимаю логику того, что там происходит и что такое __aeabi_memcpy4.
Абсолютно ничего странного тут не происходит.
Код
        SUB      sp,sp,#0x18     // Сдвинули указатель стека на 24 байта, зарезервировав 20 байт под array и 4 байта под что-то еще
        MOVS     r2,#0x14        // загрузили размер array в R2
        LDR      r1,|L0.24|      // загрузили в R1 адрес {1, 2, 3, 4, 5}
        ADD      r0,sp,#4     // загрузили в R0 адрес array[0]
        BL       __aeabi_memcpy4 // вызвали библиотечную функцию memcpy, скопировали {1, 2, 3, 4, 5} в array
        LDR      r1,|L0.28|      // загрузили в R1 адрес x
        LDR      r0,[sp,#0xc]    // загрузили в R0 содержимое array[2]
        STR      r0,[r1,#0]; x // сохранили R0 в х

memcpy - стандартная библиотечная функция.

Цитата(Omnicake @ May 1 2014, 06:03) *
Как можно сделать то же самое, но на Cortex-M3?

Код
        LDR      r1,=ddd1        // загрузили в R1 адрес ddd1
        LDR      r1,[r0,#0]      // загрузили в R0 ddd1.Status (0 - смещение Status относительно начала des)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:44
Рейтинг@Mail.ru


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