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

 
 
> Загрузка адреса метки в регистр для STM32.
Omnicake
сообщение Apr 17 2014, 07:24
Сообщение #1


Участник
*

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



Здравствуйте. Работаю в среде keil uvision 5.0 для процессора stm32f10x и пытаюсь написать простейший диспетчер (scheduler), который бы на основе статуса и текущего тика задачи, завершал её или переключал на другую с сохранением регистров. Сделал структуру дескрипторов под задачи, задал их в отдельном файле, а в асмовском файле организовал метку TaskTablePointer - указатель на начало таблицы дескрипторов, TaskTableStart и TaskTableEnd для начала и конца таблицы дескрипторов. Но потом столкнулся с проблемой: на TMSC55 в регистр можно было загрузить адрес метки (командой mov #TaskPointer, ar0), затем из адреса этой метки путем команды mov dbl(*ar0) ac0 можно извлекать определенные параметры дескриптора. А вот в cortex-m3 с его ассемблером запись mov r0, TaskPointer (и вариации с #) выдает ошибку, пишет что нужна константа. Отсюда два вопроса: есть ли возможность загрузки адреса метки в регистр? А также сразу в догонку: подскажите аналог обозначения dbl(*ar0)? Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
demiurg_spb
сообщение Apr 17 2014, 07:58
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Omnicake @ Apr 17 2014, 11:24) *
В gcc на Си это делается так:
http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
Насчёт keil не могу подсказать - не знаю.
Можно попробовать скомпилировать это в gcc и посмотреть во что он это превратил в смысле асма:
Код
    static int i;
loop1:
    pin_toggle(PIN_LED_OK0);
loop2:
    pin_toggle(PIN_LED_OK1);

    static void *loops[] = {&&loop1, &&loop2};

    goto *loops[i^=1];

CODE
pin_toggle(PIN_LED_OK0);
8001d0c: f44f 4001 mov.w r0, #33024; 0x8100
8001d10: f2c4 2022 movt r0, #16930; 0x4222
8001d14: 6805 ldr r5, [r0, #0]
8001d16: ea6f 0605 mvn.w r6, r5
8001d1a: f248 1380 movw r3, #33152; 0x8180
8001d1e: f2c4 2322 movt r3, #16930; 0x4222
8001d22: 601e str r6, [r3, #0]
loop2:
pin_toggle(PIN_LED_OK1);
8001d24: f248 1704 movw r7, #33028; 0x8104
8001d28: f2c4 2722 movt r7, #16930; 0x4222
8001d2c: 683c ldr r4, [r7, #0]
8001d2e: ea6f 0204 mvn.w r2, r4
8001d32: f248 1184 movw r1, #33156; 0x8184
8001d36: f2c4 2122 movt r1, #16930; 0x4222
8001d3a: 600a str r2, [r1, #0]

static void *loops[] = {&&loop1, &&loop2};

goto *loops[i^=1];
8001d3c: f241 0000 movw r0, #4096; 0x1000
8001d40: f2c2 0000 movt r0, #8192; 0x2000
8001d44: 6805 ldr r5, [r0, #0]
8001d46: f085 0601 eor.w r6, r5, #1
8001d4a: 6006 str r6, [r0, #0]
8001d4c: f246 0300 movw r3, #24576; 0x6000
8001d50: f6c0 0300 movt r3, #2048; 0x800
8001d54: f853 7026 ldr.w r7, [r3, r6, lsl #2]
8001d58: f047 0401 orr.w r4, r7, #1
8001d5c: 4720 bx r4
Не совсем то, что хотелось бы увидеть...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 17 2014, 08:12
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Omnicake @ Apr 17 2014, 10:24) *
А вот в cortex-m3 с его ассемблером запись mov r0, TaskPointer (и вариации с #) выдает ошибку, пишет что нужна константа.

А так?
mov r0,=TaskPointer
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 17 2014, 08:27
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ViKo @ Apr 17 2014, 12:12) *
+1
Посмотрел в startup.S:
Цитата
;This file is part of the uVision/ARM development tools.
...
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Omnicake
сообщение Apr 17 2014, 08:50
Сообщение #5


Участник
*

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



Пробовал LDR R0, =TaskPointer. Ошибок не нашло, но в дизассемблере какими-то хитрыми махинациями с регистрами R1-R7 в R0 записались нули. Не уверен, что это правильно, ведь метка должна иметь ненулевой адрес, или его надо задать вручную сначала?

На mov r0,=TaskPointer выдает ..\..\scheduler.asm(29): error: A1647E: Bad register name symbol, expected Integer register
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 17 2014, 10:03
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Omnicake @ Apr 17 2014, 12:50) *
На mov r0,=TaskPointer выдает ..\..\scheduler.asm(29): error: A1647E: Bad register name symbol, expected Integer register
Ну так вы почитайте описание системы команд...

Зачем вы изобретаете велосипед?
LDR R0, =TaskPointer
делает именно то, что нужно..


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Omnicake
сообщение Apr 18 2014, 01:52
Сообщение #7


Участник
*

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



Спасибо за помощь, заработало.
Go to the top of the page
 
+Quote Post

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

 


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


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