Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Возврат из прерывания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
IXFN50N80Q2
Начинаю писать для STM32, что бы немного приблизиться к пониманию самого ARMа,
хочу написать свой scheduler. Т.е. одну функцию RTOS, которая бы в SysTick
подменяла бы адреса возврата так сказать на разные процедуры.
Немного не получалось, написал вот такой простой исходник(и не могу объяснить значение LR регистра).
Итак. САМ код:

Код
#include <stdint.h>
#define STM32F10X_MD
#include "stm32f10x.h"
#define SYSCLK_FREQ_HSE


unsigned long AAA;

void f1(void)
{
    AAA=1;
}

void f2(void)
{
    AAA=2;
}

void SysTick_Handler(void){
    f1();
    f2();    
}

int main(void)
{
    SysTick_Config(1600);
while(1)
    {

        
    }
}


В дизасме следующее:
Код
   11:         AAA=1;
0x08000388 2001      MOVS     r0,#0x01
0x0800038A 4919      LDR      r1,[pc,#100]; @0x080003F0
0x0800038C 6008      STR      r0,[r1,#0x00]
    12: }
    13:  
    14: void f2(void)
    15: {
0x0800038E 4770      BX       lr
    16:         AAA=2;
0x08000390 2002      MOVS     r0,#0x02
0x08000392 4917      LDR      r1,[pc,#92]; @0x080003F0
0x08000394 6008      STR      r0,[r1,#0x00]
    17: }
    18:  
0x08000396 4770      BX       lr
    19: void SysTick_Handler(void){
0x08000398 B500      PUSH     {lr}
    20:         f1();
0x0800039A F7FFFFF5  BL.W     f1 (0x08000388)
    21:         f2();    
0x0800039E F7FFFFF7  BL.W     f2 (0x08000390)
    22: }
    23:  
    24: int main(void)
    25: {
        ТУТ всякая фигня от SysTickConfig---> Рассматривать ее не будем.

    27: while(1)
0x080003EC BF00      NOP      
0x080003EE E7FE      B        0x080003EE    ---> Волшебный While(1)


Как только случается SysTickHandler я нахожусь
19: void SysTick_Handler(void){
0x08000398 B500 PUSH {lr}--------------------------------------->ВОТ здесь
20: f1();
0x0800039A F7FFFFF5 BL.W f1 (0x08000388)
21: f2();
0x0800039E F7FFFFF7 BL.W f2 (0x08000390)

Но при этом вижу LR=0xFFFFFFF9
Вопрос, почему если точка, с которой я ушел имела адрес
0x080003EE E7FE B 0x080003EE ---> Волшебный While(1)
Откуда может быть такое значение LR ?
По идее, как я понял, в LR сохраняется значение PC (счетчик команд).

И еще хотел бы попросить в теме, если кто знает, глянуть какой нибудь простой "Планировщик" для
ARM. FreeRTOS ломать для понимания не хочется(сильно много лишних для новичка наворотов).
Есть ли GPL проекты по проще ?
_Артём_
Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27) *
Т.е. одну функцию RTOS, которая бы в SysTick
подменяла бы адреса возврата так сказать на разные процедуры.
Немного не получалось, написал вот такой простой исходник(и не могу объяснить значение LR регистра).

Обычно для переключения задачи используют PendSV_Handler.

Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27) *
Но при этом вижу LR=0xFFFFFFF9
Вопрос, почему если точка, с которой я ушел имела адрес
0x080003EE E7FE B 0x080003EE ---> Волшебный While(1)
Откуда может быть такое значение LR ?
По идее, как я понял, в LR сохраняется значение PC (счетчик команд).

Видимо в LR не то что вы ожидаете увидеть (ищите в мануале Exception return и тп)
Цитата
0xFFFFFFF9 Return to Thread mode.
Exception return gets state from MSP.
Execution uses MSP after return.



Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27) *
Есть ли GPL проекты по проще ?

ScmRtos.
IXFN50N80Q2
Пасииба. Нашел cool.gif
http://infocenter.arm.com/help/index.jsp?t...a/Babefdjc.html
Тему можно закрывать
SII
Вот про обработку прерываний для M-профиля: http://ru.osdev.wikia.com/wiki/%D0%9E%D0%B..._%D0%B8_ARMv7-M
IXFN50N80Q2
Спасибо. Вышеуказанное русское описание вещь.
А то с The Definitive Guide to the ARM Cortex M3 by Joseph Yiu
не все было до конца прозрачно
SII
Да и официальный мануал -- то ещё "произведение искусства". Похоже, писавшие его сами толком не понимали, как процессор работает, поэтому кидали куски псевдобыдлокода вместо нормальных описаний...
IXFN50N80Q2
Согласен что мануалы "не очень", или мне не везет, или они "не качественные", или я NULL по образованию.
Сам являюсь порождением PIC16,PIC18,AVR, у которого пока не стоит задача резкого перехода на ARM но
хочу соответствовать прогрессу.
_Артём_
Цитата(SII @ Sep 29 2012, 21:48) *
поэтому кидали куски псевдобыдлокода вместо нормальных описаний...

Где там куски кода?
Вы с АВР не путаете?
IXFN50N80Q2
Думаю что тему не стоит "превращать" в "флейм", и по этому, хотел бы узнать,
какие вы книги рекомендуете почитать по CORTEX M3. Желательно буржуйские,
англоязычные т.к. русские переводы, к сожалению, не совсем точны.

PS: ДЛЯ AVR примеров хватает, у меня есть железо как и с AVR, так и с PIC, так и с
STM32, при пробах все можно узнать. По "быдлокоду", я не решаюсь на ОС для PIC или
AVR.(8 битки они, а нужен FLOAT, аппаратное деление ХАЧУ). Я решаюсь на ARM т.к. мне нужна будет в будущем четкая синхронизация процессов.
Т.е. что бы фактически программа, или процедура(функция) четко отрабатывала по функциям
и я бы управлял процессом, а не RTOS. По этому, мне нужно понимание самой архитектуры.


"Быдлокод" я и так недавно написал, без FreeRTOS, но это не то, хочу "духовной красоты"

Под аппаратным делением я имею ввиду UINT32/UINT32 как таковой FPU не требуется
_Артём_
Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41) *
Желательно буржуйские,
англоязычные т.к. русские переводы, к сожалению, не совсем точны.

Иногда производители прикладывают к документации описание ядра, но для STM32 я его что-то не нахожу. Остаётся читать мануал на сайте АРМ (Cortex™-M3 Technical Reference Manual нужной версии - их несколько).
P.S. Ваша ссылка из Сообщения 3 указывает на Cortex-M0, а не на M3.

Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41) *
По "быдлокоду", я не решаюсь на ОС для PIC или AVR.

