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

 
 
 
Reply to this topicStart new topic
> Возврат из прерывания, и LINK регистр
IXFN50N80Q2
сообщение Sep 29 2012, 14:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Начинаю писать для 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, 14:32
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 29 2012, 14:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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.
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Sep 29 2012, 14:56
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Пасииба. Нашел cool.gif
http://infocenter.arm.com/help/index.jsp?t...a/Babefdjc.html
Тему можно закрывать
Go to the top of the page
 
+Quote Post
SII
сообщение Sep 29 2012, 15:18
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Вот про обработку прерываний для M-профиля: http://ru.osdev.wikia.com/wiki/%D0%9E%D0%B..._%D0%B8_ARMv7-M
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Sep 29 2012, 15:34
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Спасибо. Вышеуказанное русское описание вещь.
А то с The Definitive Guide to the ARM Cortex M3 by Joseph Yiu
не все было до конца прозрачно
Go to the top of the page
 
+Quote Post
SII
сообщение Sep 29 2012, 18:48
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Да и официальный мануал -- то ещё "произведение искусства". Похоже, писавшие его сами толком не понимали, как процессор работает, поэтому кидали куски псевдобыдлокода вместо нормальных описаний...
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Sep 29 2012, 20:14
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Согласен что мануалы "не очень", или мне не везет, или они "не качественные", или я NULL по образованию.
Сам являюсь порождением PIC16,PIC18,AVR, у которого пока не стоит задача резкого перехода на ARM но
хочу соответствовать прогрессу.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 29 2012, 20:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(SII @ Sep 29 2012, 21:48) *
поэтому кидали куски псевдобыдлокода вместо нормальных описаний...

Где там куски кода?
Вы с АВР не путаете?
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Sep 29 2012, 20:41
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



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

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


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

Под аппаратным делением я имею ввиду UINT32/UINT32 как таковой FPU не требуется

Сообщение отредактировал IXFN50N80Q2 - Sep 29 2012, 20:44
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 29 2012, 22:00
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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.

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


Go to the top of the page
 
+Quote Post
SII
сообщение Sep 29 2012, 23:17
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(_Артём_ @ 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 нужной версии - их несколько)


А зачем программисту описание ядра? Ему нужно описание архитектуры -- регистры, система команд, прерывания, защита памяти и т.д. Ну а нюансы реализации архитектуры в конкретной версии ядра нужны крайне редко (разве что список ошибок в железе, которые допустили создатели ядра).
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 30 2012, 04:00
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

У Вас подход неправильный, потому что кроме адреса возврата надо создать свой стек и контекст для каждой задачи. При этом гораздо быстрее подсмотреть реализации переключателя на других осях Ив симуле выяснить все вопросы. А чем Вам нравится именно реалтаймовость?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 30 2012, 06:54
Сообщение #13


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 26th June 2025 - 16:01
Рейтинг@Mail.ru


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