|
Вопросы по STM32f10x на Keil, Ошибка с PUSH, загрузка массивов, теневые регистры. |
|
|
|
Apr 30 2014, 02:57
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
May 1 2014, 03:03
|
Участник

Группа: Участник
Сообщений: 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?
|
|
|
|
|
May 1 2014, 06:33
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
Omnicake Вопросы по STM32f10x на Keil Apr 30 2014, 02:57 adnega 1. Попробуйте push {r0}. В скобках можно передават... Apr 30 2014, 04:26 Omnicake 1. Да, действительно нужно было регистры брать в ф... Apr 30 2014, 04:52 adnega Цитата(Omnicake @ Apr 30 2014, 08:52) Вот... Apr 30 2014, 06:56 Golikov A. чтобы получить доступ ко 2 элементу массива надо д... Apr 30 2014, 05:50 Omnicake Использование ассемблера обусловлено спецификой пр... Apr 30 2014, 06:48 Golikov A. Вы поставили уровень оптимизации проекта на 0? Изн... May 1 2014, 05:42 Omnicake Нет, стоит нулевой уровень оптимизации. May 1 2014, 06:00 Omnicake Извиняюсь, в дальнейшем не повторится. Спасибо бол... May 1 2014, 06:47 jcxz Цитата(Omnicake @ Apr 30 2014, 08:57) 1) ... May 1 2014, 07:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|