Скорости не хватает? При чём тут "быдлокод"?

Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41) *
(8 битки они, а нужен FLOAT, аппаратное деление ХАЧУ)

Float на AVR конечно есть, но медленный.

Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41) *
Т.е. что бы фактически программа, или процедура(функция) четко отрабатывала по функциям
и я бы управлял процессом, а не RTOS.

Как напишете.


SII
Цитата(_Артём_ @ Sep 30 2012, 00:27) *
Где там куски кода?
Вы с АВР не путаете?


Не путаю. Скачиваете с сайта ARM документ "ARMv7-M Architecture Reference Manual" и читаете sm.gif Особенно много их в части B, "System Level Architecture". Да и вся система команд расписана этим быдлокодом, а не нормальными словами (глава A7, "Instruction Details").

Цитата(_Артём_ @ Sep 30 2012, 02:00) *
Иногда производители прикладывают к документации описание ядра, но для STM32 я его что-то не нахожу. Остаётся читать мануал на сайте АРМ (Cortex™-M3 Technical Reference Manual нужной версии - их несколько)


А зачем программисту описание ядра? Ему нужно описание архитектуры -- регистры, система команд, прерывания, защита памяти и т.д. Ну а нюансы реализации архитектуры в конкретной версии ядра нужны крайне редко (разве что список ошибок в железе, которые допустили создатели ядра).
_Pasha
Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27) *
Начинаю писать для STM32, что бы немного приблизиться к пониманию самого ARMа,
хочу написать свой scheduler. Т.е. одну функцию RTOS, которая бы в SysTick
подменяла бы адреса возврата так сказать на разные процедуры.

У Вас подход неправильный, потому что кроме адреса возврата надо создать свой стек и контекст для каждой задачи. При этом гораздо быстрее подсмотреть реализации переключателя на других осях Ив симуле выяснить все вопросы. А чем Вам нравится именно реалтаймовость?
Сергей Борщ
QUOTE (_Артём_ @ Sep 30 2012, 01:00) *
но для STM32 я его что-то не нахожу.

В разделе Design support соответствующего кристалла описания:
PM0215: STM32F0xxx Cortex-M0 programming manual
PM0056: STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual
PM0214: STM32F3xxx and STM32F4xxx Cortex-M4 programming manual
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.