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

 
 
> Возврат из прерывания, и 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



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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 23:56
Рейтинг@Mail.ru


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