Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка адреса метки в регистр для STM32.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Omnicake
Здравствуйте. Работаю в среде keil uvision 5.0 для процессора stm32f10x и пытаюсь написать простейший диспетчер (scheduler), который бы на основе статуса и текущего тика задачи, завершал её или переключал на другую с сохранением регистров. Сделал структуру дескрипторов под задачи, задал их в отдельном файле, а в асмовском файле организовал метку TaskTablePointer - указатель на начало таблицы дескрипторов, TaskTableStart и TaskTableEnd для начала и конца таблицы дескрипторов. Но потом столкнулся с проблемой: на TMSC55 в регистр можно было загрузить адрес метки (командой mov #TaskPointer, ar0), затем из адреса этой метки путем команды mov dbl(*ar0) ac0 можно извлекать определенные параметры дескриптора. А вот в cortex-m3 с его ассемблером запись mov r0, TaskPointer (и вариации с #) выдает ошибку, пишет что нужна константа. Отсюда два вопроса: есть ли возможность загрузки адреса метки в регистр? А также сразу в догонку: подскажите аналог обозначения dbl(*ar0)? Заранее спасибо.
demiurg_spb
Цитата(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
Не совсем то, что хотелось бы увидеть...
ViKo
Цитата(Omnicake @ Apr 17 2014, 10:24) *
А вот в cortex-m3 с его ассемблером запись mov r0, TaskPointer (и вариации с #) выдает ошибку, пишет что нужна константа.

А так?
mov r0,=TaskPointer
demiurg_spb
Цитата(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
Omnicake
Пробовал LDR R0, =TaskPointer. Ошибок не нашло, но в дизассемблере какими-то хитрыми махинациями с регистрами R1-R7 в R0 записались нули. Не уверен, что это правильно, ведь метка должна иметь ненулевой адрес, или его надо задать вручную сначала?

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

Зачем вы изобретаете велосипед?
LDR R0, =TaskPointer
делает именно то, что нужно..
Omnicake
Спасибо за помощь, заработало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.